STC15系列PWM中断控制寄存器介绍以及PWM相关示例

Posted perseverance52

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STC15系列PWM中断控制寄存器介绍以及PWM相关示例相关的知识,希望对你有一定的参考价值。

STC15系列PWM中断控制寄存器介绍以及PWM呼吸灯代码实现


📓增强型PWM波形发生器的中断控制

1.PWM中断优先级控制寄存器:IP2

  • PPWMFD:PWM异常检测中断优先级控制位。
    当PPWMFD=0时,PWM异常检测中断为最低优先级中断(优先级0)
    当PPWMFD-1时,PWM异常检测中断为最高优先级中断(优先级1)
  • PPWM: PWM中断优先级控制位。
    当PPWM=0时,PWM中断为最低优先级中断(优先级0)
    当PPWM=1时,PWM中断为最高优先级中断(优先级1

中断优先级控制寄存器IP和IP2的各位都由可用户程序置“1”和清“0”。但IP寄存器可位操作,所以可用位操作指令或字节操作指令更新IP的内容。而IP2寄存器的内容只能用字节操作指令来更新。STC15系列单片机复位后IP和IP2均为00H,各个中断源均为低优先级中断。

2. PWM控制寄存器:PWMCR

  • ECBI :PWM计数器归零中断使能位
    0:关闭PWM计数器归零中断(CBIF依然会被硬件置位)
    1:使能PWM计数器归零中断

3. PWM中断标志寄存器:PWMIF

  • CBIF :PWM计数器归零中断标志位
    当PWM计数器归零时,硬件自动将此位置1。当ECBI==1时,程序会跳转到相应中断
    入口执行中断服务程序。需要软件清零。
  • C7IF :第7通道的PWM中断标志位
    可设置在翻转点1和翻转点2触发C7IF(详见EC7T1SI和EC7T2SI)。当PWM发生翻转时,硬件自动将此位置1。当EPWM7I==1时,程序会跳转到相应中断入口执行中断服务程序。需要软件清零。
  • C6IF:第6通道的PWM中断标志位
    可设置在翻转点1和翻转点2触发C6IF (详见EC6TISI和EC6T2SI)当PWM发生翻转时,硬件自动将此位置1。程序会跳转到相应中断入口执行中断服务程序。需要软件清零。
  • C5IF:第S通道的PWM中断标志位
    可设置在翻转点1和翻转点2触发CSIF(详见ECSTISI和ECST2SI) 。当PWM发生翻转当EPWMSI–1时,程序会跳转到相应中断入口执行中断服时,硬件自动将此位置1。务程序。需要软件清零。
  • C4IF:第4通道的PWM中断标志位
    可设置在翻转点1和翻转点2触发C4IF (详见EC4TISI和EC4T2SI) 。当PWM发生翻转时,硬件自动将此位置1。当EPWM4–1时,程序会跳转到相应中断入口执行中断服务程序。需要软件清零。
  • C3FF:第3通道的PWM中断标志位
    可设置在翻转点1和翻转点2触发C3IF (详见EC3TISI和EC3T2SI) 。当PWM发生翻转时,硬件自动将此位置1。当EPWM3I–1时,程序会跳转到相应中断入口执行中断服务程序。需要软件清零。
  • C2IF:第2通道的PWM中断标志位
    可设置在翻转点1和翻转点2触发C2IF (详见EC2T1SI和EC2T2SI) 。当PWM发生翻转时,硬件自动将此位置1。当EPWM2I–1时,程序会跳转到相应中断入口执行中断服务程序。需要软件清零。

4. PWM外部异常控制寄存器:PWMFDCR

  • EFDI :PWM异常检测中断使能位
    0:关闭PWM异常检测中断(FDIF�然会被硬件置位)
    1:使能PWM异常检测中断
  • FDIF :PWM异常检测中断标志位
    当发生PWM异常(比较器正极P5.5/CMP+的电平比比较器负极P5.4/CMP-的电平高
    或比较器正极 比较器正极P5.5/CMP+的电平比内部参考电压源1.28V高或者P2.4的电平为高) 为高)
    时,硬件自动将此位置1。当EFDI==1时,程序会跳转到相应中断入口执行中断服务程序。需要软件清零。

5. PWM2的控制寄存器:PWM2CR

  • EPWM2I :PWM2中断使能控制位
    0:关闭PWM2中断
    1:使能PWM2中断,当C2IF被硬件置1时,程序将跳转到相应中断入口执行中断服务程序。
  • EC2T2SI:PWM2的T2匹配发生波形翻转时的中断控制位
    0:关闭T2翻转时中断
    1:使能T2翻转时中断,当PWM波形发生器内部计数值与T2计数器所设定的值相匹配时,PWM的波形发生翻转,同时硬件将C2正F置1,此时若EPWM2I–1,则程序将跳转到相应中断入口执行中断服务程序
  • EC2T1SI :PWM2的T1匹配发生波形翻转时的中断控制位
    0:关闭T1翻转时中断
    1:使能T1翻转时中断,当PWM波形发生器内部计数值与T1计数器所设定的值相匹配时,PWM的波形发生翻转,同时硬件将C2IF置1,此时若EPWM2I==1,则程序将跳转到相应中断入口执行中断服务程序。

6. PWM3的控制寄存器:PWM3CR

  • EPWM3I :PWM3中断使能控制位
    0:关闭PWM3中断
    1:使能PWM3中断,当C3IF被硬件置1时,程序将跳转到相应中断入口执行中断服务
    程序。
  • EC3T2SI :PWM3的T2匹配发生波形翻转时的中断控制位
    0:关闭T2翻转时中断
    1:使能T2翻转时中断,当PWM波形发生器内部计数值与T2计数器所设定的值相匹配时,PWM的波形发生翻转,同时硬件将C3IF置1,此时若EPWM3I==1,则程序将跳转到相应中断入口执行中断服务程序。
  • EC3T1SI :PWM3的T1匹配发生波形翻转时的中断控制位
    0:关闭T1翻转时中断
    1:使能T1翻转时中断,当PWM波形发生器内部计数值与T1计数器所设定的值相匹配时,PWM的波形发生翻转,同时硬件将C3IF置1,此时若EPWM3I==1,则程序将跳转到相应中断入口执行中断服务程序。

7.PWM4的控制寄存器: PWM4CR

  • EPWM4I :PWM4中断使能控制位
    0:关闭PWM4中断
    1:使能PWM4中断,当C4IF被硬件置1时,程序将跳转到相应中断入口执行中断服务程序。
  • EC4T2SI :PWM4的T2匹配发生波形翻转时的中断控制位
    0:关闭T2翻转时中断
    1:使能T2翻转时中断,当PWM波形发生器内部计数值与T2计数器所设定的值相匹配时,PWM的波形发生翻转,同时硬件将C4IF置1,此时若EPWM4I==1,则程序将跳转到相应中断入口执行中断服务程序。
  • EC4T1SI :PWM4的T1匹配发生波形翻转时的中断控制位
    0:关闭T1翻转时中断
    1:使能T1翻转时中断,当PWM波形发生器内部计数值与T1计数器所设定的值相匹配时,PWM的波形发生翻转,同时硬件将C4IF置1,此时若EPWM4I==1,则程序将跳转到相应中断入口执行中断服务程序。

8. PWM5的控制寄存器:PWM5CR

  • EPWM5I :PWM5中断使能控制位
    0:关闭PWM5中断
    1:使能PWM5中断,当C5IF被硬件置1时,程序将跳转到相应中断入口执行中断服务程序。
  • EC5T2SI :PWM5的T2匹配发生波形翻转时的中断控制位
    0:关闭T2翻转时中断
    1:使能T2翻转时中断,当PWM波形发生器内部计数值与T2计数器所设定的值相匹配时,PWM的波形发生翻转,同时硬件将C5IF置1,此时若EPWM5I==1,则程序将跳转到相应中断入口执行中断服务程序。
  • ECSTISI:PWM5的Tl配发生波形翻转时的中断控制位
    0: 关闭TI翻转时中断
    1:使能T1翻转时中断,当PWM波形发生器内部计数值与T1计数器所设定的值相匹配时,PWM的波形发生翻转,同时硬件将CSIF置1,此时若EPWMSI==1,则程序将跳转到相应中断入口执行中断服务程序

9.PWM6的控制寄存器:PWM6CR

  • EPWM6I :PWM6中断使能控制位
    0:关闭PWM6中断
    1:使能PWM6中断,当C6IF被硬件置1时,程序将跳转到相应中断入口执行中断服务程序。
  • EC6T2SI :PWM6的T2匹配发生波形翻转时的中断控制位
    0:关闭T2翻转时中断
    1:使能T2翻转时中断,当PWM波形发生器内部计数值与T2计数器所设定的值相匹配时,PWM的波形发生翻转,同时硬件将C6IF置1,此时若EPWM6I==1,则程序将跳转到相应中断入口执行中断服务程序。
  • EC6T1SI :PWM6的T1匹配发生波形翻转时的中断控制位
    0:关闭T1翻转时中断
    1:使能T1翻转时中断,当PWM波形发生器内部计数值与T1计数器所设定的值相匹配时,PWM的波形发生翻转,同时硬件将C6IF置1,此时若EPWM6I==1,则程序将跳转到相应中断入口执行中断服务程序。

10. PWM7的控制寄存器:PWM7CR

  • EPWM7I :PWM7中断使能控制位
    0:关闭PWM7中断
    1:使能PWM7中断,当C7IF被硬件置1时,程序将跳转到相应中断入口执行中断服务程序。
  • EC7T2SI:PWM7的T2匹配发生波形翻转时的中断控制位
    0:关闭T2翻转时中断
    1:使能T2翻转时中断,当PWM波形发生器内部计数值与T2计数器所设定的值相匹配时,PWM的波形发生翻转,同时硬件将C7IF置1,此时若EPWM7I–1,则程序将跳转到相应中断入口执行中断服务程序。
  • EC7TISI:PWM7的TI匹配发生波形翻转时的中断控制位
    0:关闭T1翻转时中断
    1:使能T1翻转时中断,当PWM波形发生器内部计数值与T1计数器所设定的值相匹配时,PWM的波形发生翻转,同时硬件将C7IF置1,此时若EPWM7I-1,则程序将跳转到相应中断入口执行中断服务程序。

中断向量地址及中断控制

  • 在Keil C中声明中断函数:
void PWM_Routine(void)  interrupt 22;
void PWMFD_Routine(void) interrupt 23;
  • PWM波形发生器的结构框图

🌻PWM呼吸灯实现代码

  • 🎉本示例选择PWM的时钟为Fosc/1,PWM周期为:4096,也就是PWM频率为:2.7KHz。
  • 🎞逻辑分析仪测量数据:
/*---------------------------------------------------------------------*/
/* --- STC MCU Limited ------------------------------------------------*/
/* --- STC15Fxx 系列 使用PWM实现渐变灯实例-----------------------------*/
/* --- Mobile: (86)13922805190 ----------------------------------------*/
/* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
/* --- Tel: 86-0513-55012928,55012929,55012966-------------------------*/
/* --- Web: www.STCMCU.com --------------------------------------------*/
/* --- Web: www.GXWMCU.com --------------------------------------------*/
/* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序        */
/* 如果要在文章中应用此代码,请在文章中注明使用了STC的资料及程序        */
/*---------------------------------------------------------------------*/

//本示例在Keil开发环境下请选择Intel的8058芯片型号进行编译
//若无特别说明,工作频率一般为11.0592MHz


#include "reg51.h"

#define CYCLE   0x1000L     //4096定义PWM周期2.7KHz

#define PWMC        (*(unsigned int  volatile xdata *)0xfff0)
#define PWMCH       (*(unsigned char volatile xdata *)0xfff0)
#define PWMCL       (*(unsigned char volatile xdata *)0xfff1)
#define PWMCKS      (*(unsigned char volatile xdata *)0xfff2)
#define PWM2T1      (*(unsigned int  volatile xdata *)0xff00)
#define PWM2T1H     (*(unsigned char volatile xdata *)0xff00)
#define PWM2T1L     (*(unsigned char volatile xdata *)0xff01)
#define PWM2T2      (*(unsigned int  volatile xdata *)0xff02)
#define PWM2T2H     (*(unsigned char volatile xdata *)0xff02)
#define PWM2T2L     (*(unsigned char volatile xdata *)0xff03)
#define PWM2CR      (*(unsigned char volatile xdata *)0xff04)
#define PWM3T1      (*(unsigned int  volatile xdata *)0xff10)
#define PWM3T1H     (*(unsigned char volatile xdata *)0xff10)
#define PWM3T1L     (*(unsigned char volatile xdata *)0xff11)
#define PWM3T2      (*(unsigned int  volatile xdata *)0xff12)
#define PWM3T2H     (*(unsigned char volatile xdata *)0xff12)
#define PWM3T2L     (*(unsigned char volatile xdata *)0xff13)
#define PWM3CR      (*(unsigned char volatile xdata *)0xff14)
#define PWM4T1      (*(unsigned int  volatile xdata *)0xff20)
#define PWM4T1H     (*(unsigned char volatile xdata *)0xff20)
#define PWM4T1L     (*(unsigned char volatile xdata *)0xff21)
#define PWM4T2      (*(unsigned int  volatile xdata *)0xff22)
#define PWM4T2H     (*(unsigned char volatile xdata *)0xff22)
#define PWM4T2L     (*(unsigned char volatile xdata *)0xff23)
#define PWM4CR      (*(unsigned char volatile xdata *)0xff24)
#define PWM5T1      (*(unsigned int  volatile xdata *)0xff30)
#define PWM5T1H     (*(unsigned char volatile xdata *)0xff30)
#define PWM5T1L     (*(unsigned char volatile xdata *)0xff31)
#define PWM5T2      (*(unsigned int  volatile xdata *)0xff32)
#define PWM5T2H     (*(unsigned char volatile xdata *)0xff32)
#define PWM5T2L     (*(unsigned char volatile xdata *)0xff33)
#define PWM5CR      (*(unsigned char volatile xdata *)0xff34)
#define PWM6T1      (*(unsigned int  volatile xdata *)0xff40)
#define PWM6T1H     (*(unsigned char volatile xdata *)0xff40)
#define PWM6T1L     (*(unsigned char volatile xdata *)0xff41)
#define PWM6T2      (*(unsigned int  volatile xdata *)0xff42)
#define PWM6T2H     (*(unsigned char volatile xdata *)0xff42)
#define PWM6T2L     (*(unsigned char volatile xdata *)0xff43)
#define PWM6CR      (*(unsigned char volatile xdata *)0xff44)
#define PWM7T1      (*(unsigned int  volatile xdata *)0xff50)
#define PWM7T1H     (*(unsigned char volatile xdata *)0xff50)
#define PWM7T1L     (*(unsigned char volatile xdata *)0xff51)
#define PWM7T2      (*(unsigned int  volatile xdata *)0xff52)
#define PWM7T2H     (*(unsigned char volatile xdata *)0xff52)
#define PWM7T2L     (*(unsigned char volatile xdata *)0xff53)
#define PWM7CR      (*(unsigned char volatile xdata *)0xff54)

sfr PIN_SW2 =   0xba;

sfr P0M1    =   0x93;
sfr P0M0    =   0x94;
sfr P1M1    =   0x91;
sfr P1M0    =   0x92;
sfr P2M1    =   0x95;
sfr P2M0    =   0x96;
sfr P3M1    =   0xb1;
sfr P3M0    =   0xb2;
sfr P4M1    =   0xb3;
sfr P4M0    =   0xb4;
sfr P5M1    =   0xC9;
sfr P5M0    =   0xCA;
sfr P6M1    =   0xCB;
sfr P6M0    =   0xCC;
sfr P7M1    =   0xE1;
sfr P7M0    =   0xE2;

sfr PWMCFG  =   0xf1;
sfr PWMCR   =   0xf5;
sfr PWMIF   =   0xf6;
sfr PWMFDCR =   0xf7;

void pwm_isr() interrupt 22

    static bit dir = 1;
    static int val = 0;
    
    if (PWMIF & 0x40)
    
        PWMIF &= ~0x40;
        
        if (dir)
        
            val++;
            if (val >= CYCLE) dir = 0;
        
        else
        
            val--;
            if (val <= 1) dir = 1;
        
        PIN_SW2 |= 0x80;
        PWM2T2 = val;
        PIN_SW2 &= ~0x80;
    


void main()

    P0M0 = 0x00;//配置IO组为准双向口
    P0M1 = 0x00;
    P1M0 = 0x00;
    P1M1 = 0x00;
    P2M0 = 0x00;
    P2M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;

    PIN_SW2 |= 0x80;                //使能访问XSFR
    PWMCFG = 0x00;                  //配置PWM的输出初始电平为低电平
    PWMCKS = 0x00;                  //选择PWM的时钟为Fosc/1
    PWMC = CYCLE;                   //设置PWM周期
    PWM2T1 = 0x0000;                //设置PWM2第1次反转的PWM计数
    PWM2T2 = 0x0001;                //设置PWM2第2次反转的PWM计数
                                    //占空比为(PWM2T2-PWM2T1)/PWMC
    PWM2CR = 0x00;                  //选择PWM2输出到P3.7,不使能PWM2中断
    PWMCR = 0x01;                   //使能PWM信号输出
    PWMCR |= 0x40;                  //使能PWM归零中断
    PWMCR |= 0x80;                  //使能PWM模块
    PIN_SW2 &= ~0x80;

    EA = 1;

    while (1);



🌼使用增强型PWM控制舞台灯光示例

/*---------------------------------------------------------------------*/
/* --- STC MCU Limited ------------------------------------------------*/
/* --- STC15Fxx 系列 使用增强型PWM控制舞台灯光示例---------------------*/
/* --- Mobile: (86)13922805190 ----------------------------------------*/
/* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
/* --- Tel: 86-0513-55012928,55012929,55012966-------------------------*/
/* --- Web: www.STCMCU.com --------------------------------------------*/
/* --- Web: www.GXWMCU.com --------------------------------------------*/
/* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序        */
/* 如果要在文章中应用此代码,请在文章中注明使用了STC的资料及程序        */
/*---------------------------------------------------------------------*/

//本示例在Keil开发环境下请选择Intel的8058芯片型号进行编译
//若无特别说明,工作频率一般为11.0592MHz


#include "reg51.h"

#define CYCLE   0x1000L     //定义PWM周期(最大值为32767)

#define PWMC        (*(unsigned int  volatile xdata *)0xfff0)
#define PWMCH       (*(unsigned char volatile xdata *)0xfff0)
#define PWMCL       (*(unsigned char volatile xdata *)0xfff1)
#define PWMCKS      (*(unsigned char volatile xdata *)0xfff2)
#define PWM2T1      (*(unsigned int  volatile xdata *)0xff00)
#define PWM2T1H     (*(unsigned char volatile xdata *)0xff00)
#define PWM2T1L     (*(unsigned char volatile xdata *)0xff01)
#define PWM2T2      (*(unsigned int  volatile xdata *)0xff02)
#define PWM2T2H     (*(unsigned char volatile xdata *)0xff02)
#define PWM2T2L     (*(unsigned char volatile xdata *)0xff03)
#define PWM2CR      (*(unsigned char volatile xdata *)0xff04)
#define PWM3T1      (*(unsigned int  volatile xdata *)0xff10)
#define PWM3T1H     (*(unsigned char volatile xdata *)0xff10)
#define PWM3T1L     (*(以上是关于STC15系列PWM中断控制寄存器介绍以及PWM相关示例的主要内容,如果未能解决你的问题,请参考以下文章

STC15系列PWM相关功能寄存器介绍

11.STC15W408AS单片机CCP/PCA/PWM应用

11.STC15W408AS单片机CCP/PCA/PWM应用

11.STC15W408AS单片机CCP/PCA/PWM应用

11.STC15W408AS单片机CCP/PCA/PWM应用

STC12C系列单片机PWM脉宽调制