引言
PWM這玩意兒,做調(diào)光、調(diào)速、甚至模擬音頻都離不開。JL杰理AC696N的定時器自帶PWM輸出功能,配置起來不算復(fù)雜,但真要調(diào)出穩(wěn)定的波形,有幾個坑是繞不開的。比如初始化的時候LED會閃一下、占空比設(shè)0反而輸出一個高電平、想換個引腳輸出還得搞清楚通道映射。之前在AC696N開發(fā)板上調(diào)PWM驅(qū)動呼吸燈和電機,把這些小問題都踩了一遍,整理出來方便后面用的時候直接抄。
PWM常用于控制燈光亮度、電機速度等。JL杰理AC696N芯片的定時器支持靈活的PWM輸出。
PWM的核心參數(shù)是頻率和占空比。

如圖,高電平的時間(1ms) + 低電平的時間(3ms) = 4ms(一個周期)
頻率 = 1s / 4ms = 250HZ
高電平時間 / 一個周期時間 = 1ms / 4ms = 25%(占空比)
使用timer_pwm_init函數(shù)可以初始化指定定時器產(chǎn)生PWM。需要傳入定時器(如JL_TIMER3)、頻率(Hz)、初始占空比(0-10000對應(yīng)0-100%)和輸出引腳。
每個定時器有對應(yīng)的硬件引腳,也可通過通道映射(如CH2_T3_PWM_OUT)輸出到其他引腳,但需注意避免IO沖突和定時器被系統(tǒng)占用(如TIMER1、TIMER2)。
常見問題包括:
初始化時LED閃爍,可通過先設(shè)置周期和占空比再開啟計數(shù)模式解決;

占空比設(shè)為0時可能出現(xiàn)一個周期的高電平,需調(diào)整寄存器操作順序;
void set_timer_pwm_duty(JL_TIMER_TypeDef *JL_TIMERx, u32 duty) { if(duty == 0){ if(JL_TIMERx->PWM == 0){ return; } //計時標(biāo)志,進來此函數(shù)前PB3已經(jīng)設(shè)置為高電平,PB3部分控制可省略 JL_PORTB->OUT &= ~BIT(3); /*周期內(nèi)低電平時期進入此函數(shù),強制延長半個到一個周期等下一個周期下降沿再觸發(fā), 防止一個周期最后1us左右時間觸發(fā)此函數(shù)導(dǎo)致的程序執(zhí)行時間不夠?qū)е聵O短時間的高電平*/ if(JL_TIMERx->CNT > JL_TIMERx->PWM){ while(JL_TIMERx->CNT > JL_TIMERx->PWM){ delay(1); } while(JL_TIMERx->CNT < JL_TIMERx-?>PWM){ delay(1); } } //周期內(nèi)高電平時間進入此函數(shù),等周期內(nèi)低電平時間觸發(fā) while(JL_TIMERx->CNT < JL_TIMERx-?>PWM){ delay(1); } //關(guān)閉PWM波形 JL_TIMERx->CON &= ~BIT(8); //時間標(biāo)志 JL_PORTB->OUT |= BIT(3); } else{ //開啟PWM JL_TIMERx->CON |= BIT(8); } JL_TIMERx->PWM = (JL_TIMERx->PRD * duty) / 10000; //0~10000對應(yīng)0~100% //時間標(biāo)志 JL_PORTB->OUT &= ~BIT(3); } void timer_pwm_test(void) { //PB3為了計時設(shè)置,可以去掉 gpio_set_pull_down(IO_PORTB_03,0); gpio_set_pull_up(IO_PORTB_03,0); gpio_set_direction(IO_PORTB_03,0); timer_pwm_init(JL_TIMER3, 100000, 2000, IO_PORTB_05, 0); } //測試按鍵消息 case KEY_SET_PWM: log_info("KEY_SET_PWMn"); static int pwm_flag = 0; JL_PORTB->OUT |= BIT(3); if(pwm_flag){ set_timer_pwm_duty(JL_TIMER3,0); pwm_flag = 0; } else{ set_timer_pwm_duty(JL_TIMER3,5000); pwm_flag = 1; } break;
問題波形1(占空比變?yōu)?時1周期的高電平):

問題波形2(周期末尾操作寄存器執(zhí)行時間不夠?qū)е虏ㄐ雾樠拥较轮芷诓艌?zhí)行):

以及操作寄存器時機不當(dāng)導(dǎo)致波形順延。
理解時鐘源選擇(系統(tǒng)時鐘或晶振時鐘)對產(chǎn)生高頻率PWM也至關(guān)重要。
總結(jié)
PWM配置看著簡單,但細(xì)節(jié)決定成敗。
定時器別跟系統(tǒng)沖突,TIMER1和TIMER2通常被系統(tǒng)占用,建議用TIMER3及以后的。
初始化順序很重要,先配周期和占空比,再開計數(shù),不然會看到一個意外的脈沖。占空比從0到10000對應(yīng)0%到100%,想設(shè)50%就寫5000。
如果需要高頻率輸出(比如幾十kHz以上),時鐘源選系統(tǒng)時鐘,別選晶振時鐘,頻率上限更高。
建議在AC696N開發(fā)板上先用示波器把基礎(chǔ)波形抓出來,確認(rèn)頻率和占空比都對得上,再往實際應(yīng)用里套,省得后面調(diào)半天分不清是代碼問題還是硬件問題。
審核編輯 黃宇
-
PWM
+關(guān)注
關(guān)注
116文章
5884瀏覽量
226306 -
開發(fā)板
+關(guān)注
關(guān)注
26文章
6362瀏覽量
119907
發(fā)布評論請先 登錄
JL杰理AC696N開發(fā)板PWM波形生成與控制(2):問題排查
JL杰理AC696N開發(fā)板做存儲設(shè)備適配(1):SD/TF卡與MMC卡的基礎(chǔ)配置與兼容
JL杰理AC696N系列開發(fā)GPIO控制大全:模式、API與特殊引腳
JL杰理AC696N系列芯片SPI接口實戰(zhàn):驅(qū)動Flash、LCD與RGB燈
JL杰理AC696N開發(fā)板引腳速查:AC6966B開發(fā)板關(guān)鍵接口連接圖
JL杰理AC696N系列芯片開發(fā)UART串口應(yīng)用寶典:打印、調(diào)音與通信Demo
JL杰理AC696N開發(fā)之定時器系統(tǒng)全解析:sys_timer與usr_timer的應(yīng)用
JL杰理AC696N開發(fā)板使用教程-低功耗基礎(chǔ):AC6966B芯片的復(fù)位與喚醒源配置
JL杰理AC696N系列芯片開發(fā)經(jīng)驗:芯片復(fù)位與喚醒源深度解析
AC6966B開發(fā)板開發(fā)準(zhǔn)備-環(huán)境搭建:Windows下JL杰理AC696N開發(fā)環(huán)境配置
JL杰理AC696N開發(fā)板PWM波形生成與控制(1):頻率、占空比
評論