stm32定時器輸出4路頻率可調的原理分析

2021-09-14 01:58:03 字數 1786 閱讀 5934

1標題說不清楚,簡單點說就是乙個定時器輸出4路可調節頻率的pwm。

2這個功能能幹嘛?

一般是用於控制多個步進電機。這樣做乙個定時器就可以控制4個電機了。

先上**吧

u16 capture = 0;

vu16 ccr1_val = 32768;

vu16 ccr2_val = 16384;

vu16 ccr3_val = 8192;

vu16 ccr4_val = 4096;

void pwm1_init(u16 arr,u16 psc)

extern "c" void tim2_irqhandler(void)

if (tim_getitstatus(tim2, tim_it_cc2) != reset)

if (tim_getitstatus(tim2, tim_it_cc3) != reset)

if (tim_getitstatus(tim2, tim_it_cc4) != reset)

}

實際測試:

ccr1_val=1000的時候,通道1輸出的是500hz的頻率,這是為什麼?,我如何控制想要的頻率?看完下面你應該有所體會了

ccr1_val = 1000  ->500hz    why?

先看看pwm輸出模式 tim_ocmode_toggle  這個模式的意思是  cnt和ccrx 比較成功後翻轉io

cnt是最大計數值,這裡是65535,分頻72.速度就是1m也就是1us計數一次,ccrx是比較值。

ccr1_val = 1000,就是計數1000次,也就是1ms,

也就是說每1ms翻轉一次io口,這就意味著高電平是1ms,低電平也是1ms,那麼頻率是多少?沒錯就是500hz.

在看看為什麼要用中斷來重置比較值ccrx?

capture = tim_getcapture1(tim2);

tim_setcompare1(tim2, capture + ccr1_val );

先看看capture = tim_getcapture1(tim2);              這裡是獲取當前比較值,也就是獲取ccrx的值

tim_setcompare1(tim2, capture + ccr1_val );    這裡就是設定比較值,也就是設定ccrx的值

可能會疑問為什麼要先獲取前一次的比較值,然後加上現在的比較值?

我們分析一下原理:

我們定時器初始化的時候前面有講到,計數是從0-65535,那麼就是cnt會按0-65535這樣計數。

cnt要和ccrx比較,假設ccrx剛開始等於1000,cnt就從0計數到1000,然後和ccrx比較成功後就翻轉io口了,

如果不做任何改變,cnt會繼續計數1001....一直到65535,在這個階段cnt永遠不會等於ccrx的1000了,

也就意味著io口不會再發生翻轉了。那麼怎麼解決呢?

定時器在比較成功後會發生中斷,我們在中斷裡從新設定了比較值,上一次值加上這一次值。

在上面的例子中也就是ccrx=1000+1000=2000,也就是等cnt到2000時,又可以翻轉io了。

cnt      0...1000        1001...2000          2001...3000

ccrx    1000            1000+1000            2000+1000

這樣不斷的迴圈就可以連續的輸出脈衝頻率了,我們只需要改ccr1_val個值就可以改變這個通道的頻率了。

stm32關定時器 STM32定時器TIM3程式

include led.h include delay.h include key.h include sys.h include usart.h include timer.h stm32開發板實驗8 定時器中斷實驗 int main void delay init 延時函式初始化 nvic co...

stm32定時器頻率取樣的方式

頻率取樣方法通常取樣定時器的計數方法,在stm32中,輸入捕捉模式,pwm輸入模式,都是可以測試外部訊號頻率取樣的。1 輸入捕捉模式需要頻繁的進中斷,這個方式不太好的。如果一定要用,那麼就軟體上處理一下,定期採集,而不是一直採集 2 另一種是使用dma的方式。這個可以100ms開啟一次dma,讀取一...

STM32定時器輸出 捕獲PWM

硬體 德飛萊stm32f407 功能 tim4 ch1 pb6輸出pwm,tim3 ch1 pc6捕獲高電平時間 include timer.h void tim4 pwm init void void tim3 cap init void tim3 ch1定時器獲取 u8 tim3 irq sta...