金牌会员
 
- 积分
- 1450
- 金钱
- 1450
- 注册时间
- 2016-9-22
- 在线时间
- 31 小时
|
发表于 2017-10-17 20:21:09
|
显示全部楼层
这程序,不难吧。
MPU6050很长时间之前玩的了。有些也忘了
该说的都在程序里注释好了
[mw_shl_code=c,true]这里的注释说的很明白。
这是一个外部中断处理函数(PA12,初始化在exti.c中)
【我认为的,其实是MUPU6050已经设置好了,每隔5ms他的INT引脚会变低,而MPU6050的INT引脚应该接在了STM32的PA12上,
当他5ms拉低时,stm32就会产生外部中断,就会运行下面的程序】
/**************************************************************************
函数功能:所有的控制代码都在这里面
5ms定时中断由MPU6050的INT引脚触发
严格保证采样和数据处理的时间同步
**************************************************************************/
int EXTI15_10_IRQHandler(void)
{
//当MPU6050每隔5ms INT拉低,就会进入外部中断,这里对INT再次看他是不是0
if(INT==0)
{
EXTI->PR=1<<12;
//通过Flag_Target的值的变化,来控制下面的if的执行。
//假设Flag_Target为1,当5ms INT为低时,运行这段代码Flag_Target为0,那么之后的if语句中的也就不执行。
//当5ms INT再次为低时,运行这段代码Flag_Target为1,执行if语句中的
//所以if语句中的是10ms运行一次
Flag_Target=!Flag_Target;
if(Flag_Target==1)
{
Get_Angle(Way_Angle);
return 0;
}
//这下面的语句每次进入中断,都会执行,所以是5ms执行一次
Encoder_Left=Read_Encoder(2);
Encoder_Right=Read_Encoder(4);
Get_Angle(Way_Angle);
Led_Flash(100);
Balance_Pwm =balance(Angle_Balance,Gyro_Balance);
Velocity_Pwm=velocity(Encoder_Left,Encoder_Right);
Moto1=Balance_Pwm-Velocity_Pwm-Turn_Pwm;
Moto2=Balance_Pwm-Velocity_Pwm+Turn_Pwm;
Xianfu_Pwm();
Set_Pwm(Moto1,Moto2);
}
return 0;
} [/mw_shl_code] |
|