用上位機來對直流電機進行調速(HAL庫)

2022-09-10 15:06:21 字數 2207 閱讀 8071

利用串列埠上位機對直流電機進行調速。

這裡選用到的晶元是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對電極調速時,是靠改變占空比 改變脈衝寬度 來控制輸出電壓的,電壓較小電機轉速就會下降 再通過改變週期 脈衝的週期 來控制其輸出頻率,脈衝頻率對電機的轉速有著決定性作用...