#include "control.h"
/**************************************************************************
作者:平衡小車之家
我的淘寶小店:shop114407458。taobao。com
**************************************************************************/
int Target_velocity=50; //設定速度控制的目標速度為50個脈沖每10ms
int TIM1_UP_IRQHandler(void)
{
if(TIM1->SR&0X0001)//5ms定時中斷
{
TIM1->SR&=~(1<<0); //===清除定時器1中斷標志位
Encoder=Read_Encoder(2); //===讀取編碼器的值,M法測速,輸出為每10ms的脈沖數
Led_Flash(100); //===LED閃爍;指示單片機正常運行
Xianfu_Pwm(); //===PWM限幅
Moto1=Incremental_PI(Encoder,Target_velocity); //===速度PI控制器
Set_Pwm(Moto1); //===賦值給PWM寄存器
}
return 0;
}
/**************************************************************************
函數功能:賦值給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 限制在7100
if(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;
}
/**************************************************************************
函數功能:增量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=100,Ki=100;
static int Bias,Pwm,Last_bias;
Bias=Encoder-Target; //計算偏差
Pwm+=Kp*(Bias-Last_bias)+Ki*Bias; //增量式PI控制器
Last_bias=Bias; //保存上一次偏差
return Pwm; //增量輸出
}
|