利用串列埠上位機對直流電機進行調速。
這裡選用到的晶元是stm32f407vet6,直流電機為tt馬達,還有l298n驅動板。
我們需要明白,l298n的工作原理是:給定乙個工作電壓,再提供占空比不同的pwm波,就可以產生不同大小的電壓來控制電機的旋轉。所以我們需要讓stm32晶元生成可調占空比的pwm波,而調整占空比的方式就是通過串列埠收發資料來修改。
那麼先進行配置:
下面分別為rcc與sys,還有tim1的配置。
開啟tim1的兩處通道設定為pwm是因為需要控制正反轉。
還需要開啟串列埠一併開啟中斷。
時鐘樹配置則168hz拉滿,這裡就不放圖了。值得注意的是,需要看清自己的晶振大小,cube初始生成25hz的晶振,而實際上很多開發板都只有8hz。
下面進行程式的編譯。
首先為了方便,我們先對printf與scanf進行重定向,具體方式請參考我之前的隨筆。
變數的定義(其中as為pwm波的初始占空比預設):
/* user code begin pv */
uint8_t receive_date;
uint16_t as=60;
int x=1,y=0;
/* user code end pv */
開啟串列埠接收中斷並給初始占空比輸出pwm波:
/* user code begin 2 */
hal_uart_receive_it(&huart1,&receive_date,1);
hal_tim_pwm_start(&htim1,tim_channel_1);
hal_tim_pwm_start(&htim1,tim_channel_2);
/* user code end 2 */
在下方編寫串列埠中斷**部分的程式:
/* user code begin 4 */
void hal_uart_rxcpltcallback(uart_handletypedef *huart)
if(y==1)
}} if(receive_date=='m')
if(y==1)
}} if(receive_date=='s')
if(y==1)
}if(receive_date=='p')
if(receive_date=='k')
}hal_uart_receive_it(&huart1,&receive_date,1);
}/* user code end 4 */
其中「n」為減速,「m」為加速,「s」為啟動,「p」為停止,「k」為反轉。變數x用作標誌位,返回到while中進行反轉程式,而變數y則是為了記住正反轉狀態。
下面是主函式while中的反轉程式:
while (1)
else if(y==1)
x=0;
} }
/* user code end 3 */
反轉前先給半秒鐘的延時,因為突然反轉可能會燒壞驅動板,所以需要乙個停滯,而中斷中切不可延時,所以這也是將反轉程式寫在while的原因。
接下來,連線串列埠,開啟除錯工具,選對波特率,即可輸入上述字元(大寫)來對電機進行控制。
注:這裡寫的內容都十分簡單,主要是為了體現控制邏輯,並非適用於電機與電機驅動板。
直流電機pwm 直流電機的調速方法
直流電機的調速方法 一 概述 一是調節電樞電壓,二是調節勵磁電流,1 常見的微型直流電機,其磁場都是固定的,不可調的永磁體,所以只好調節電樞電壓。調節電樞電壓方法 常用的一是可控矽調壓法,再就是脈寬調變法 pwm pwm的h型屬於調壓調速。pwm的h橋只能實現大功率調速。國內的超大功率調速還要依靠可...
直流電機PID調速
文章寫的是基於數字pid控制器的閉環電機速度控制系統,系統以stc89c51微控制器為控制核心,通過電機驅動l298n 這裡因為所用電機是個小馬達,額定電流和堵轉電流不算大,所以用的是tc1508s做驅動 控制電機轉速,電機轉速控制採用pwm控制。在對電機轉速進行調速的過程同時,微控制器對電機的轉速...
51微控制器 使用PWM對直流電機調速
pwm 脈寬調變 是靠改變脈衝寬度來控制輸出電壓,通過改變週期來控制其輸出頻率。脈衝可以理解為是io口的一次高低電平改變 使用pwm對電極調速時,是靠改變占空比 改變脈衝寬度 來控制輸出電壓的,電壓較小電機轉速就會下降 再通過改變週期 脈衝的週期 來控制其輸出頻率,脈衝頻率對電機的轉速有著決定性作用...