找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2127|回复: 0
打印 上一主题 下一主题
收起左侧

为什么在单片机pwm设置时T2是定值?最好说一下pwm的工作过程定时器的作用

[复制链接]
跳转到指定楼层
#
ID:381002 发表于 2019-3-20 18:25 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
5黑币
#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
  
}
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表