(剛開始嘗試寫部落格,如有錯誤或者不足之處歡迎指正)
我用的是通用定時器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...