專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

STC12C5201AD單片機(jī)的PWM功能的應(yīng)用總結(jié)

作者:劉佳喝   來源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2014年03月16日   【字體:

52xxAD系列單片機(jī)的內(nèi)部集成了兩路可編程計(jì)數(shù)陣列模塊(PCA),可用于軟件定時(shí)器、外部脈沖的捕捉、高速輸出和脈寬調(diào)制輸出(PWM)。

這里主要是對(duì)PWM輸出功能進(jìn)行介紹。
首先要清楚與PCA/PWM應(yīng)用有關(guān)的特殊功能寄存器

符號(hào)
描述
地址
位地址及其符號(hào)
復(fù)位值
B7
B6
B5
B4
B3
B2
B1
B0
CCON
PCA control register
D8H
CF
CR
 
 
 
 
CCF1
CCF0
00xx,xx00
CMOD
PCA mode register
D9H
CIDL
 
 
 
CPS2
CPS1
CPS0
ECF
0xxx,0000
CCAPM0
PCA module 0 mode register
DAH
 
ECOM0
CAPP0
CAPN0
MAT0
TOG0
PWM0
ECCF0
X000,0000
CCAPM1
PCA module 1 mode register
DBH
 
ECOM1
CAPP1
CAPN1
MAT1
TOG1
PWM1
ECCF1
X000,0000
CL
PCA base time low
E9H
 
 
 
 
 
 
 
 
0000,0000
CH
PCA base time high
F9H
 
 
 
 
 
 
 
 
0000,0000
CCAP0L
PCA module_0 captureregister  low
EAH
 
 
 
 
 
 
 
 
0000,0000
CCAP0H
PCA module0 capture register high
FAH
 
 
 
 
 
 
 
 
 
CCAP1L
PCA module_1 capture register low
EBH
 
 
 
 
 
 
 
 
0000,0000
CCAP1H
PCA module_1 capture register high
FBH
 
 
 
 
 
 
 
 
0000,0000
PCA_PWM0
PCA PWM mode auxiliary register 0
F2H
 
 
 
 
 
 
EPC0H
EPC0L
Xxxx,xx00
PCA_PWM1
PCA PWM mode auxilia
F3H
 
 
 
 
 
 
EPC1H
EPC1L
Xxxx,xx00

1、 PCA工作模式寄存器CMOD
CIDL:空閑模式下是否停止PCA計(jì)數(shù)的控制位
      當(dāng)CIDL=0時(shí),空閑模式下PCA計(jì)數(shù)器繼續(xù)工作
      當(dāng)CIDL=1時(shí),空閑模式下PCA計(jì)數(shù)器停止工作
CPS2\CPS1\CPS0:pca計(jì)數(shù)器脈沖源選擇控制位。
0     0     0     0,系統(tǒng)時(shí)鐘SYSCLK/12
0     0     1     1,系統(tǒng)時(shí)鐘SYSCLK/2
0     1     0     2,定時(shí)器0的溢出脈沖。由于定時(shí)器0可以工作在1T模式,所以可以達(dá)到計(jì)一個(gè)時(shí)鐘就溢出,從而達(dá)到最高頻率CPU工作時(shí)時(shí)鐘SYSCLOCK,通過改變定時(shí)器0的溢出率,可以實(shí)現(xiàn)可調(diào)頻率的PWM輸出。
0     1     1     3,ECI/P1.2(或P1.4)腳輸入的外部時(shí)鐘(最大速率=SYSCLK/2)
1     0     0     4,系統(tǒng)時(shí)鐘 SYSCLK
1     0     1     5,系統(tǒng)時(shí)鐘/4,sysclk/4
1     1     0     6, 系統(tǒng)時(shí)鐘/6,
1     1     1     7, 系統(tǒng)時(shí)鐘/8
2、 PCA控制寄存器CCON
CF:PCA計(jì)數(shù)器陣列溢出標(biāo)志位。當(dāng)PCA計(jì)數(shù)器溢出時(shí),CF由硬件置位。如果CMOD寄存器的ECF位置位,則CF標(biāo)志可用來產(chǎn)生中斷。CF位可通過硬件或軟件置位,但只可通過軟件清零。
CR:PCA計(jì)數(shù)器陣列運(yùn)行控制位,該位通過軟件置位,用來啟動(dòng)計(jì)數(shù)器陣列計(jì)數(shù),通過軟件清零,用來關(guān)閉PCA計(jì)數(shù)器。
CCF1:pca模塊1中斷標(biāo)志。當(dāng)出現(xiàn)匹配或捕獲時(shí)該位由硬件置位,必須通過軟件清零
CCF0:PCA模塊0中斷標(biāo)志。
3、 PCA比較/捕獲寄存器CCAPM0和CCAPM1
ECOM0:允許比較器功能控制位。為1,允許
CAPP0:正捕獲控制位。為1,允許
CAPN0:負(fù)捕獲控制位。為1,允許
MAT0:匹配控制位。
      為1時(shí),PCA計(jì)數(shù)值與模塊的比較/捕獲寄存器的值的匹配將置位CCON寄存器的中斷標(biāo)志位CCF0。
TOG0:翻轉(zhuǎn)控制位。當(dāng)tog0=1時(shí),工作在PCA高速輸出模式,PCA計(jì)數(shù)器的值與模塊的比較/捕獲寄存器的值的匹配將使CEX0腳翻轉(zhuǎn)。(CCP0/PCA0/PWM0/P1.3)
PWM0:脈沖調(diào)節(jié)模式
       當(dāng)PWM0=1時(shí),允許CEX0腳用作脈寬調(diào)節(jié)輸出(CCP0/PCA0/PWM0/P1.3)
ECCF0:時(shí)能CCF0中斷。使能寄存器CCON的比較/捕獲標(biāo)志CCF0,用來產(chǎn)生中斷。
4、 PCA的16位寄存器——低8位CL和高8位CH
用于保存PCA的裝載值。
5、 PCA捕捉/比較寄存器——CCAPnL(低位字節(jié))和CCAPnH(高位字節(jié))
當(dāng)PCA模塊用于捕獲或比較時(shí),它們用于保存各個(gè)模塊的16位捕捉計(jì)數(shù)值;當(dāng)PCA模塊用于PWM模式時(shí),它們用來控制輸出的占空比。其中,n=0、1,分別對(duì)應(yīng)模塊0和模塊1.復(fù)位值均為00H,對(duì)應(yīng)的地址分別為:
CCAP0_EAH\ CCAP0H_FAH:
CCAP1_EBH\CCAP1H_FAH;
 
PCA模塊的工作模式設(shè)定表如下:
ECOMn  CAPPn   CAPNn   MATn   TOGn    PWMn   ECCFn      模塊功能
   0     0        0        0      0        0        0     無此操作
   1     0        0        0      0        1        0     8位PWM,無中斷
   1     1        0        0      0        1        1     8位PWM輸出,由低變高可產(chǎn)生中斷
   1     0        1        0      0        1         1    8位PWM輸出,由高變低可產(chǎn)生中斷
   1     1        1        0      0        1         1     8位PWM輸出,由低變高或者有高變低均可產(chǎn)生中斷
   X     1        0        0      0        0         x     16位捕獲模式,由CCPn/PCAn的上升沿觸發(fā)
   X     0        1        0      0        0         x     16位捕獲模式,由CCPn/PCAn的下降沿觸發(fā)
   X     1        1        0      0        0         x     16位捕獲模式,由CCPn/PCAn的跳變觸發(fā)
   1     0        0        1      0        0         x     16位軟件定時(shí)器
   1     0        0        1      1        0        x      16位高速輸出
6、     PCA的16位計(jì)數(shù)器——低8位CL和高8位CH
用于保存PCA的裝載值。
7、     PCA捕捉/比較寄存器CCAPnL(低位字節(jié))和CCAPnH(高位字節(jié))
當(dāng)PCA 模塊用于捕獲或比較時(shí),它們用于保存各個(gè)模塊的16位捕捉計(jì)數(shù)值;當(dāng)PCA模塊用于PWM模式時(shí),它們用來控制輸出的占空比。其中,n=0,1分別對(duì)應(yīng)模塊0和模塊1.復(fù)位值均為00H。它們對(duì)應(yīng)的地址分別為:
CCAP0L_EAH\   CCAP0H_FAH:模塊0的捕捉/比較寄存器
CCAP1L_EBH\   CCAP1H_FBH:模塊1的捕捉/比較寄存器。
脈寬調(diào)節(jié)模式
Plus width modulation 是一種使用程序來控制波形占空比、周期、相位波形的技術(shù),在三相電機(jī)驅(qū)動(dòng),D/A轉(zhuǎn)換等場(chǎng)合有廣泛的應(yīng)用。
STC12C5201AD系列的PCA模塊可以通過程序設(shè)定,使其工作于8位PWM模式。
由于所有的模塊共用僅有的PCA定時(shí)器,所有它們的輸出頻率相同。各個(gè)模塊的輸出占空比是獨(dú)立變化的,與使用的捕捉寄存器EPCnL,CCAPnL有關(guān)。當(dāng)寄存器CL的值小于EPCnL,CCAPnL時(shí),輸出為低;當(dāng)寄存器CL的值大于等于EPCnL,CCAPnL的值時(shí),輸出為高。當(dāng)CL得值由FF變?yōu)?0溢出時(shí),EPCnH,CCAPnH的內(nèi)容裝載到EPCnL,CCAPnL中,這樣就實(shí)現(xiàn)無干擾的更新PWM 。要使用PWM模式,模塊CCAPMn寄存器的PWMn和ECOMn位必須置位。
由于PWM是8位的,故PWM的頻率=PCA時(shí)鐘輸入源頻率/256
PCA時(shí)鐘輸入源可以從以下的幾種進(jìn)行選擇:SYSCLK SYSCLY/2 SYSCLK/4 SYSCLK/6 SYSCLK/8 SYSCLK/12 定時(shí)器0的溢出,ECI/P3.4的輸入。
如果要實(shí)現(xiàn)可調(diào)頻率的PWM 輸出,可選擇定時(shí)器0的溢出率或則ECI腳的輸入作為PCA/PWM的時(shí)鐘輸入源
當(dāng)EPCnL=0及CCAPnL-00H時(shí),PWM固定輸出高
當(dāng)EPCnL=1及CCAPnL=FFH時(shí),PWM固定輸出低
當(dāng)某個(gè)I/O口作為PWM使用時(shí),改口的狀態(tài)
PWM之前口的狀態(tài)           PWM輸出時(shí)口的狀態(tài)
弱上拉/準(zhǔn)雙向          強(qiáng)推挽輸出/強(qiáng)上拉輸出,要加輸出限流電阻1K-10K
強(qiáng)推挽輸出/強(qiáng)上拉輸出  強(qiáng)推挽輸出/強(qiáng)上拉輸出,要加輸出限流電阻1K-10K
僅為輸入/高阻           PWM無效
開漏                     開漏
下面便是STC手冊(cè)中的一個(gè)C語言例子
#include<reg51.h>
#include “intrins.h”
#define FOSC 12000000L
Typedef unsigned int WORD;
Typedef unsigned char BYTE;
sfr CCON=0xd8;//PCA control register
sbit CCF0=CCON^0;//PCA module_0 interrupt flag
sbit CCF1=CCON^1;//pca module_1 interrupt flag
sbit CR=CCON^6;//pca time run control bit
sbit CF=CCON^7;//PCA timer overflow flag
sfr CMOD=0xd9;//pca mode register
sfr CL=0xe9;//PCA base time low
sfr CH=0xf9;//PCA base time high
sfr CCAPM0=0XDA;//PCA module_0 mode register
sfr CCAP0L=0XEA;//PCA module_0 capture register low
sfr CCAP0H=0XFA;//PCA module_0 capture register high
sfr CCAPM1=0XDB;//PCA module_1 mode register
sfr CCAP1L=0xeb;//PCA module_1 capture register low
sfr CCAP1H=0XFB,//PCA module_1 capture register high
sfr PCAPWM0=0XF2;
sfr PCAPWM1=0XF3;
void main()
{
 CCON=0;//initial PCA control register
       //PCA timer stop running
        //clear CF flag
        //clear all module interrupt flag
CL=0;//reset PCA base timer
CH=0;
CMOD=0X02;//set PCA time clock source as fosc/2
                   //disable PCA timer overflow interrupt
CCAP0H=CCAP0L=0X80;//PWM0 port output 50% duty cycle sequare wave
CCAPM0=0X42;//PCA module_0 work in 8_bit PWM mode
            // and no PCA interrupt
CCAP1H=CCAP1L=0XFF;//pwm1 port output 0% duty cycle square wave
PCAPWM1=0X03;//
CCAPM1=0X42;//PCA module_1 work in 8_bit PWM mode and no PCA interrupt
CR=1;//PCA timer start run
While(1);
}
關(guān)閉窗口

相關(guān)文章