9.1 PWM簡介
脈沖寬度調制(Pulse Width Modulation)技術,簡稱PWM調制技術,是一種通過改變脈沖的寬度以及頻率來改變輸出頻率的一種控制方式。采樣控制理論中有一個重要結論:沖量相等而形狀不同的窄脈沖加在具有慣性的環(huán)節(jié)上時,其效果基本相同。PWM控制技術就是以該結論為理論基礎,對半導體開關器件的導通和關斷進行控制,使輸出端得到一系列幅值相等而寬度不相等的脈沖,用這些脈沖來代替正弦波或其他所需要的波形。按一定的規(guī)則對各脈沖的寬度進行調制,既可改變逆變電路輸出電壓的大小,也可改變輸出頻率。
STM32的定時器除了有計數,定時,輸入捕獲功能以外,還有PWM輸出功能,主要工作原理就是通過在定時器內部設置閾值,當CNT計數器的數小于這個閾值的時候輸出1個電平,當CNT的數據大于這個閾值的時候輸出另一個電平。通過改變這個閾值來改變占空比(因為CNT最大計數值就是65535),通過改變計數頻率來改變PWM脈沖頻率。
9.2 相關寄存器
9.2.1 捕獲/比較寄存器:TIMx_CCMRx
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
OC2CE | OC2M[2:0] | OC2PE | OC2FE | CC2S[1:0] | OC1CE | OC1M[2:0] | OC1PE | OC1FE | CC1S[1:0] |
OCxCE:輸出比較x清0使能
0:OCxREF不受ETRF輸入的影響
1:一旦檢測到ETRF輸入高電平,清除OCxREF=0
OCxPE:輸出比較x預裝載使能
0:禁止預裝載功能,寫入的數值立即起作用
1:開啟預裝載功能,TIMx_CCRx的預裝載值在更新事件到來時被加載至當前寄存器中
注1 :一旦LOCK級別設為3并且CC1S=00則該位不能被修改
注2 :僅在單脈沖模式下,可以在未確認預裝載寄存器情況下使用PWM模式,否則其動作不確定
OCxFE:輸出比較x快速使能(該位用于加快CC輸出對觸發(fā)輸入事件的響應)
0:根據計數器與CCRx的值,當觸發(fā)器的輸入有一個有效沿時,激活CCx輸出的最小延時為5個時鐘周期
1:OC被設置為比較電平而與比較結果無關,觸發(fā)器有效沿和CCx輸出間的延時被縮短為3個時鐘周期
注3 :只在通道被配置成PWM1或PWM2模式時起作用
OCxM[2:0]:輸出比較x模式
CCxS[1:0]:捕獲/比較x選擇(用于定義通道x輸入還是輸出)
00:輸出模式
01:輸入模式,映射在TI1上
10:輸入模式,映射在TI2上
11:輸入模式,映射在TRC上,此模式引用于內部觸發(fā)器輸入被選中時
9.2.2 剎車和死區(qū)寄存器:TIMx_BDTR
注:這個寄存器只有TIM1和TIM8這兩個高級定時器才需要控制。
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
MOE | AOE | BKP | BKE | OSSR | OSSI | LOCK[1:0] | DTG[7:0] |
Bit 15:主輸出使能(一旦剎車輸入有效,該位被硬件異步清0)
0:禁止OC和OCN輸出或強制為空閑狀態(tài)
1:如果設置了相應的使能位,則開啟OC和OCN輸出。
Bit 14:自動輸出使能
0:MOE只能被軟件置1
1:MOE能被軟件置1或在下一個更新事件被自動置1
** 注1** :一旦LOCK級別設為1,則該位不能被修改
Bit 13:剎車輸入極性
0:剎車輸入低電平有效
1:剎車輸入高電平有效
** 注2** :一旦LOCK級別設為1,則該位不能被修改
** 注3** :任何對該位的寫操作都需要一個APB時鐘的延遲以后才能起作用
Bit 12:剎車功能使能
0:禁止剎車輸入
1:開啟剎車輸入
**注4** :當設置了LOCK級別1時,該位不能被修改
**注5** :任何對該位的寫操作都需要一個APB時鐘的延遲以后才能起作用
Bit 11:運行模式下“關閉狀態(tài)”選擇(該位用于當MOE=1且通道為互補輸出)
0:當定時器不工作時,禁止OC/OCN輸出(OC/OCN使能輸出信號=0)
1:當定時器不工作時,一旦CCxE或CCxNE為1,先開啟OC/OCN并輸出無效電平,再置使能輸出信號為1
**注6** :一旦LOCK級別設為2,則該位不能被修改
Bit 10:空閑模式下“關閉狀態(tài)”選擇(該位用于當MOE=0且通道設為輸出時)
0:當定時器不工作時,禁止OC/OCN輸出(OC/OCN使能輸出信號=0)
1:當定時器不工作時,一旦CCxE或CCxNE為1, OC/OCN先輸出其空閑電平,然后使能輸出信號為1
**注7** :一旦LOCK級別設為2,則該位不能被修改
Bit 9~Bit 8:鎖定設置(該位為防止軟件錯誤而提供寫保護)
00:鎖定關閉,寄存器無寫保護
01:鎖定級別1,不能寫入TIMx_BDTR寄存器DTG、 BKE、 BKP、 AOE位和TIMx_CR2寄存器OISx/OISxN位
10:鎖定級別2,不能寫入鎖定級別1中的各位,也不能寫入CC極性位
11:鎖定級別3,不能寫入鎖定級別2中的各位,也不能寫入CC控制位
** 注8** :在系統(tǒng)復位后,只能寫一次LOCK位,一旦寫入TIMx_BDTR寄存器,則其內容凍結直至復位
Bit 7~Bit 0:死區(qū)發(fā)生器設置(定義了插入互補輸出之間的死區(qū)持續(xù)時間)
9.3 PWM實驗例程
利用STM32的PA8輸出頻率1KHz,占空比為30%,高電平有效的脈沖。
(1)創(chuàng)建基礎工程與pwm.c和pwm.h文件,并將pwm.c和pwm.h文件添加進工程。
(2)pwm.h添加代碼如下。
(3)pwm.c添加代碼如下。
#include "pwm.h"
/***************************************************
Name :PWM_Init
Function :PWM輸出初始化
Paramater :
psc:預分頻系數
Return :None
***************************************************/
void PWM_Init( u16 psc )
{
RCC->APB2ENR |= 1<<2 ;
GPIOA->CRH &= 0xFFFFFFF0 ; //清除PA8配置
GPIOA->CRH |= 0x0000000B ; //PA8復用功能輸出
RCC->APB2ENR |= 1<<11 ; //TIM1時鐘開啟
TIM1->ARR = 100 ;
TIM1->PSC = psc ;
TIM1->CCMR1 |= 7<<4 ; //CH1 PWM2模式
TIM1->CCMR1 |= 1<<3 ; //CH1預裝載使能
TIM1->CCER |= 1<<1 ; //OC1低電平有效
TIM1->CCER |= 1<<0 ; //OC1輸出使能
TIM1->BDTR |= 1<<15 ; //MOE輸出使能
TIM1->CR1 |= 1<<7 ; //自動重裝載使能
TIM1->CR1 |= 1<<0 ; //開啟定時器1
}
/***************************************************
Name :PWM_Set
Function :PWM設置
Paramater :
pwm_data:占空比
Return :None
***************************************************/
void PWM_Set( u8 pwm_data )
{
TIM1->CCR1 = pwm_data ;
}
(4)1.c添加代碼如下。
#include "sys.h"
#include "delay.h"
#include "usart1.h"
#include "pwm.h"
int main()
{
STM32_Clock_Init( 9 ) ; //STM32時鐘初始化
SysTick_Init( 72 ) ; //SysTick初始化
USART1_Init( 72, 115200 ) ; //初始化串口1波特率115200
PWM_Init( 719 ) ; //PWM初始化
PWM_Set( 30 ) ; //設置占空比30%
while( 1 )
{
}
}
9.4 擴展:PWM實現DAC輸出
9.4.1 工作原理
由于STM32F1自帶2路DAC輸出,所以當DAC不夠用的時候,為了節(jié)約成本,需要利用PWM配合RC濾波器來實現DAC輸出,對于PWM脈沖的波形可以列寫出脈沖的時域函數表達式
9.4.2 電路設計
我們現在設計一個分辨率為8位的PWM信號,其實STM32的分辨率都可以達到16位,甚至32位,但是分辨率越高,速度就越慢,在8位分辨率條件下,我們要求1次諧波對輸出電壓的影響不要超過1個位的精度,也就是3.3/256=0.01289V。假設V~H~為3.3V,V~L~為0V,那么一次諧波的最大值是2*3.3/π=2.1V,這就要求我們的RC濾波電路提供至少-20lg(2.1/0.01289)=-44dB的衰減。
STM32的定時器最快的計數頻率是72Mhz,8為分辨率的時候,PWM頻率為72M/256=281.25Khz。如果是1階RC濾波,則要求截止頻率為1.77Khz,如果為2階RC濾波,則要求截止頻率為22.34Khz。
上圖所示位二階RC濾波器的電路原理,根據二階RC濾波器的截止頻率計算公式
可以得到R28*C37=R29*C38=RC,通過這個公式我們選定的R和C的參數,并得到實際的截止頻率為33.8KHz,遠超過理論的截止頻率,該電路實測精度大約在0.5LSB左右。
9.4.3 實驗例程
在這里,我們只需要將實驗例程中的PWM頻率改為22.34KHz即可。通過改變占空比,我們可以用電壓表來測量出實際的輸出電壓。
PS:PWM實現DAC輸出最常見的功能就是語音合成芯片。
-
PWM
+關注
關注
114文章
5144瀏覽量
213404 -
頻率
+關注
關注
4文章
1446瀏覽量
59153 -
脈沖寬度調制
+關注
關注
7文章
81瀏覽量
13717
發(fā)布評論請先 登錄
相關推薦
評論