|
楼主 |
发表于 2015-6-10 22:59:26
|
显示全部楼层
[pre lang="c" line="1"]void main(void)
{
InitCLK(); //设置系统时钟源
InitUart(); //串口初始化
MPU6050_Initialize();
InitT1(); //设置T1相应的寄存器
InitInterrupt();
ENGB_forward; //橘色灯亮
while(1)
{
}
}
//定时器T1中断处理函数
#pragma vector = T1_VECTOR
__interrupt void T1_ISR(void)
{
EA = 0;
MPU6050_GetRawAccelGyro(&ax, &ay, &az, &gx, &gy, &gz);
gx_a = gx/65.5;
gy_a = gy/65.5;
gz_a = gz/65.5;
ax_g = ax/8192.0;
ay_g = ay/8192.0;
az_g = az/8192.0;
IMUupdate(gx_a*0.0174533,gy_a*0.0174533,gz_a*0.0174533,ax_g,ay_g,az_g);//0.174533为PI/180 目的是将角度转弧度
PID_angle(); //角度算PID
Change_duty(PWM_angle,0);
EA = 1;
}
/****************************************************************************
* PID_angle
****************************************************************************/
void PID_angle()//位置式
{
error_0 = Pitch - angle_base;
if(error_0 < 0)
{
ENGB_forward;
i_a_p = 0;
i_a_n += error_0; if(i_a_n > intergral_limit_H){i_a_n = intergral_limit_H;}
p_a = error_0;
d_a = gy_a;
PWM_angle = (int)(p_a*Kp_a + (i_a_n+i_a_p)*Ki_a + d_a*Kd_a) - PWM_limit_L;
}
else if(error_0 > 0)
{
ENGB_backward;
i_a_n = 0;
i_a_p += error_0; if(i_a_p > intergral_limit_H){i_a_p = intergral_limit_H;}
p_a = error_0;
d_a = gy_a;
PWM_angle = (int)(p_a*Kp_a + (i_a_n+i_a_p)*Ki_a + d_a*Kd_a) + PWM_limit_L;
}
error_1 = error_0;
}
[/code] |
|