找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3141|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

為什么在單片機(jī)pwm設(shè)置時(shí)T2是定值?最好說一下pwm的工作過程定時(shí)器的作用

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:381002 發(fā)表于 2019-3-20 18:25 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
5黑幣
#define MAIN_Fosc  11059200L //定義主時(shí)鐘
#include "15W4KxxS4.H"
#define  uint16   unsigned int  
#define  uint8    unsigned char  
/**************************************
功能描述:延時(shí)函數(shù)
入口參數(shù):uint16 x ,該值為1時(shí),延時(shí)1ms
返回值:無
***************************************/
void delay_ms(uint16 x)
{  
uint16 j,i;   
for(j=0;j<x;j++)   
{   
  for(i=0;i<1100;i++);   
}  
}
/**************************************************************************************
功能描述:對PWM3和PWM3進(jìn)行初始化
入口參數(shù):無
返回值:無
**************************************************************************************/
void PWM2PWM3_Configuration(void)
{
PWMCFG &= 0xBF;           //將CBTADC位置0,即PWM計(jì)數(shù)器歸零時(shí)不觸發(fā)ADC轉(zhuǎn)換
PWMIF &= 0xBF;           //將CBIF位置0,PWM計(jì)數(shù)器歸零中斷標(biāo)志位,需軟件清零

P_SW2 |= 0x80;           //將EAXSFR位置1,以訪問PWM在擴(kuò)展RAM區(qū)的特殊功能寄存器
//對PWM2的初始化部分
PWM2CR |= 0x08;            //將PWM2_PS位置1,選擇PWM2的輸出引腳是P2.7
PWMCR |= 0x01;           //將ENC2O位置1,PWM2的端口為PWM輸出口,受PWM波形發(fā)生器控制
PWMCFG &= 0xFE;           //將C2INI位置0,設(shè)置PWM2輸出端口的初始電平為低電平
PWMIF &= 0xFE;           //將C2IF位置0,PWM2中斷標(biāo)志位,需軟件清零
PWM2CR |= 0x04;            //將EPWM2I位置1,使能PWM2中斷
PWM2CR &= 0xFD;            //將EC2T2SI位置0,關(guān)閉T2翻轉(zhuǎn)時(shí)中斷
PWM2CR &= 0xFE;            //將EC2T1SI位置0,關(guān)閉T1翻轉(zhuǎn)時(shí)中斷
//對PWM3的初始化部分
PWM3CR |= 0x08;            //將PWM3_PS位置1,選擇PWM3的輸出引腳是P4.5
PWMCR |= 0x02;           //將ENC3O位置1,PWM3的端口為PWM輸出口,受PWM波形發(fā)生器控制
PWMCFG &= 0xFD;           //將C3INI位置0,設(shè)置PWM3輸出端口的初始電平為低電平
PWMIF &= 0xFD;           //將C3IF位置0,PWM3中斷標(biāo)志位,需軟件清零
PWM3CR |= 0x04;            //將EPWM3I位置1,使能PWM3中斷
PWM3CR &= 0xFD;            //將EC3T2SI位置0,關(guān)閉T2翻轉(zhuǎn)時(shí)中斷
PWM3CR &= 0xFE;            //將EC3T1SI位置0,關(guān)閉T1翻轉(zhuǎn)時(shí)中斷
//對PWM2和PWM3翻轉(zhuǎn)計(jì)數(shù)器賦初值
PWM2T1 =1;                 //賦值PWM2第一次翻轉(zhuǎn)計(jì)數(shù)器值
PWM2T2 = 0x00FA;           //賦值PWM2第二次翻轉(zhuǎn)計(jì)數(shù)器值
PWM3T1 =1;                 //賦值PWM3第一次翻轉(zhuǎn)計(jì)數(shù)器值
PWM3T2 = 0x00FA;           //賦值PWM3第二次翻轉(zhuǎn)計(jì)數(shù)器值

  //對PWM波形發(fā)生器時(shí)鐘源進(jìn)行初始化
PWMCKS |= 0x10;           //將SELT2位置1,PWM時(shí)鐘源為定時(shí)器2溢出脈沖
PWMC = 0x00FA;             //PWM計(jì)數(shù)器賦值(同時(shí)對PWMCH和PWMCL進(jìn)行了賦值)
AUXR |= 0x04;             //定時(shí)器2時(shí)鐘為Fosc,即1T
T2L = 0xE0;               //設(shè)定定時(shí)初值
T2H = 0xFE;                //設(shè)定定時(shí)初值
AUXR |= 0x10;              //啟動(dòng)定時(shí)器2
P_SW2 &= 0x7F;           //將EAXSFR位置0,恢復(fù)訪問XRAM

//PWM外部異?刂萍拇嫫鞯牟僮
PWMFDCR &= 0xDF;         //將ENFD位置0,關(guān)閉PWM外部異常檢測功能
PWMFDCR &= 0xF7;         //將ENDI位置0,關(guān)閉PWM異常檢測中斷
PWMFDCR &= 0xFB;         //將FDCMP位置0,比較器與PWM無關(guān)
PWMFDCR &= 0xFD;         //將FDIO位置0,P2.4的狀態(tài)與PWM無關(guān)
PWMFDCR &= 0xFE;         //將FDIF位置0,PWM異常檢測中斷標(biāo)志位,需軟件清零

IP2 |= 0x40;             //將PPWM位置1,使能PWM中斷為最高優(yōu)先級中斷
//使能PWM波形發(fā)生器
PWMCR |= 0x80;           //將ENPWM位置1,使能PWM波形發(fā)生器,PWM計(jì)數(shù)器開始計(jì)數(shù)
PWMCR &= 0xBF;           //將ECBI位置0,禁止PWM計(jì)數(shù)器歸零中斷
}
/***************************************************************************
* 描  述 : PWM中斷服務(wù)函數(shù)
* 入  參 : 無
* 返回值 : 無
**************************************************************************/
void PWM(void) interrupt PWM_VECTOR using 1
{
PWMIF &= 0xBF;           //將CBIF位置0,PWM計(jì)數(shù)器歸零中斷標(biāo)志位,需軟件清零
PWMIF &= 0xFE;           //將C2IF位置0,PWM2中斷標(biāo)志位,需軟件清零
PWMIF &= 0xFD;           //將C3IF位置0,PWM3中斷標(biāo)志位,需軟件清零
}
/********************************************************
功能描述:主函數(shù)
入口參數(shù):無
返回值:無
*********************************************************/
int main()
{
uint8 flag=1;
uint16 ledpwmval=0;
/////////////////////////////////////////////////
//注意: STC15W4K32S4系列的芯片,上電后所有與PWM相關(guān)的IO口均為
//      高阻態(tài),需將這些口設(shè)置為準(zhǔn)雙向口或強(qiáng)推挽模式方可正常使用
//相關(guān)IO: P0.6/P0.7/P1.6/P1.7/P2.1/P2.2
//        P2.3/P2.7/P3.7/P4.2/P4.4/P4.5
/////////////////////////////////////////////////
P2M1 &= 0x7F; P2M0 &= 0x7F;   //設(shè)置P2.7為準(zhǔn)雙向口
P4M1 &= 0xDF; P4M0 &= 0xDF;   //設(shè)置P4.5為準(zhǔn)雙向口

PWM2PWM3_Configuration();   //初始化PWM2和PWM3口
EA = 1;                    //允許總中斷

  while(1)
  {
  delay_ms(100);       //延遲每次指示燈亮度的時(shí)間,更方便觀察實(shí)驗(yàn)現(xiàn)象
  
  if(flag)             //如果標(biāo)識符為1則遞增變量ledpwmval
   ledpwmval++;
  else                 //如果標(biāo)識符為0則遞減變量ledpwmval
   ledpwmval--;
  
   if(ledpwmval>248)    //如果變量ledpwmval遞增到一定值則控制標(biāo)識符為0,以實(shí)現(xiàn)ledpwmval遞減
   flag=0;
  if(ledpwmval==1)     //如果變量ledpwmval遞減到一定值則控制標(biāo)識符為1,以實(shí)現(xiàn)ledpwmval遞增
   flag=1;  
   
  P_SW2 |= 0x80;              //將EAXSFR位置1,以訪問PWM在擴(kuò)展RAM區(qū)的特殊功能寄存器
  PWM2T1 =(uint16)ledpwmval;    //賦值PWM2第一次翻轉(zhuǎn)計(jì)數(shù)器值(不斷變化值)
  PWM2T2 = 0x00FA;              //賦值PWM2第二次翻轉(zhuǎn)計(jì)數(shù)器值(定值)
  PWM3T1 =(uint16)ledpwmval;    //賦值PWM3第一次翻轉(zhuǎn)計(jì)數(shù)器值(不斷變化值)
  PWM3T2 = 0x00FA;              //賦值PWM3第二次翻轉(zhuǎn)計(jì)數(shù)器值(定值)
  P_SW2 &= 0x7F;              //將EAXSFR位置0,恢復(fù)訪問XRAM
  
}
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表