(1)
/**************************************** 定时器控制 *******************************************/
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) //回调函数
{
if(htim==&htim6) //10ms
{
/*读编码值*/
Read_Encoder_control();
//这个使用的就是 void set_pid(pid_ *pid, float p, float i, float d)这个函数,在pid.c里面
set_pid(&F_Right_wheel,8.5,0,0);
set_pid(&F_Left_wheel,8,0,0.1);
set_pid(&B_Right_wheel,8.4,0,0);
set_pid(&B_Left_wheel,8,0,0.2);
aim_speed=70;
F_Left_wheel.target = aim_speed;
F_Right_wheel.target = aim_speed;
B_Left_wheel.target = aim_speed;
B_Right_wheel.target = aim_speed;
Speed_closeloop();
Set_PWM(F_L_pid_out,F_R_pid_out,B_L_pid_out,B_R_pid_out);
}
}
这个就是把调PID的函数先放在中断里面简单试验一下
1.1
这个函数的作用就是读取四个轮子的编码值,四个轮子的速度,四个轮子的转速,然后在OLED里面通过while循环的函数就可以显示出来需要测试的值
1.2
这些函数就是设置PID的P、I、D,具体的调PID的值就是在这个函数里面调的
1.3
上面的PID的值写完了之后怎么来让他实际运行出来呢?这时候就需要压入速度环进行计算
首先这个得到编码值 F_Left_Encoder=0;这个语句就是在motor .c(编码器的函数)里面进行的一个编码器的读值,通过底层读出编码器的值
然后我们详细看看增量式PID的计算是怎么工作的
void i_pid(选用一个指定的轮子,传入测试的编码器实际值)
里面的实际值,就是传入的测出来的编码值,目标值就是写的aim_speed
下面的这个限幅,实际上是在这个增量式pid里面进行的限幅
再下面的这个增量式PID的计算,就是把它压入PID的底层函数进行运算,压入的值就是读出来的编码器的值。