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...