STM32——直流电机PI调速
所需元件
??STM32F103開發板、L298N一個、帶編碼器的直流電機一個(如下圖所示,淘寶上有很多)
系統框圖
??通過系統框圖,我們需要做兩件事,一是要測速,二是要調節。測速目前流行的就是通過編碼器測速,調節器我采用的時PI調節,PI調節器調節的參數少,而且能夠消除靜差,當然用PID調節器也行。
編碼器
??編碼器的結構簡化如下圖:
??在電機轉軸上安裝了一個磁環,在磁環的下方有一個霍爾傳感器,在磁環轉動過程中就在霍爾傳感器的附近產生了變化的磁場,于是霍爾傳感器就輸出了脈沖信號。我所用的這個直流電機是1:48的減速電機,電機轉軸每轉動1圈,編碼器輸出13個脈沖信號,也就是說輸出轉軸轉動1圈,編碼器輸出13x48=624個脈沖,再通過STM32編碼器接口 4 倍頻就是 624x4=2496 個脈沖信號,通過STM32定時器的計數值除以2496就是輸出轉軸轉動的圈數。
??所謂4倍頻,如下圖:
??編碼器中有兩個線路,即A相和B相。我們以A相或B相為例,1個上升沿或者下降沿代表1個脈沖信號,由圖中可知有2個上升沿或2個下降沿,即2個脈沖信號。而所謂的4倍頻,就是把A、B相的上升沿和下降沿都加起來,一共8個,與之前的2個脈沖信號就是4倍,而所以要加起來做成4倍頻,可以提高測量轉速的精度。另外A、B相之間相差90度,從而可以判斷電機的轉向。如果電機正轉,A相比B相先90度,也就是說A相已經上升沿了B還是低電平。
PI調節器
??關于PID算法,可參考STM32——PID恒溫控制
??這里貼兩張速度曲線圖:
??1、
??2、
??圖1中設定目標值為400,從圖上可以看出超調量還是比較小的,調節時間也比較短,調節的效果還是可以的。圖2中,目標值每隔一段時間增加100,加到400后又設為100,整體的調節效果還是蠻不錯的。(我程序中的PID參數套用的時候可能達不到圖中的效果,這與電機以及編碼器之間的差別有關,可適當在做調節)
主要程序
TIM_Encoder.c
PID.c
#include "PID.h"PID pid; //int time=0;void PID_Init() { pid.Sv=400; //用戶設定轉速400pid.Kp=0.3; //比例pid.Ki=0.015; //積分pid.Kd=0; //微分pid.pwmcycle=100; //pwm周期100uspid.T=30; //PID計算周期30mspid.OUT0=0;pid.C1ms=0;pid.SEk=0;pid.Ek=0;pid.Ek_1=0;pid.DelEk=0;pid.Dout=0;pid.Iout=0;pid.Pout=0; }void PID_Calc(float data) //pid計算 {float out;pid.Pv=data;pid.Ek=pid.Sv-pid.Pv; //得到當前的偏差值pid.Pout=pid.Kp*pid.Ek; //比例輸出pid.SEk+=pid.Ek; //歷史偏差總和if(pid.SEk<(-50)){pid.SEk=(-50);}pid.DelEk=pid.Ek-pid.Ek_1; //最近兩次偏差之差pid.Iout=pid.Ki*pid.SEk; //積分輸出if(pid.Iout<(-10)){pid.Iout=(-10);}pid.Dout=pid.Kd*pid.DelEk; //微分輸出out= pid.Pout+ pid.Iout+ pid.Dout;if(out>pid.pwmcycle){pid.OUT=pid.pwmcycle;}else if(out<=0){pid.OUT=pid.OUT0; }else {pid.OUT=out+0.5f; //四舍五入}pid.Ek_1=pid.Ek; //更新偏差pid.C1ms=0; }工程鏈接
鏈接:https://pan.baidu.com/s/1dSXgPf0gzSvTdjlMHyOZ7w
提取碼:f8h1
??PID調參比較麻煩,這里推薦一個ST官方的軟件StmStdio,這個軟件網上有很多教程,使用也比較簡單。
鏈接:https://pan.baidu.com/s/1etsrBL80rCe_LouNEE1XEg
提取碼:ckve
總結
以上是生活随笔為你收集整理的STM32——直流电机PI调速的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【faster rcnn 实现via的自
- 下一篇: ubuntu20.04使用终端命令安装谷