stm32控制電機

2021-09-06 12:42:39 字數 2500 閱讀 7934

使用埠gpioa來連線電機,所以給gpioa程式設計就可以控制電機。使用系統時鐘systick來週期性的給電機傳送脈衝。用四個按鈕來控制需要傳送脈衝的個數,每個按鈕被按下就設定給電機傳送脈衝的個數,如果上一次給電機傳送的脈衝沒有傳送完成,這次按鈕傳送的脈衝將不被響應。

由於需要控制兩個電機,所以將gpioa埠的1,2,3號引腳與電機0相連(分別控制電機的使能,旋轉方向和脈衝),gpioa的4,5,6號引腳與電機1相連。具體對埠的初始化**為:

gpio_inittypedef gpio_initstruct;  

//開啟電機0外設時鐘

dj_enableperiphclock_0();

//初始化電機0

gpio_initstruct.gpio_pin = dj_en_0 | dj_dr_0 |dj_mc_0;

gpio_initstruct.gpio_speed =gpio_speed_50mhz;

gpio_initstruct.gpio_mode =gpio_mode_out_pp;

gpio_init(dj_gpio_0, &gpio_initstruct);

//設定電機0的初始化狀態

dj_disenable(dj_gpio_0, dj_en_0); //

關閉電機0

上面的**是對與電機0連線的引腳的初始化,電機1的初始化是一樣的,只是引腳不同了。從上面的**可以看到引腳的輸出模式是推挽的(為了做debug),實際應該使用開漏的,由於我們要給電機輸入5v的高電平,所以我們應該在外部接乙個上拉電阻,電源為5v。

systick是乙個系統定時器,系統的滴答是可以配置的,在控制電機的程式中我們將系統滴答設定為100us,理論上可以將系統滴答設定為1/72000000s,由於系統的時鐘為72mhz。每個脈衝間隔為5個滴答。也就是說每隔500us傳送乙個脈衝,脈衝週期為1ms。

設定系統滴答通過巨集:

#define tick 10000  //100us乙個滴答

實際的配置是通過下面**:

systick_config(systemcoreclock / tick);

為了實現每隔5個系統滴答傳送乙個脈衝,定義了兩個全域性變數timingdelay和timingload 

,可以通過函式timer來設定這個變數的值:

void

timer(__io uint32_t ntime)

timingdelay表示當前距離傳送下乙個脈衝還需要等待的滴答數,timingload 表示傳送脈衝的間隔,如果每個脈衝間隔為5個滴答,則timingload =5

。這樣在系統時鐘的每次中斷**中將timingdelay減1,當timingdelay為0時就向電機傳送脈衝(將對應電機脈衝的引腳的值變反就可以了),然後重新將timingload賦值給timingdelay來準備下乙個脈衝的傳送。具體**如下:

if

(timingdelay)

timingdelay--;

else

else

systick_shutdown();

//關閉系統時鐘

}

dj_getmc函式和dj_desmc函式分別獲得全域性變數dj_mccount的值和對該全域性變數減1,這個全域性變數代表總共需要傳送幾個脈衝。正如開頭說的,按下乙個鍵就設定需要傳送的脈衝數,當脈衝發完了,就關閉系統定時器。

使用arm板自帶的wakeup,tamper,user1,user2四個鍵來配置需要傳送脈衝的個數,它們分別配置為需要傳送2,20,200,2000個脈衝。我們通過中斷的方式來檢查哪個鍵被按下了。配置將四個按鍵與exti相連,讓exti產生中斷到中斷控制器nvic。首先需要配置nvic的搶占優先順序和響應優先順序,直接呼叫庫函式就可以了:

nvic_prioritygroupconfig(nvic_prioritygroup_1);

然後是配置按鍵與exti相連,具體配置**如下:

static

void

nvic_setvector( irqn_type irqn, uint8_t preemptionpriority, uint8_t subpriority)

//wakeup鍵

static

void exti_pa0_config(void

)

上面的**顯示了配置wakeup鍵,其它鍵也是同樣的配置。當按下乙個鍵時,對應的中斷響應函式就會執行,我們在響應函式中判斷全域性變數dj_mccount是否為0,如果不為0,說明上一次按鍵的脈衝還沒有發生完成,則直接退出中斷響應函式;如果為0,說明當前沒有在發生脈衝,則設定dj_mccount為2,開啟系統定時器來傳送脈衝。**如下:

//

wakeup

void exti0_irqhandler(void

) exti_clearflag(exti_line0);

//清除中斷標誌位

}}

源**:

STM32 電機PWM控制

2.1.1 實現工具 stm32微控制器 直流減速電機 tb6612雙路電機驅動器 keil5 2.1.2 電機實物接線 具體到我們的電機,我們可以看看電機後面的 中間的四根線 紅綠白黑 是編碼器的線,只是用於測速,和直流電機本身沒有聯絡。綜上所述,我們只需控制施加在黃線和棕色線兩端的直流電壓大小和...

stm32步進電機控制策略

1.中斷 計數 2.主從定時器方式。主定時器用來傳送脈衝控制速度,從定時器的自動過載暫存器為該次該次執行脈衝個數限制值用來控制電機轉動角度。從定時器的時鐘源為主定時器產生中斷的時鐘,也就是說主定時器溢位一次,從定時器計數值加一,從定時器中斷後手動關閉主定時器。3.dma pwm。dma傳輸的資料中最...

STM32伺服電機PWM

這篇文章是關於在stm32 stm32f103c 微控制器中使用pwm 脈衝寬度調製 的詳細教程。脈寬調變 pwm 用於控制數碼訊號的幅度,以控制需要電源的裝置和應用。這是有關pwm生成的高階教程。我們將學習如何使用stm32系列 stm32f103c 微控制器生成可變pwm訊號。可變pwm訊號用於...