STM32一定時器產生不同頻率的PWM

2021-07-23 11:52:05 字數 2583 閱讀 3213

... f%ef%bc%81#/details

平時記性實在太差,除錯完的程式,過兩天又忘了,往往需要一陣子才能想起來,有時以前的資料找不到了,更是惱火,不得不重複到網上搜尋。剛剛除錯成功了乙個型別的程式,立刻記下來,呵呵,不要又忘記了。

stm32產生pwm是非常的方便的,要需要簡單的設定定時器,即刻產生!當然,簡單的設定對於新手來產,也是麻煩的,主要包括:

(1)使能定時器時鐘:rcc_apb1periphclockcmd(rcc_apb1periph_tim3, enable);

(2)定義相應的gpio:

gpio_initstructure.gpio_pin = gpio_pin_2|gpio_pin_3|gpio_pin_4|gpio_pin_5|gpio_pin_6;

gpio_initstructure.gpio_mode = gpio_mode_ipu; //下拉接地,檢測輸入的高電平

gpio_initstructure.gpio_speed = gpio_speed_50mhz; //50m時鐘速度

gpio_init(gpioa, &gpio_initstructure);

gpio_initstructure.gpio_pin = gpio_pin_7;

gpio_initstructure.gpio_mode = gpio_mode_af_pp; 

gpio_initstructure.gpio_speed = gpio_speed_50mhz; //50m時鐘速度

gpio_init(gpioa, &gpio_initstructure);

(3)如果是產生pwm(頻率不變,占空比可變),記得開啟pwm控制,在tim_configuration()中。

tim_cmd(tim3,enable);

tim_ctrlpwmoutputs(tim1,enable);

利用定時器產生不同頻率的pwm

有時候,需要產生不同頻率的pwm,這個時候,設定與產生相同pwm的程式,有關鍵的不一樣。

(一) 設定的原理

利用改變定時器輸出比較通道的捕獲值,當輸出通道捕獲值產生中斷時,在中斷中將捕獲值改變,這時, 輸出的i/o會產生乙個電平翻轉,利用這種辦法,實現不同頻率的pwm輸出。

(二)關鍵設定

在定時器設定中:tim_oc2preloadconfig(tim3, tim_ocpreload_disable);

在中斷函式中: if (tim_getitstatus(tim3, tim_it_cc2) != reset)

乙個定時器四個通道,分別產生不同頻率(這個例子網上也有)

vu16 ccr1_val = 32768;

vu16 ccr2_val = 16384;

vu16 ccr3_val = 8192;

vu16 ccr4_val = 4096;

void tim_configuration(void)

void gpio_configuration(void)

void nvic_configuration(void)

u16 capture = 0;

extern vu16 ccr1_val;

extern vu16 ccr2_val;

extern vu16 ccr3_val;

extern vu16 ccr4_val;

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)

}乙個定時器乙個通道,產生不同頻率

其它的設定都一樣,就是在主函式中修改乙個引數,然後在定時器中斷中,根據這個引數,改變頻率。

#include "stm32lib\\stm32f10x.h"

#include "hal.h"

volatile u16 key_value=1000;  //用於儲存按鍵相應的pwm波占空比值

int main(void)

else

else if(get_key_down)  //按鍵後退按下 ,對應2khz

delay_ms(20);      //10ms延時

if(get_key_left)    //按鍵左轉按下,對應3khz

else if(get_key_right) //按鍵右轉按下,對應4khz

delay_ms(20);      //10ms延時

if(get_key_ctrl)    //按鍵控制按下,對應5khz

delay_ms(20);      //10ms延時}}

}extern volatile u16 key_value;

u16 capture=0;

void tim3_irqhandler(void)

}void tim3_configuration(void)

注意:在計算pwm頻率的時候,timx的時鐘都是72mhz,分頻後,因為翻轉兩次才能形成乙個pwm波,因為,pwm的頻率是捕獲改變頻率的1/2。

stm32 高階定時器產生PWM

用stm32的高階定時器tim1和tim8產生pwm,需要注意 1.都有tim1,但只有flash容量大於256k的大容量微控制器才有tim8 2.高階定時器相對於通用定時器,多了tim ctrlpwmoutputs tim8,enable tim1產生四路pwm程式 static void tim...

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,讀取一...