PID的代码理解

(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的底层函数进行运算,压入的值就是读出来的编码器的值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值