011第十一章脉波宽度调变Pulse Width Modulation.docx
《011第十一章脉波宽度调变Pulse Width Modulation.docx》由会员分享,可在线阅读,更多相关《011第十一章脉波宽度调变Pulse Width Modulation.docx(21页珍藏版)》请在冰豆网上搜索。
011第十一章脉波宽度调变PulseWidthModulation
第十一章脈波寬度調變(PulseWidthModulation)
11-1、簡介
脈波寬度調變(PulseWidthModulation,(PWM))基本的控制原理是根據輸入信號的大小,調整輸出脈波的寬度,而此脈波的頻率為固定。
如圖11-1(a)所示是一個正弦波的正半週波形,若取樣點如圖11-1(a)所示,根據取樣值的大小,來決定脈波的寬度。
因此就可以得到如圖11-1(b)所示的脈衝列。
圖11-1:
PWM基本控制原理
PWM的輸出時序如圖11-2所示。
PWM輸出有兩個名詞需要注意到:
Period和DutyCycle。
當PWM輸出由此次變High到下一次變High的時間稱為Period;而PWM輸出保持在High
(1)的時間除以Period,稱呼它為PWM的DutyCycle。
圖11-2:
PWM輸出時序圖
11-2、ET44M210的PWM
ET44M210微控制器提供兩組16位元解析度的PWM輸出。
PWM0是連接到PORTA的Bit7,PWM1是連接到PORTC的Bit5。
因為ET44M210微控制器的PWM輸出是16位元的解析度,因此DutyCycle是由2個暫存器所決定:
DutyCycleHighByte(DT0H;DT1H)和DutyCycleLowByte(DT0L;DT1L)。
DT0H:
DT0L是針對PWM0所設定的暫存器;DT1H:
DT1L是針對PWM1所設定的暫存器,統稱為DTX。
另外ET44M210也定義了一組16位元的DutyCycleLatch暫存器,DutyCycleLatch暫存器是由2個暫存器所決定:
DutyCycleLatchHighByte(DL0H;DL1H)和DutyCycleLatchLowByte(DL0L;DL1L)。
DL0H:
DL0L是針對PWM0所設定的暫存器;DL1H:
DL1L是針對PWM1所設定的暫存器,統稱為DLX。
DutyCycleLatch暫存器是唯讀的暫存器。
PWM的Period也是由2個暫存器所決定:
PeriodHighByte(PRD0H;PRD1H)和PeriodLowByte(PRD0L;PRD1L)。
PRD0H:
PRD0L是針對PWM0所設定的暫存器;PRD1H:
PRD1L是針對PWM1所設定的暫存器,統稱為PRDX。
在ET44M210內部有2個與PWM有關的16位元計數器:
TMR0和TMR1。
TMR0是針對PWM0所設定的計數器;TMR1是針對PWM1所設定的計數器,統稱為TMRX。
當PWM啟動之後,SystemClock就會送到TMRX開始上數,此時會將PWM輸出接腳設為1,在此同時會分別與DLX與PRDX做比較;當TMRX的值等於DLX的值時,PWM輸出接腳會設為0。
當TMRX的值等於PRDX的值時,會將PWM輸出接腳設為1,並且將TMRX清除為0,同時PWM的中斷旗標也會設為1。
當TMRX被清除為0的同時,會將DTX的值Latch在DLX內。
Note:
當要改變Period時必須先將PWM的功能Disable。
DutyCycle的計算公式入下所示:
DutyCycle=(DTX+1)×(2∕FSCO)
FSCO=SystemClock
Period的計算公式入下所示:
Period=(PRDX+2)×(2∕FSCO)
FSCO=SystemClock
如圖11-3所示為PWM的功能方塊圖。
圖11-3:
PWM功能方塊圖
11-3、與PWM相關的暫存器
Ø中斷旗標暫存器(InterruptFlagRegister)–INTF(0x11)
7
6
5
4
3
2
1
0
ADIF
RBFIF
PWM1IF
PWM0IF
EINT1F
EINT0F
TCCOF
FRCOF
✓Bit4~Bit5(PWM0IF&PWM1IF):
PWM中斷旗標:
當TMRX等於PRDX時,中斷條件成立,此位元設為1。
以軟體指令清除。
ØPWMDutyCycle暫存器(PWMDuty)–DT0L(0x21)/DT0H(0x22)&DT1L(0x27)/DT1H(0x28)
DT0L
7
6
5
4
3
2
1
0
DT07
DT06
DT05
DT04
DT03
DT02
DT01
DT00
DT0H
7
6
5
4
3
2
1
0
DT0F
DT0E
DT0D
DT0C
DT0B
DT0A
DT09
DT08
DT1L
7
6
5
4
3
2
1
0
DT17
DT16
DT15
DT14
DT13
DT12
DT11
DT10
DT1H
7
6
5
4
3
2
1
0
DT1F
DT1E
DT1D
DT1C
DT1B
DT1A
DT19
DT18
DT0H:
:
DT0L是PWM0輸出的DutyCycle。
DT1H:
:
DT1L是PWM1輸出的DutyCycle。
ØPWMPeriod暫存器(PWMPeriod)–PRD0L(0x23)/PRD0H(0x24)&PRD1L(0x29)/PRD1H(0x2A)
PRD0L
7
6
5
4
3
2
1
0
PRD07
PRD06
PRD05
PRD04
PRD03
PRD02
PRD01
PRD00
PRD0H
7
6
5
4
3
2
1
0
PRD0F
PRD0E
PRD0D
PRD0C
PRD0B
PRD0A
PRD09
PRD08
PRD1L
7
6
5
4
3
2
1
0
PRD17
PRD16
PRD15
PRD14
PRD13
PRD12
PRD11
PRD10
PRD1H
7
6
5
4
3
2
1
0
PRD1F
PRD1E
PRD1D
PRD1C
PRD1B
PRD1A
PRD19
PRD18
PRD0H:
:
PRD0L是PWM0輸出Period。
PRD0H:
:
PRD0L是PWM1輸出Period。
ØPWMDutyCycleLatch暫存器(PWMDutyLatch)–DL0L(0x25)/DL0H(0x26)&DL1L(0x2B)/DL1H(0x2C)
DL0L
7
6
5
4
3
2
1
0
DL07
DL06
DL05
DL04
DL03
DL02
DL01
DL00
DL0H
7
6
5
4
3
2
1
0
DL0F
DL0E
DL0D
DL0C
DL0B
DL0A
DL09
DL08
DL1L
7
6
5
4
3
2
1
0
DL17
DL16
DL15
DL14
DL13
DL12
DL11
DL10
DL1H
7
6
5
4
3
2
1
0
DL1F
DL1E
DL1D
DL1C
DL1B
DL1A
DL19
DL18
DL0H:
:
DL0L是PWM0輸出DutyCycleLatch暫存器。
DL1H:
:
DL1L是PWM1輸出DutyCycleLatch暫存器。
Note:
這是唯讀的暫存器
Ø週邊功能致能控制暫存器(PeripheralsEnableControl)–PRIE(0x80)
7
6
5
4
3
2
1
0
SPIE
USBE
WME
ADE
PWM1E
PWM0E
TCCE
FRCE
此暫存器控制是否啟用週邊功能。
當設為0時,表示不啟用該週邊功能,當設為1時,表示啟用該週邊功能。
✓Bit2(PWM0E):
脈寬調變0(PWM0)功能致能位元。
✓Bit3(PWM1E):
脈寬調變1(PWM1)功能致能位元。
Ø中斷功能致能控制暫存器(InterruptsEnableControl)–INTE(0x81)
7
6
5
4
3
2
1
0
GIE
RBFIE
PWM1IE
PWM0IE
EINT1E
EINT0E
TCCOE
FRCOE
此暫存器控制是否啟用中斷功能。
當設為0時,表示不啟用中斷功能,當設為1時,表示啟用中斷功能。
✓Bit4(PWM0IE):
脈寬調變(PWM0)一個週期完成中斷功能致能位元。
✓Bit5(PWM1IE):
脈寬調變(PWM1)一個週期完成中斷功能致能位元。
Ø脈寬調變控制暫存器(PWMControlRegister)–PWMCR(0x98)
7
6
5
4
3
2
1
0
-
-
-
-
S_PWM1
S_PWM0
-
-
✓Bit2(S_PWM0):
SelectedPWM0outputenable
此位元是設定PWM0輸出致能位元。
當設為0時,表示DisablePWM0輸出,當設為1時,表示EnablePWM0輸出。
✓Bit3(S_PWM1):
SelectedPWM1outputenable
此位元是設定PWM1輸出致能位元。
當設為0時,表示DisablePWM1輸出,當設為1時,表示EnablePWM1輸出。
✓Bit0,Bit1andBit4~Bit7:
保留
11-4、程式範例
1.實習1-PWM喇叭音效控制實習
Ø動作說明
程式使用PWM功能,使喇叭發出聲音。
Ø硬體連接
此範例使用ET44M210的實驗電路板。
Ø程式說明
此範例使用PWM功能,
PWM0:
DutyCycle=(DTX+1)×(2∕FSCO)=(33)×(2∕6MHz)=11μs。
Period=(PRDX+2)×(2∕FSCO)=(259)×(2∕6MHz)=86μs。
PWM1:
DutyCycle=(DTX+1)×(2∕FSCO)=(33)×(2∕6MHz)=11μs。
Period=(PRDX+2)×(2∕FSCO)=(1030)×(2∕6MHz)=343μs。
程式一開始先起始PWM設定:
清除PWM相關暫存器,設定PWM暫存器的值。
主程式只需等待PWM中斷發生。
Note:
由於實驗電路板的喇叭是連接到PWM1,因此PWM0並不需要Enable。
Ø流程圖
Ø程式碼
PWM01.dt中副程式及程式區段說明
PWM01.dt程式共包含了5個副程式及程式區段,依照程式的撰寫順序有:
PWM:
、EXIT:
、CLR_PWM1_FLAG:
、INITIAL:
、PWM_START:
為了方便讀者閱讀瞭解,針對程式中所定義的LAB