在单片机中 设置pwm时会用到定时器,定时器的作用是什么了 详细一些

#define MAIN_Fosc 11059200L //定义主时钟
#include "15W4KxxS4.H"

#define uint16 unsigned int

#define uint8 unsigned char

/**************************************
功能描述:延时函数
入口参数:uint16 x ,该值为1时,延时1ms
返回值:无
***************************************/
void delay_ms(uint16 x)
{

uint16 j,i;

for(j=0;j<x;j++)

{

for(i=0;i<1100;i++);

}

}

/**************************************************************************************
功能描述:对PWM3和PWM3进行初始化
入口参数:无
返回值:无
**************************************************************************************/
void PWM2PWM3_Configuration(void)
{
PWMCFG &= 0xBF; //将CBTADC位置0,即PWM计数器归零时不触发ADC转换
PWMIF &= 0xBF; //将CBIF位置0,PWM计数器归零中断标志位,需软件清零

P_SW2 |= 0x80;               //将EAXSFR位置1,以访问PWM在扩展RAM区的特殊功能寄存器
//对PWM2的初始化部分
PWM2CR |= 0x08;            //将PWM2_PS位置1,选择PWM2的输出引脚是P2.7
PWMCR |= 0x01;               //将ENC2O位置1,PWM2的端口为PWM输出口,受PWM波形发生器控制 
PWMCFG &= 0xFE;              //将C2INI位置0,设置PWM2输出端口的初始电平为低电平
PWMIF &= 0xFE;               //将C2IF位置0,PWM2中断标志位,需软件清零
PWM2CR |= 0x04;            //将EPWM2I位置1,使能PWM2中断
PWM2CR &= 0xFD;            //将EC2T2SI位置0,关闭T2翻转时中断
PWM2CR &= 0xFE;            //将EC2T1SI位置0,关闭T1翻转时中断
//对PWM3的初始化部分
PWM3CR |= 0x08;            //将PWM3_PS位置1,选择PWM3的输出引脚是P4.5
PWMCR |= 0x02;               //将ENC3O位置1,PWM3的端口为PWM输出口,受PWM波形发生器控制
PWMCFG &= 0xFD;              //将C3INI位置0,设置PWM3输出端口的初始电平为低电平
PWMIF &= 0xFD;               //将C3IF位置0,PWM3中断标志位,需软件清零
PWM3CR |= 0x04;            //将EPWM3I位置1,使能PWM3中断
PWM3CR &= 0xFD;            //将EC3T2SI位置0,关闭T2翻转时中断
PWM3CR &= 0xFE;            //将EC3T1SI位置0,关闭T1翻转时中断
//对PWM2和PWM3翻转计数器赋初值
PWM2T1 =1;                 //赋值PWM2第一次翻转计数器值
PWM2T2 = 0x00FA;           //赋值PWM2第二次翻转计数器值
PWM3T1 =1;                 //赋值PWM3第一次翻转计数器值
PWM3T2 = 0x00FA;           //赋值PWM3第二次翻转计数器值

//对PWM波形发生器时钟源进行初始化
PWMCKS |= 0x10; //将SELT2位置1,PWM时钟源为定时器2溢出脉冲
PWMC = 0x00FA; //PWM计数器赋值(同时对PWMCH和PWMCL进行了赋值)
AUXR |= 0x04; //定时器2时钟为Fosc,即1T
T2L = 0xE0; //设定定时初值
T2H = 0xFE; //设定定时初值
AUXR |= 0x10; //启动定时器2
P_SW2 &= 0x7F; //将EAXSFR位置0,恢复访问XRAM

//PWM外部异常控制寄存器的操作
PWMFDCR &= 0xDF;               //将ENFD位置0,关闭PWM外部异常检测功能
PWMFDCR &= 0xF7;               //将ENDI位置0,关闭PWM异常检测中断
PWMFDCR &= 0xFB;               //将FDCMP位置0,比较器与PWM无关
PWMFDCR &= 0xFD;               //将FDIO位置0,P2.4的状态与PWM无关
PWMFDCR &= 0xFE;               //将FDIF位置0,PWM异常检测中断标志位,需软件清零

IP2 |= 0x40;                   //将PPWM位置1,使能PWM中断为最高优先级中断
//使能PWM波形发生器
PWMCR |= 0x80;               //将ENPWM位置1,使能PWM波形发生器,PWM计数器开始计数
PWMCR &= 0xBF;               //将ECBI位置0,禁止PWM计数器归零中断

}

/***************************************************************************

  • 描 述 : PWM中断服务函数
  • 入 参 : 无
  • 返回值 : 无 **************************************************************************/ void PWM(void) interrupt PWM_VECTOR using 1 { PWMIF &= 0xBF; //将CBIF位置0,PWM计数器归零中断标志位,需软件清零 PWMIF &= 0xFE; //将C2IF位置0,PWM2中断标志位,需软件清零 PWMIF &= 0xFD; //将C3IF位置0,PWM3中断标志位,需软件清零 }

/********************************************************
功能描述:主函数
入口参数:无
返回值:无
*********************************************************/
int main()
{
uint8 flag=1;
uint16 ledpwmval=0;
/////////////////////////////////////////////////
//注意: STC15W4K32S4系列的芯片,上电后所有与PWM相关的IO口均为
// 高阻态,需将这些口设置为准双向口或强推挽模式方可正常使用
//相关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; //设置P2.7为准双向口
P4M1 &= 0xDF; P4M0 &= 0xDF; //设置P4.5为准双向口

PWM2PWM3_Configuration();   //初始化PWM2和PWM3口
EA = 1;                       //允许总中断

while(1)
{
delay_ms(100); //延迟每次指示灯亮度的时间,更方便观察实验现象

    if(flag)             //如果标识符为1则递增变量ledpwmval
        ledpwmval++;
    else                 //如果标识符为0则递减变量ledpwmval
        ledpwmval--;    

    if(ledpwmval>248)    //如果变量ledpwmval递增到一定值则控制标识符为0,以实现ledpwmval递减
        flag=0;
    if(ledpwmval==1)     //如果变量ledpwmval递减到一定值则控制标识符为1,以实现ledpwmval递增
        flag=1;  

    P_SW2 |= 0x80;                  //将EAXSFR位置1,以访问PWM在扩展RAM区的特殊功能寄存器
    PWM2T1 =(uint16)ledpwmval;    //赋值PWM2第一次翻转计数器值(不断变化值)
    PWM2T2 = 0x00FA;              //赋值PWM2第二次翻转计数器值(定值)
    PWM3T1 =(uint16)ledpwmval;    //赋值PWM3第一次翻转计数器值(不断变化值)
    PWM3T2 = 0x00FA;              //赋值PWM3第二次翻转计数器值(定值)
    P_SW2 &= 0x7F;                  //将EAXSFR位置0,恢复访问XRAM

}

}

1个回答

你这个是硬件PWM吗

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐