小車電池被拆了沒法調試,有錯請指正!
待修好再上傳更完善的,求大佬點評指正!
單片機源程序如下:
- #include "contral.h"
- #include "stm32f10x.h"
- #include "motor.h"
- int Target_velocity=50; //設定速度控制的目標速度為50個脈沖每10ms
- /**************************************************************************
- 函數功能:TIM3中斷
- 入口參數:無
- 返回 值:無
- **************************************************************************/
- void TIM3_IRQHandler(void)
- {
- static int time=0;
- time ++;
- if(time==10)
- {
- if (TIM_GetITStatus(TIM3, TIM_IT_Update)!= RESET) //檢查指定的TIM中斷發生與否:TIM 中斷源
- {
- Encoder=transfer(encoder);
- Led_Flash(100); //LED閃爍;指示單片機正常運行
-
- Moto=Incremental_PI(Encoder,Target_velocity); //===速度PI控制器
- Xianfu_Pwm(); //===PWM限幅
- Set_Pwm(Moto);
-
- TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIMx的中斷待處理位:TIM 中斷源
- }
- time=0;
- }
- }
- /**************************************************************************
- 函數功能:增量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) //Target是目標值
- {
- float Kp=20,Ki=30;
- static int Bias,Pwm,Last_bias;
- Bias=Encoder-Target; //計算偏差
- Pwm+=Kp*(Bias-Last_bias)+Ki*Bias; //增量式PI控制器
- Last_bias=Bias; //保存上一次偏差
- return Pwm; //增量輸出
- }
- /**************************************************************************
- 函數功能:限制PWM賦值
- 入口參數:無
- 返回 值:無
- **************************************************************************/
- void Xianfu_Pwm(void)
- {
- int Amplitude=7100; /*PWM滿幅是7200 限制在7100*/
- if(Moto<-Amplitude) Moto=-Amplitude;
- if(Moto>Amplitude) Moto=Amplitude;
- }
- /**************************************************************************
- 函數功能:絕對值函數
- 入口參數:int
- 返回 值:unsigned int
- **************************************************************************/
- int myabs(int a)
- {
- int temp;
- if(a<0) temp=-a;
- else temp=a;
- return temp;
- }
- /**************************************************************************
- 函數功能:賦值給PWM寄存器
- 入口參數:PWM
- 返回 值:無
- **************************************************************************/
- void Set_Pwm(int moto)
- {
- if(moto>0) AIN2=1, AIN1=0;
- else AIN2=0, AIN1=1;
- PWM1=myabs(moto);
- }
復制代碼
所有資料51hei提供下載:
小車.rar
(406.8 KB, 下載次數: 54)
2018-6-12 02:47 上傳
點擊文件名下載附件
編碼器的1部分 下載積分: 黑幣 -5
|