學習定時器輸出比較模式產生PWM的一些感悟

2021-09-10 05:24:47 字數 2877 閱讀 2544

(剛開始嘗試寫部落格,如有錯誤或者不足之處歡迎指正)

我用的是通用定時器tim3來產生的

輸出比較模式產生pwm與直接配置定時器pwm模式相比有一些優勢,最大的就是同乙個定時器的不同通道可以產生頻率不同的pwm。

個人理解:

其實pwm模式輸出比較模式的乙個特殊情況,即不去改變頻率值,單改變比較值從而改變占空比。

在輸出比較模式中,需要利用中斷,不斷改變比較值,即捕獲/比較暫存器的值

如圖所示,假設我預分頻值取71即72分頻,重裝載值取最大0xffff,則cnt_fre就是0xffff,頻率的1m,在配置時,設定捕獲/比較中斷tim_it_ccx,每當進行一次比較時會進入一次中斷,我們在中斷服務函式裡配置,每次獲取計數器的值capture,當處於上公升沿的位置時,我們把下次的比較值改為capture+duty,處於下降沿的位置時,把下次比較值設定為capture+cnt_fre-duty,實際上在**中只要設定乙個標誌位,每設定一次取反就好了,這樣不斷改變比較值我們就能產生我們想要的頻率占空比的pwm波了。

附上自己配的**:

**中為了程式易讀性改了取名

/*********êä³ö±è½ïpwm

/ u16 ch3_fre; //對應cnt_fre

u8 ch3_duty; //對應duty

u8 ch3_flag=1;

gpio_inittypedef gpio_initstruct;

tim_timebaseinittypedef tim_timebaseinitstruct;

nvic_inittypedef nvic_initstruct;

tim_ocinittypedef tim_ocinitstruct;

rcc_apb1periphclockcmd(rcc_apb1periph_tim3,enable);

rcc_apb2periphclockcmd(rcc_apb2periph_gpiob,enable);

gpio_initstruct.gpio_pin=gpio_pin_0;

gpio_initstruct.gpio_mode=gpio_mode_af_pp; //¸´óãíæíêêä³ö

gpio_initstruct.gpio_speed=gpio_speed_50mhz;

gpio_init(gpiob,&gpio_initstruct);

tim_timebaseinitstruct.tim_clockdivision=0; //²»·öæµ£¬ê±öó·ö¸î

tim_timebaseinitstruct.tim_countermode=tim_countermode_up;

tim_timebaseinitstruct.tim_period=arr; //ô¤×°ôøöµ

tim_timebaseinitstruct.tim_prescaler=(psc-1); //ô¤·öæµ

tim_timebaseinit(tim3,&tim_timebaseinitstruct);

nvic_initstruct.nvic_irqchannel=tim3_irqn; //öð¶ï´óí¨µà£¬ôústm32f10x.höð

nvic_initstruct.nvic_irqchannelcmd=enable;

nvic_initstruct.nvic_irqchannelpreemptionpriority=0;

nvic_initstruct.nvic_irqchannelsubpriority=0;

nvic_init(&nvic_initstruct);

//»»ëãæµâ꣬õ¼¿õ±è¶ôó¦µä¼æêýöµ

ch3_fre=1000000/fre; //fre=72m/72/0xffff, pulse=fre0xffff/ch2_fre

ch3_duty=ch3_freduty/100;

tim_ocinitstruct.tim_ocmode=tim_ocmode_toggle;  //´¥·¢ä£ê½

tim_ocinitstruct.tim_ocpolarity=tim_ocpolarity_low;

tim_ocinitstruct.tim_outputstate=enable;

tim_ocinitstruct.tim_pulse=ch3_fre;

tim_oc3init(tim3,&tim_ocinitstruct);

tim_setcounter(tim3,0); //çå¿õ¼æêýæ÷öµ

tim_setcompare3(tim3,0); //éèöã³õê¼±è½ïöµ£¬¿é¿øöæ³õê¼ïàî»

tim_itconfig(tim3,tim_it_cc2,enable); //ê¹äü´óöð¶ïïâ¾ßìåµäöð¶ïí¨µà

tim_cmd(tim3,enable); //ê¹äü¶¨ê±æ÷

void tim3_irqhandler() //öð¶ï·þîñº¯êý

else

ch3_flag^=1; //óë1òì»ò¼´è¡·´

}//º¯êýöð¸ä±äí¨µà3êä³öæµâêõ¼¿õ±è

void setnew_freduty(u16 newfre,u8 newduty)

{ch3_fre=1000000/newfre; //fre=72m/72/0xffff, pulse=fre0xffff/ch2_fre

ch3_duty=ch3_frenewduty/100;

定時器比較輸出

通道對應的引腳模式要設定成 gpio initstructure.gpio mode gpio mode af pp 因為這個問題弄了三個小時 初始化tim3 設定為輸出比較模式 tim ocinitstructure.tim ocmode tim ocmode pwm2 1 tim ocinits...

STM32學習 定時器(通用定時器)

如圖所示,輸出理解時注意兩種訊號ocxref和ocx,ocx是直接連到埠的訊號,ocxref是輸出控制的輸出訊號。一般在參考手冊中大多數講ocxref。ocx與ocxref可由ccxp控制是否反向,由ccxe控制訊號輸出。比較輸出功能 輸出乙個波形 指示一段給定時間已到。它的原理是通過計數器的值cn...

WIN32學習 定時器訊息

1 定時器訊息 可以在程式中設定定時器,當到達時間間隔時,定時器會向視窗傳送乙個wm timer訊息,定時器的精度為毫秒,但是精準度很低。2 訊息的引數 wparam 定時器id lparam 定時器處理函式的指標 3 定時器的使用步驟 a 建立定時器 uint settimer hwnd hwnd...