? PWM是一種對模擬信號電平進(jìn)行????數(shù)字編碼?????的方法。通過高????分辨率????計(jì)數(shù)器的使用,方波的占空比被調(diào)制用來對一個具體????模擬信號????的電平進(jìn)行編碼。PWM信號仍然是數(shù)字的,因?yàn)樵诮o定的任何時刻,滿幅值的直流供電要么完全有(ON),要么完全無(OFF)。電壓或電流源是以一種通(ON)或斷(OFF)的重復(fù)脈沖序列被加到模擬負(fù)載上去的。通的時候即是直流供電被加到負(fù)載上的時候,斷的時候即是供電被斷開的時候。只要帶寬足夠,任何模擬值都可以使用PWM進(jìn)行編碼。
脈寬調(diào)制(PWM,Pulse Width Modulation)是利用微處理器的數(shù)字輸出來對模擬電路進(jìn)行控制的一種非常有效的技術(shù),廣泛應(yīng)用在從測量、通信到功率控制與變換的許多領(lǐng)域中 。
?PWM的一個優(yōu)點(diǎn)是從處理器到???被控系統(tǒng)???信號都是數(shù)字形式的,再進(jìn)行數(shù)模轉(zhuǎn)換。可將噪聲影響降到最低(可以跟電腦一樣)。噪聲只有在強(qiáng)到足以將邏輯1改變?yōu)檫壿?或?qū)⑦壿?改變?yōu)檫壿?時,也才能對數(shù)字信號產(chǎn)生影響。
1.PWM模式
用戶可以使用 PWM 模式產(chǎn)生一個信號,其占空比由 TIMx_CCDATx 寄存器的值決定,其頻率由TIMx_AR 寄存器的值決定。 并且取決于 TIMx_CTRL1.CAMSEL 的值, TIM 可以在邊沿對齊模式或中央對齊模式下產(chǎn)生 PWM 信號。
用戶可以通過設(shè)置 TIMx_CCMODx. OCxMD=110 或設(shè)置 TIMx_CCMODx.OCxMD=111 來設(shè)置 PWM 模式 1 或 PWM 模式 2。 要使能預(yù)加載寄存器,用戶必須設(shè)置相應(yīng)的 TIMx_CCMODx.OCxPEN。 然后設(shè)置 TIMx_CTRL1.ARPEN 自動重裝載預(yù)加載寄存器。
用戶可以通過設(shè)置 TIMx_CCEN.CCxP 來設(shè)置 OCx 的極性。當(dāng) TIM 處于 PWM 模式時, TIMx_CNT 和 TIMx_CCDATx 的值總是相互比較。
只有當(dāng)更新事件發(fā)生時,預(yù)加載寄存器才會轉(zhuǎn)移到影子寄存器。 因此,用戶必須在計(jì)數(shù)器開始計(jì)數(shù)之前通過設(shè)置 TIMx_EVTGEN.UDGN 來復(fù)位所有寄存器。
1.1 PWM中央對齊模式
如果用戶設(shè)置 TIMx_CTRL1.CAMSEL 等于 01、 10 或 11, PWM 中央對齊模式將被激活。 比較標(biāo)志的設(shè)置取決于 TIMx_CTRL1.CAMSEL 的值。 設(shè)置比較標(biāo)志的情況有 3 種,僅當(dāng)計(jì)數(shù)器向上計(jì)數(shù)時,僅當(dāng)計(jì)數(shù)器向下計(jì)數(shù)時,或當(dāng)計(jì)數(shù)器向上計(jì)數(shù)和向下計(jì)數(shù)時。 用戶不應(yīng)通過軟件修改 TIMx_CTRL1.DIR,它是由硬件更新的。
中央對齊 PWM 波形示例如下,波形設(shè)置為: TIMx_AR=8, PWM 模式 1 ,當(dāng)計(jì)數(shù)器向下計(jì)數(shù)對應(yīng)TIMx_CTRL1.CAMSEL=01 時設(shè)置比較標(biāo)志。
使用中央對齊模式時用戶應(yīng)注意的事項(xiàng)如下:
計(jì)數(shù)器向上或向下計(jì)數(shù)取決于 TIMx_CTRL1.DIR 的值。 注意不要同時更改 DIR 和 CAMSEL 位
用戶在中央對齊模式下不要寫計(jì)數(shù)器,否則會導(dǎo)致意想不到的結(jié)果。 例如:
如果寫入計(jì)數(shù)器的值為 0 或者是 TIMx_AR 的值,則方向會被更新,但不會產(chǎn)生更新事件
如果寫入計(jì)數(shù)器的值大于自動重載的值,則方向不會更新
為了安全起見,建議用戶在啟動計(jì)數(shù)器之前設(shè)置 TIMx_EVTGEN.UDGN 以通過軟件生成更新,并且在計(jì)數(shù)器運(yùn)行時不要寫入計(jì)數(shù)器。
1.2 PWM 邊沿對齊模式
邊沿對齊模式有兩種配置,向上計(jì)數(shù)和向下計(jì)數(shù)。
向上計(jì)數(shù)
用戶可以設(shè)置 TIMx_CTRL1.DIR=0 使計(jì)數(shù)器向上計(jì)數(shù)。
PWM 模式 1 的示例:
當(dāng) TIMx_CNT < TIMx_CCDATx 時, OCxREF 為高電平,否則為低電平。 如果 TIMx_CCDATx 中的比較值大于自動重載值,則 OCxREF 將保持為 1。相反,如果比較值為 0,則 OCxREF 將保持為 0。當(dāng) TIMx_AR=8 時, PWM 波形如下:
向下計(jì)數(shù)
用戶可以設(shè)置 TIMx_CTRL1.DIR=1 使計(jì)數(shù)器向下計(jì)數(shù)。
PWM 模式 1 的示例:
當(dāng) TIMx_CNT > TIMx_CCDATx 時, OCxREF 為低電平,否則為高電平。 如果 TIMx_CCDATx 中的比較值大于自動重載值,則 OCxREF 將保持為 1。
注:若第n 個PWM 周期CCDATx 影子寄存器>=AR 值,第n+1 個PWM 周期CCDATx 的影子寄存器值是0。在第n+1 個PWM周期的計(jì)數(shù)器為0 的時刻,雖然計(jì)數(shù)器 = CCDATx 影子寄存器的值 = 0, OCxREF =‘0’,但不會產(chǎn)生比較事件。
2.通過PWM輸出呼吸燈示例
1.根據(jù)N32G45帖子介紹可知LED硬件接口:https://bbs.elecfans.com/jishu_2320004_1_1.html
2.接下來我我們以D2、D3為例(D2、D3剛才處于TIM3的通道1和通道2上),實(shí)現(xiàn)PWM輸出控制LED。
根據(jù)參考手冊第7章可以看到,我們想要實(shí)現(xiàn)該功能,就需要開始TIM3的部分重映射功能。
TIM3通道的部分重映射配置如下:
RCC->APB2PCLKEN|=1<<0;//AFIO AFIO->RMP_CFG&=~(0x3<<10); AFIO->RMP_CFG|=2<<10;//開啟部分重映像 AFIO->RMP_CFG&=~(0x7<<24); AFIO->RMP_CFG|=1<<24;//將PB4設(shè)置為普通IO
寄存器相關(guān)介紹可查看N32用戶手冊第7.4章節(jié)AFIO寄存器配置。
3.配置定時器基本功能和PWM模式。
在完成PWM模式輸出時,我們需要先完成定時器的基本功能配置(開定時器時鐘、設(shè)置預(yù)分頻系數(shù),設(shè)置周期時間)。
定時器相關(guān)寄存器可參考N32用戶手冊12.4章節(jié)。下面列舉幾個常用寄存器。
控制寄存器1(TIM_CTRL1)
本寄存器主要實(shí)現(xiàn)定時器的基本功能配置:設(shè)置計(jì)數(shù)模式、開始定時器等。
預(yù)分頻器(TIM_PSC)
本寄存器設(shè)置定時器的工作頻率,例如要實(shí)現(xiàn)計(jì)數(shù)器+1的時長為1us,則時鐘的PSC=72-1;
注意:定時器的時鐘線工作頻率為72MHZ,即CK_PSC=72MHZ
重裝載寄存器(TIM_AR)
重裝載寄存器為實(shí)現(xiàn)定時器計(jì)數(shù)周期。
捕獲比較寄存器(TIM_CCDAT1)
當(dāng)為輸出模式時,CCDAT寄存器用于設(shè)置占空比;當(dāng)為輸入模式時,CCDAT用于保存捕獲到的電平時間;
捕獲/比較寄存器(TIM_CCMOD)
捕獲比較寄存器用于設(shè)置輸入捕獲模式和輸出比較模式的通道參數(shù)信息。
捕獲/比較使能寄存器(TIM_CCEN)
捕獲比較使能寄存器用于啟動通道、設(shè)置有效電平極性。
2.1 定時配置示例
完成定時器基本功能配置,設(shè)置周期時間,設(shè)置分頻系數(shù),配置通道參數(shù),輸出PWM。
/*********************************** ** **函數(shù)功能:定時器器PWM輸出 **TIM3通道引腳: ** 沒有重映射 部分重映射 完全重映射 ** TIM3_CH1 PA6 PB4 PC6 ** TIM3_CH2 PA7 PB5 PC7 **形參: ** chx --要開啟的通道(1 --通道1,2--通道2, 3 --表示開啟通道1和通道2) ** psc --預(yù)分頻系數(shù) ** ar --重裝載值(即周期時間) ** ccr --占空比 ** 注意:本示例采用部分重映射功能 **作者:IT_阿水 ************************************/ void TIM3_PWM_Out(u8 chx,u16 psc,u16 ar,u16 ccr) { /*1.開時鐘*/ RCC->APB2PCLKEN|=1<<3;//PB RCC->APB2PCLKEN|=1<<0;//AFIO AFIO->RMP_CFG&=~(0x3<<10); AFIO->RMP_CFG|=2<<10;//開啟部分重映像 AFIO->RMP_CFG&=~(0x7<<24); AFIO->RMP_CFG|=1<<24;//將PB4設(shè)置為普通IO /*2.配置GPIO*/ GPIOB->PL_CFG&=0xFF00FFFF; GPIOB->PL_CFG|=0x00BB0000;//通用復(fù)用推挽輸出模式 /*3.定時器配置*/ RCC->APB1PCLKEN|=1<<1;//TIM3 RCC->APB1PRST|=1<<1;//開啟復(fù)位時鐘 RCC->APB1PRST&=~(1<<1);//取消復(fù)位 TIM3->CTRL1|=1<<7; TIM3->PSC=psc-1;//預(yù)分頻 TIM3->AR=ar;//重裝載值 /*輸出PWM配置*/ if(chx&0x1) { TIM3->CCMOD1&=~(0x3<<0);//輸出 TIM3->CCMOD1|=1<<2;//快速使能 TIM3->CCMOD1|=1<<3;//預(yù)加載 TIM3->CCMOD1|=0x6<<4;//PWM0 TIM3->CCDAT1=ccr;//占空比,有效電平時間 TIM3->CCEN|=1<<0;//開啟CH1 } if(chx&1<<1)//CH2 { TIM3->CCMOD1&=~(0x3<<8);//輸出 TIM3->CCMOD1|=1<<10;//快速使能 TIM3->CCMOD1|=1<<11;//預(yù)加載 TIM3->CCMOD1|=0x6<<12;//PWM0 TIM3->CCDAT2=ccr;//占空比,有效電平時間 TIM3->CCEN|=1<<4;//開啟CH2 } TIM3->CTRL1|=1<<0;//開啟定時器 }
2.2 呼吸燈效果實(shí)現(xiàn)
通過調(diào)節(jié)PWM輸出的占空比,實(shí)現(xiàn)LED呼吸燈效果。
#include "n32g45x.h" #include #include #include "led.h" #include "key.h" #include "usart.h" #include "delay.h" #include "timer.h" int main() { u8 key_val; int time=0; u8 flag=0; LED_Init(); KEY_Init(); USART_Init(115200); TIM3_PWM_Out(3,72,400,0); printf("串口初始化完成rn"); while(1) { key_val=Key_Scan(); if(key_val) { printf("串口+DMA數(shù)據(jù)發(fā)送測試示例!rn"); } if(usart1_flag) { usart1_rx_buff[usart1_cnt]='?'; printf("%s,%drn",usart1_rx_buff,usart1_cnt); if(strcmp((char *)usart1_rx_buff,"LED1_ON")==0)LED_D1=1; else if(strcmp((char *)usart1_rx_buff,"LED1_OFF")==0)LED_D1=0; else if(strcmp((char *)usart1_rx_buff,"LED2_ON")==0)LED_D2=1; else if(strcmp((char *)usart1_rx_buff,"LED2_OFF")==0)LED_D2=0; else if(strcmp((char *)usart1_rx_buff,"LED3_ON")==0)LED_D3=1; else if(strcmp((char *)usart1_rx_buff,"LED3_OFF")==0)LED_D3=0; usart1_flag=0; } if(time>=400)flag=1; else if(time<=0)flag=0; if(flag)time--; else time++; TIM3->CCDAT1=time; TIM3->CCDAT2=time; Delay_Ms(10); } }
審核編輯:湯梓紅
-
PWM
+關(guān)注
關(guān)注
114文章
5186瀏覽量
213920 -
定時器
+關(guān)注
關(guān)注
23文章
3248瀏覽量
114792 -
n32g455
+關(guān)注
關(guān)注
0文章
7瀏覽量
937
發(fā)布評論請先 登錄
相關(guān)推薦
評論