1. 程式人生 > >STM32定時器輸出PWM頻率和步進電機控制速度計算

STM32定時器輸出PWM頻率和步進電機控制速度計算

內部 定時 .cn 但是 nbsp 返回 定時器 開發 r12

1、STM32F4系列定時器輸出PWM頻率計算

第一步,了解定時器的時鐘多少:

 技術分享

我們知道AHP總線是168Mhz的頻率,而APB1和APB2都是掛在AHP總線上的。

(1)高級定時器timer1, timer8以及通用定時器timer9, timer10, timer11的時鐘來源是APB2總線
(2)通用定時器timer2~timer5,通用定時器timer12~timer14以及基本定時器timer6,timer7的時鐘來源是APB1總線

從STM32F4的內部時鐘樹可知:

當APB1和APB2分頻數為1的時候,TIM1、TIM8~TIM11的時鐘為APB2的時鐘,TIM2~TIM7、TIM12~TIM14的時鐘為APB1的時鐘;

而如果APB1和APB2分頻數不為1,那麽TIM1、TIM8~TIM11的時鐘為APB2的時鐘的兩倍,TIM2~TIM7、TIM12~TIM14的時鐘為APB1的時鐘的兩倍。

因為系統初始化SystemInit函數裏初始化APB1總線時鐘為4分頻即42M,APB2總線時鐘為2分頻即84M,所以TIM1、TIM8~TIM11的時鐘為APB2時鐘的兩倍即168M,TIM2~TIM7、TIM12~TIM14的時鐘為APB1的時鐘的兩倍即84M。

知道定時器的時鐘源頻率我們用定時器做延時就很方便了,只要設定合適的分頻系數即可,附一下用中斷實現延時的公式:(摘自原子的STM32F4開發指南)
Tout = ((arr+1)*(psc+1))/Tclk;
公式中psc就是分頻系數,arr就是計數值,達到這個計數就會發生溢出中斷,Tclk就是我上述分析的時鐘源頻率的倒數。

通過上面的公式我們就可以輕松計算出對應的定時器頻率:但是這裏我們需要將分頻系數固定一個合適的值。設置成多大合適了,這裏我們就要來分析一下我們控制系統的中步進電機的細分步距角和減速比了。

已經知道我們電機參數如下:步距角 = 1.8° 細分=16 減速比= 2mm

一圈360°需要的脈沖數 = 360/1.8*16 = 3200 pulse

又因為電機轉一圈,對應的距離是2mm, 所以 電機帶動輪子走1mm = 3200pulse / 2 = 1600pluse

#define MM_TO_PLUSE 1600//1mm對應的脈沖數

#define PLUSE_TO_MM (1/1600)//一個脈沖對應的距離

#define DIS_MM_TO_PLUSE(dis) ( MM_TO_PLUSE * (dis) ) //將以mm為單位的長度抓換成對應的脈沖數

#define SPEED_TO_PLUSE(speed) ( (speed) *MM_TO_PLUSE ) //將mm/s的速度轉換成HZ

到此為止,電機之間脈沖和距離之間的關系已經搞明白了,那我們開始言歸正傳,如何計算出我們需要的定時器頻率輸出了?

假設我們系統需要達到30mm/s的速度而且我們用的是timer2,調用宏計算 30mm/s * 1600 = 48000HZ的頻率 = 48KHZ。意思就是說們只要定時器輸出的PWM能夠滿足48KHZ的頻率就可以了。

將上面的公式換算成 輸出頻率 = 定時器的時鐘頻率(註意是時鐘頻率不是輸出頻率)/(分頻系數 + 1)/( 計數值+1)

將psc = 0;分頻系數為1 ,內部自動加1 ,帶入上面的公式就可以計算出計數值 = 1000。就可以輸出對應的速度了。

#define TIMER_CLK (48000000/1) //48Mhz 不分頻

#define CALC_ARR(speed) (TIMER_CLK /(speed)*MM_TO_PLUSE )

知道速度值就可以調用CALC_ARR宏返回對應的ARR寄存器值啦,我們就可以根據機器的系統參數來控制了。註意,速度不能高於30000ms/s = 30m/s的速度。因為定時的的最大頻率就是48MHZ

STM32定時器輸出PWM頻率和步進電機控制速度計算