主要过程:
单片机定时器得到脉冲->得到速度->PID算法->得到速度->控制占空比输出PWM->车轮转速
代码:
/**************************增量式PI************************************************函数功能:增量PI控制器入口参数:编码器测量值,目标速度 //这里可能要更改,因为编码器的测量值和速度可能需要转换返回 值:电机PWM根据增量式离散PID公式pwm+=Kp[e(k)-e(k-1)]+Ki*e(k)+Kd[e(k)-2e(k-1)+e(k-2)]e(k)代表本次偏差e(k-1)代表上一次的偏差 以此类推pwm代表增量输出在我们的速度控制闭环系统里面,只使用PI控制pwm+=Kp[e(k)-e(k-1)]+Ki*e(k)**************************************************************************/int Incremental_PI (int Encoder,int Target){float Kp=20,Ki=30; //参数不知道可不可以static int Bias,Pwm,Last_bias; //相关内部变量的定义。Bias=Encoder-Target; //求出速度偏差,由测量值减去目标值。Pwm+=Kp*(Bias-Last_bias)+Ki*Bias; //使用增量 PI 控制器求出电机 PWM。Last_bias=Bias; //保存上一次偏差return Pwm; //增量输出}
主程序:
int main(void){Stm32_Clock_Init(9); //系统时钟设置...MiniBalance_PWM_Init(7199,0); //=====初始化PWM 10KHZ 高频可以防止电机低频时的尖叫声Encoder_Init_TIM2(); //初始化编码器Timer3_Init(99,7199); //=====10MS进一次中断服务函数,中断服务函数在control.cwhile(1);}
其他代码:
/**************************************************************************函数功能:赋值给PWM寄存器入口参数:PWM返回 值:无**************************************************************************/void Set_Pwm(int moto1){if(moto1>0) AIN2=1, AIN1=0;else AIN2=0, AIN1=1;PWMA=myabs(moto1);}
/**************************************************************************函数功能:限制PWM赋值 //限制在多少范围内入口参数:无返回 值:无**************************************************************************/void Xianfu_Pwm(void){int Amplitude=7100; //===PWM满幅是7200 限制在7100if(Moto1<-Amplitude) Moto1=-Amplitude;if(Moto1>Amplitude) Moto1=Amplitude;}/**************************************************************************函数功能:绝对值函数入口参数:int返回 值:unsigned int**************************************************************************/int myabs(int a){int temp;if(a<0) temp=-a;else temp=a;return temp;}
