 
- UID
- 852722
|

STC15W4K32S4系列新增6通道增强型带死区控制高精度PWM波形发生器应用
STC15W4K32S4系列的单片机集成了一组(各自独立6路)增强型的PWM波形发生器。PWM波形发生器内部有一个15位的PWM计数器供6路PWM使用,用户可以设置每路PWM的初始电平。另外,PWM波形发生器为每路PWM又设计了两个用于控制波形翻转的计数器T1/T2,可以非常灵活的每路PWM的高低电平宽度,从而达到对PWM的占空比以及PWM的输出延迟进行控制的目的。由于6路PWM是各自独立的,且每路PWM的初始状态可以进行设定,所以用户可以将其中的任意两路配合起来使用,即可实现互补对称输出以及死区控制等特殊应用。
增强型的PWM波形发生器还设计了对外部异常事件(包括外部端口P2.4的电平异常、比较器比较结果异常)进行监控的功能,可用于紧急关闭PWM输出。PWM波形发生器还可在15位的PWM计数器归零时出发外部事件(ADC转换)。
STC15W4K32S4系列增强型PWM输出端口定义如下:
[PWM2 3.7, PWM3 2.1, PWM4 2.2, PWM5 2.3, PWM6 1.6, PWM7 1.7]
每路PWM的输出端口都可使用特殊功能寄存器位CnPINSEL分别独立的切换到第二组
[PWM2_2 2.7, PWM3_2 4.5, PWM4_2 4.4, PWM5_2 4.2, PWM6_2:P0.7,PWM7_2:P0.6]
所有与PWM相关的端口,在上电后均为高阻输入态,必须在程序中将这些口设置为双向口或强推挽模式才可正常输出波形
端口模式设置相关特殊功能寄存器
符号
| 描述
| 地址
| 位地址及符号
| 初始值
| B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 | P1M1 | P1模式配置1 | 91H |
|
|
|
|
|
|
|
| 0000,0000 | P1M0 | P1模式配置0 | 92H |
|
|
|
|
|
|
|
| 0000,0000 | P0M1 | P0模式配置1 | 93H |
|
|
|
|
|
|
|
| 0000,0000 | P0M0 | P0模式配置0 | 94H |
|
|
|
|
|
|
|
| 0000,0000 | P2M1 | P2模式配置1 | 95H |
|
|
|
|
|
|
|
| 0000,0000 | P2M0 | P2模式配置0 | 96H |
|
|
|
|
|
|
|
| 0000,0000 | P3M1 | P3模式配置1 | B1H |
|
|
|
|
|
|
|
| 0000,0000 | P3M0 | P3模式配置0 | B2H |
|
|
|
|
|
|
|
| 0000,0000 | P4M1 | P4模式配置1 | B3H |
|
|
|
|
|
|
|
| 0000,0000 | P4M0 | P4模式配置0 | B4H |
|
|
|
|
|
|
|
| 0000,0000 | 端口模式设置
PxM1 | PxM0 | 模式
| 0 | 0 | 准双向口
| 0 | 1 | 强推挽输出
| 1 | 0 | 高阻输入
| 1 | 1 | 开漏输出
| 若需要正常使用与PWM相关的端口,则需要将相应的端口设置为准双向口或强推挽输出口
例如将端口均设置为准双向口的汇编代码如下:
MOV P0M0,#00H
MOV P0M1,#00H
MOV P1M0,#00H
MOV P1M1,#00H
MOV P2M0,#00H
MOV P2M1,#00H
MOV P3M0,#00H
MOV P3M1,#00H
MOV P4M0,#00H
MOV P4M1,#00H
增强型PWM波形发生器相关的特殊功能寄存器
符号
| 描述
| 地址
| 位地址及符号
| 初始值
| B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 | P_SW2 | 端口配置寄存器
| BAH | EAXSFR | 0 | 0 | 0 | - | S4_S | S3_S | S2_S | 0000,0000 | PWMCFG | PWM配置 | F1H | - | CBTADC | C7INI | C6INI | C5INI | C4INI | C3INI | C2INI | 0000,0000 | PWMCR | PWM控制 | F5H | ENPWM | ECBI | ENC7O | ENC6O | ENC5O | ENC4O | ENC3O | ENC2O | 0000,0000 | PWMIF | PWM中断标志 | F6H | - | CBIF | C7IF | C6IF | C5IF | C4IF | C3IF | C2IF | x000,0000 | PWMFDCR | PWM外部异常控制 | F7H | - | - | ENFD | FLTFLIO | EFDI | FDCMP | FDIO | FDIF | xx00,0000 | PWMCH | PWM计数器高位 | FFF0H | - | PWMCH[14:8] | x000,0000 | PWMCL | PWM计数器低位 | FFF1H | PWMCL[7:0] | 0000,0000 | PWMCKS | PWM时钟选择 | FFF2H | - | - | - | SELT2 | PS[3:0] | xxx0,0000 | PWM2T1H | PWM2T1计数高位 | FF00H | - | PWM2T1H[14:8] | x000,0000 | PWM2T1L | PWM2T1计数低位 | FF01H | PWM2T1L[7:0] | 0000,0000 | PWM2T2H | PWM2T2计数高位 | FF02H | - | PWM2T2H[14:8] | x000,0000 | PWM2T2L | PWM2T2计数低位 | FF03H | PWM2T2L[7:0] | 0000,0000 | PWM2CR | PWM2控制 | FF04H | - | - | - | - | PWM2_PS | EPWM2I | EC2T2SI | EC2T1SI | xxxx,0000 | PWM3T1H | PWM3T1计数高位 | FF10H | - | PWM3T1H[14:8] | x000,0000 | PWM3T1L | PWM3T1计数低位 | FF11H | PWM3T1L[7:0] | 0000,0000 | PWM3T2H | PWM3T2计数高位 | FF12H | - | PWM3T2H[14:8] | x000,0000 | PWM3T2L | PWM3T2计数低位 | FF13H | PWM3T2L[7:0] | 0000,0000 | PWM3CR | PWM3控制 | FF14H | - | - | - | - | PWM3_PS | EPWM3I | EC3T2SI | EC3T1SI | xxxx,0000 | PWM4T1H | PWM4T1计数高位 | FF20H | - | PWM4T1H[14:8] | x000,0000 | PWM4T1L | PWM4T1计数低位 | FF21H | PWM4T1L[7:0] | 0000,0000 | PWM4T2H | PWM4T2计数高位 | FF22H | - | PWM4T2H[14:8] | x000,0000 | PWM4T2L | PWM4T2计数低位 | FF23H | PWM4T2L[7:0] | 0000,0000 | PWM4CR | PWM4控制 | FF24H | - | - | - | - | PWM4_PS | EPWM4I | EC4T2SI | EC4T1SI | xxxx,0000 | PWM5T1H | PWM5T1计数高位 | FF30H | - | PWM5T1H[14:8] | x000,0000 | PWM5T1L | PWM5T1计数低位 | FF31H | PWM5T1L[7:0] | 0000,0000 | PWM5T2H | PWM5T2计数高位 | FF32H | - | PWM5T2H[14:8] | x000,0000 | PWM5T2L | PWM5T2计数低位 | FF33H | PWM5T2L[7:0] | 0000,0000 | PWM5CR | PWM5控制 | FF34H | - | - | - | - | PWM5_PS | EPWM5I | EC5T2SI | EC5T1SI | xxxx,0000 | PWM6T1H | PWM6T1计数高位 | FF40H | - | PWM6T1H[14:8] | x000,0000 | PWM6T1L | PWM6T1计数低位 | FF41H | PWM6T1L[7:0] | 0000,0000 | PWM6T2H | PWM6T2计数高位 | FF42H | - | PWM6T2H[14:8] | x000,0000 | PWM6T2L | PWM6T2计数低位 | FF43H | PWM6T2L[7:0] | 0000,0000 | PWM6CR | PWM6控制 | FF44H | - | - | - | - | PWM6_PS | EPWM6I | EC6T2SI | EC6T1SI | xxxx,0000 | PWM7T1H | PWM7T1计数高位 | FF50H | - | PWM7T1H[14:8] | x000,0000 | PWM7T1L | PWM7T1计数低位 | FF51H | PWM7T1L[7:0] | 0000,0000 | PWM7T2H | PWM7T2计数高位 | FF52H | - | PWM7T2H[14:8] | x000,0000 | PWM7T2L | PWM7T2计数低位 | FF53H | PWM7T2L[7:0] | 0000,0000 | PWM7CR | PWM7控制 | FF54H | - | - | - | - | PWM7_PS | EPWM7I | EC7T2SI | EC7T1SI | xxxx,0000 |
端口配置寄存器P_SW2
地址:BAH
初始值:0000,0000B
B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 | EAXSFR | 0 | 0 | 0 | - | S4_S | S3_S | S2_S | EAXSFR:扩展SFR访问控制使能
0:MOVX A,@DPTR/MOVX @DPTR,A指令的操作对象为扩展RAM(XRAM)
1:MOVX A,@DPTR/MOVX @DPTR,A指令的操作对象为扩展SFR(XSFR)
注意:若要访问PWM在扩展RAM区的特殊功能寄存器,必须先将EAXSFR位置为1
BIT6,BIT5,BIT4为内部测试使用,用户必须填0
PWM配置寄存器PWMCFG
地址:F1H
初始值:0000,0000B
B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 | - | CBTADC | C7INI | C6INI | C5INI | C4INI | C3INI | C2INI | CBTADC:PWM计数器归零时(CBIF==1时)触发ADC转换
0:PWM计数器归零时不触发ADC转换
1:PWM计数器归零时自动触发ADC转换。(注:前提条件是PWM和ADC必须被使能,即ENPWM==1,且ADCON==1)
CnINI:设置PWM输出端口的初始电平
0:PWM输出端口的初始电平为低电平
1:PWM输出端口的初始电平为高电平
PWM控制寄存器PWMCR
地址:F5H
初始值:0000,0000B
B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 | ENPWM | ECBI | ENC7O | ENC6O | ENC5O | ENC4O | ENC3O | ENC2O | ENPWM:使能增强型PWM波形发生器
0:关闭PWM波形发生器
1:使能PWM波形发生器,PWM计数器开始计数
ECBI:PWM计数器归零中断使能位
0:关闭PWM计数器归零中断(CBIF依然会被硬件置位)
1:使能PWM计数器归零中断
ENCnO:PWM输出使能位
0:相应PWM通道的端口为GPIO
1:相应PWM通道的端口为PWM输出口,受PWM波形发生器控制
PWM中断标志寄存器PWMIF
地址:F6H
初始值:x000,0000B
B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 | - | CBIF | C7IF | C6IF | C5IF | C4IF | C3IF | C2IF | CBIF:PWM计数器归零中断标志位
当PWM计数器归零时,硬件自动将此位置1。当ECBI==1时,程序会跳转到相应中断入口执行中断服务程序。需要软件清零。
CnIF:第n通道的PWM中断标志位
可设置在翻转点1和翻转点2触发CnIF(详见ECnT1SI和ECnT2SI)。当PWM发生翻转时,硬件自动将此位置1。当EPWMnI==1时,程序会跳转到相应中断入口执行中断服务程序。需要软件清零。
PWM外部异常控制寄存器PWMFDCR
地址:F7H
初始值:xx00,0000B
B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 | - | - | ENFD | FLTFLIO | EFDI | FDCMP | FDIO | FDIF | ENFD:PWM外部异常检测功能控制位
0:关闭PWM的外部异常检测功能
1:使能PWM的外部异常检测功能
FLTFLIO:发生PWM外部异常时对PWM输出口控制位
0:发生WM外部异常时,PWM的输出口不作任何改变
1:发生WM外部异常时,PWM的输出口立即被设置为高阻输入模式。(注:只有ENCnO==1所对应的端口才会被强制悬空)
EFDI:PWM异常检测中断使能位
0:关闭PWM异常检测中断(FDIF依然会被硬件置位)
1:使能PWM异常检测中断
FDCMP:设定PWM异常检测源为比较器的输出
0:比较器与PWM无关
1:当比较器的输出由低变高时,触发PWM异常
FDIO:设定PWM异常检测源为端口P2.4的状态
0:P2.4的状态与PWM无关
1:当P2.4的电平由低变高时,触发PWM异常
FDIF:PWM异常检测中断标志位
当发生PWM异常(比较器的输出由低变高或者P2.4的电平由低变高)时,硬件自动将此位置1。当EFDI==1时,程序会跳转到相应中断入口执行中断服务程序。需要软件清零。
PWM计数器的高字节PWMCH(高7位)
地址:FFF0H(XSFR)
初始值:x000,0000B
B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 | - | PWMCH[14:8] | PWM计数器的低字节PWMCL(低8位)
地址:FFF1H(XSFR)
初始值:0000,0000B
B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 | PWMCL[7:0] | PWM计数器位一个15位的寄存器,可设定1~32767之间的任意值作为PWM的周期。PWM波形发生器内部的计数器从0开始计数,每个PWM时钟周期递增1,当内部计数器的计数值达到[PWMCH,PWMCL]所设定的PWM周期时,PWM波形发生器内部的计数器将会从0重新开始开始计数,硬件会自动将PWM归零中断中断标志位CBIF置1,若ECBI==1,程序将跳转到相应中断入口执行中断服务程序。
PWM时钟选择寄存器PWMCKS
地址:FFF2H(XSFR)
初始值:xxx0,0000B
B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 | - | - | - | SELT2 | PS[3:0] | SELT2:PWM时钟源选择
0:PWM时钟源为系统时钟经分频器分频之后的时钟
1:PWM时钟源为定时器2的溢出脉冲
PS[3:0]:系统时钟预分频参数。当SELT2==0时,PWM时钟为系统时钟/(PS[3:0]+1)
PWM2的第一次翻转计数器的高字节PWM2T1H
地址:FF00H(XSFR)
初始值:x000,0000B
B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 | - | PWM2T1H[14:8] | PWM2的第一次翻转计数器的低字节PWM2T1L
地址:FF01H(XSFR)
初始值:0000,0000B
B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 | PWM2T1L[7:0] | PWM2的第二次翻转计时器的高字节PWM2T2H
地址:FF02H(XSFR)
初始值:x000,0000B
B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 | - | PWM2T2H[14:8] | PWM2的第二次翻转计时器的低字节PWM2T2L
地址:FF03H(XSFR)
初始值:0000,0000B
B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 | PWM2T2L[7:0] | PWM波形发生器设计了两个用于控制PWM波形翻转的15位计数器,可设定1~32767之间的任意值。PWM波形发生器内部的计数器的计数值与T1/T2所设定的值相匹配时,PWM的输出波形将发生翻转。
PWM2的控制寄存器PWM2CR
地址:FF04H(XSFR)
初始值:xxxx,0000B
B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 | - | - | - | - | PWM2_PS | EPWM2I | EC2T2SI | EC2T1SI | PWM2_PS:PWM2输出管脚选择位
0:PWM2的输出管脚为PWM2:P3.7
1:PWM2的输出管脚为PWM2_2:P2.7
EPWM2I:PWM2中断使能控制位
0:关闭PWM2中断
1:使能PWM2中断,当C2IF被硬件置1时,程序将跳转到相应中断入口执行中断服务程序。
EC2T2SI:PWM2的T2匹配发生波形翻转时的中断控制位
0:关闭T2翻转时中断
1:使能T2翻转时中断,当PWM波形发生器内部计数值与T2计数器所设定的值相匹配时,PWM的波形发生翻转,同时硬件将C2IF置1,此时若EPWM2I==1,则程序将跳转到相应中断入口执行中断服务程序。
EC2T1SI:PWM2的T1匹配发生波形翻转时的中断控制位
0:关闭T1翻转时中断
1:使能T1翻转时中断,当PWM波形发生器内部计数值与T1计数器所设定的值相匹配时,PWM的波形发生翻转,同时硬件将C2IF置1,此时若EPWM2I==1,则程序将跳转到相应中断入口执行中断服务程序。
PWM3的第一次翻转计数器的高字节PWM3T1H
地址:FF10H(XSFR)
初始值:x000,0000B
B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 | - | PWM3T1H[14:8] | PWM3的第一次翻转计数器的低字节PWM3T1L
地址:FF11H(XSFR)
初始值:0000,0000B
B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 | PWM3T1L[7:0] | PWM3的第二次翻转计时器的高字节PWM3T2H
地址:FF12H(XSFR)
初始值:x000,0000B
B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 | - | PWM3T2H[14:8] | PWM3的第二次翻转计时器的低字节PWM3T2L
地址:FF13H(XSFR)
初始值:0000,0000B
B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 | PWM3T2L[7:0] | PWM波形发生器设计了两个用于控制PWM波形翻转的15位计数器,可设定1~32767之间的任意值。PWM波形发生器内部的计数器的计数值与T1/T2所设定的值相匹配时,PWM的输出波形将发生翻转。
PWM3的控制寄存器PWM3CR
地址:FF14H(XSFR)
初始值:xxxx,0000B
B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 | - | - | - | - | PWM3_PS | EPWM3I | EC3T2SI | EC3T1SI | PWM3_PS:PWM3输出管脚选择位
0:PWM3的输出管脚为PWM3:P2.1
1:PWM3的输出管脚为PWM3_2:P4.5
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,则程序将跳转到相应中断入口执行中断服务程序。
PWM4的第一次翻转计数器的高字节PWM4T1H
地址:FF20H(XSFR)
初始值:x000,0000B
B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 | - | PWM4T1H[14:8] | PWM4的第一次翻转计数器的低字节PWM4T1L
地址:FF21H(XSFR)
初始值:0000,0000B
B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 | PWM4T1L[7:0] | PWM4的第二次翻转计时器的高字节PWM4T2H
地址:FF22H(XSFR)
初始值:x000,0000B
B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 | - | PWM4T2H[14:8] | PWM4的第二次翻转计时器的低字节PWM4T2L
地址:FF23H(XSFR)
初始值:0000,0000B
B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 | PWM4T2L[7:0] | PWM波形发生器设计了两个用于控制PWM波形翻转的15位计数器,可设定1~32767之间的任意值。PWM波形发生器内部的计数器的计数值与T1/T2所设定的值相匹配时,PWM的输出波形将发生翻转。
PWM4的控制寄存器PWM4CR
地址:FF24H(XSFR)
初始值:xxxx,0000B
B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 | - | - | - | - | PWM4_PS | EPWM4I | EC4T2SI | EC4T1SI | PWM4_PS:PWM4输出管脚选择位
0:PWM4的输出管脚为PWM4:P2.2
1:PWM4的输出管脚为PWM4_2:P4.4
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,则程序将跳转到相应中断入口执行中断服务程序。
PWM5的第一次翻转计数器的高字节PWM5T1H
地址:FF30H(XSFR)
初始值:x000,0000B
B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 | - | PWM5T1H[14:8] | PWM5的第一次翻转计数器的低字节PWM5T1L
地址:FF31H(XSFR)
初始值:0000,0000B
B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 | PWM5T1L[7:0] | PWM5的第二次翻转计时器的高字节PWM5T2H
地址:FF32H(XSFR)
初始值:x000,0000B
B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 | - | PWM5T2H[14:8] | PWM5的第二次翻转计时器的低字节PWM5T2L
地址:FF33H(XSFR)
初始值:0000,0000B
B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 | PWM5T2L[7:0] | PWM波形发生器设计了两个用于控制PWM波形翻转的15位计数器,可设定1~32767之间的任意值。PWM波形发生器内部的计数器的计数值与T1/T2所设定的值相匹配时,PWM的输出波形将发生翻转。
PWM5的控制寄存器PWM5CR
地址:FF34H(XSFR)
初始值:xxxx,0000B
B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 | - | - | - | - | PWM5_PS | EPWM5I | EC5T2SI | EC5T1SI | PWM5_PS:PWM5输出管脚选择位
0:PWM5的输出管脚为PWM5:P2.3
1:PWM5的输出管脚为PWM5_2:P4.2
EPWM5I:PWM5中断使能控制位
0:关闭PWM5中断
1:使能PWM5中断,当C5IF被硬件置1时,程序将跳转到相应中断入口执行中断服务程序。
EC5T2SI:PWM5的T2匹配发生波形翻转时的中断控制位
0:关闭T2翻转时中断
1:使能T2翻转时中断,当PWM波形发生器内部计数值与T2计数器所设定的值相匹配时,PWM的波形发生翻转,同时硬件将C5IF置1,此时若EPWM5I==1,则程序将跳转到相应中断入口执行中断服务程序。
EC5T1SI:PWM5的T1匹配发生波形翻转时的中断控制位
0:关闭T1翻转时中断
1:使能T1翻转时中断,当PWM波形发生器内部计数值与T1计数器所设定的值相匹配时,PWM的波形发生翻转,同时硬件将C5IF置1,此时若EPWM5I==1,则程序将跳转到相应中断入口执行中断服务程序。
PWM6的第一次翻转计数器的高字节PWM6T1H
地址:FF40H(XSFR)
初始值:x000,0000B
B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 | - | PWM6T1H[14:8] | PWM6的第一次翻转计数器的低字节PWM6T1L
地址:FF41H(XSFR)
初始值:0000,0000B
B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 | PWM6T1L[7:0] | PWM6的第二次翻转计时器的高字节PWM6T2H
地址:FF42H(XSFR)
初始值:x000,0000B
B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 | - | PWM6T2H[14:8] | PWM6的第二次翻转计时器的低字节PWM6T2L
地址:FF43H(XSFR)
初始值:0000,0000B
B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 | PWM6T2L[7:0] | PWM波形发生器设计了两个用于控制PWM波形翻转的15位计数器,可设定1~32767之间的任意值。PWM波形发生器内部的计数器的计数值与T1/T2所设定的值相匹配时,PWM的输出波形将发生翻转。
PWM6的控制寄存器PWM6CR
地址:FF44H(XSFR)
初始值:xxxx,0000B
B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 | - | - | - | - | PWM6_PS | EPWM6I | EC6T2SI | EC6T1SI | PWM6_PS:PWM6输出管脚选择位
0:PWM6的输出管脚为PWM6:P1.6
1:PWM6的输出管脚为PWM6_2:P0.7
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,则程序将跳转到相应中断入口执行中断服务程序。
PWM7的第一次翻转计数器的高字节PWM7T1H
地址:FF50H(XSFR)
初始值:x000,0000B
B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 | - | PWM7T1H[14:8] | PWM7的第一次翻转计数器的低字节PWM7T1L
地址:FF51H(XSFR)
初始值:0000,0000B
B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 | PWM7T1L[7:0] | PWM7的第二次翻转计时器的高字节PWM7T2H
地址:FF52H(XSFR)
初始值:x000,0000B
B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 | - | PWM7T2H[14:8] | PWM7的第二次翻转计时器的低字节PWM7T2L
地址:FF53H(XSFR)
初始值:0000,0000B
B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 | PWM7T2L[7:0] | PWM波形发生器设计了两个用于控制PWM波形翻转的15位计数器,可设定1~32767之间的任意值。PWM波形发生器内部的计数器的计数值与T1/T2所设定的值相匹配时,PWM的输出波形将发生翻转。
PWM7的控制寄存器PWM7CR
地址:FF54H(XSFR)
初始值:xxxx,0000B
B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 | - | - | - | - | PWM7_PS | EPWM7I | EC7T2SI | EC7T1SI | PWM7_PS:PWM7输出管脚选择位
0:PWM7的输出管脚为PWM7:P1.7
1:PWM7的输出管脚为PWM7_2:P0.6
EPWM7I:PWM7中断使能控制位
0:关闭PWM7中断
1:使能PWM7中断,当C7IF被硬件置1时,程序将跳转到相应中断入口执行中断服务程序。
EC7T2SI:PWM7的T2匹配发生波形翻转时的中断控制位
0:关闭T2翻转时中断
1:使能T2翻转时中断,当PWM波形发生器内部计数值与T2计数器所设定的值相匹配时,PWM的波形发生翻转,同时硬件将C7IF置1,此时若EPWM7I==1,则程序将跳转到相应中断入口执行中断服务程序。
EC7T1SI:PWM7的T1匹配发生波形翻转时的中断控制位
0:关闭T1翻转时中断
1:使能T1翻转时中断,当PWM波形发生器内部计数值与T1计数器所设定的值相匹配时,PWM的波形发生翻转,同时硬件将C7IF置1,此时若EPWM7I==1,则程序将跳转到相应中断入口执行中断服务程序。
PWM波形发生器中断控制
PWM波形发生器中断相关的寄存器
IP2 | 中断优先级控制
| B5H | - | - | - | PX4 | PPWMFD | PPWM | PSPI | PS2 | xxx0,0000 | PWMCR | PWM控制 | F5H | ENPWM | ECBI | ENC7O | ENC6O | ENC5O | ENC4O | ENC3O | ENC2O | 0000,0000 | PWMIF | PWM中断标志 | F6H | - | CBIF | C7IF | C6IF | C5IF | C4IF | C3IF | C2IF | x000,0000 | PWMFDCR | PWM外部异常控制 | F7H | - | - | ENFD | FLTFLIO | EFDI | FDCMP | FDIO | FDIF | xx00,0000 | PWM2CR | PWM2控制 | FF04H | - | - | - | - | PWM2_PS | EPWM2I | EC2T2SI | EC2T1SI | xxxx,0000 | PWM3CR | PWM3控制 | FF14H | - | - | - | - | PWM3_PS | EPWM3I | EC3T2SI | EC3T1SI | xxxx,0000 | PWM4CR | PWM4控制 | FF24H | - | - | - | - | PWM4_PS | EPWM4I | EC4T2SI | EC4T1SI | xxxx,0000 | PWM5CR | PWM5控制 | FF34H | - | - | - | - | PWM5_PS | EPWM5I | EC5T2SI | EC5T1SI | xxxx,0000 | PWM6CR | PWM6控制 | FF44H | - | - | - | - | PWM6_PS | EPWM6I | EC6T2SI | EC6T1SI | xxxx,0000 | PWM7CR | PWM7控制 | FF54H | - | - | - | - | PWM7_PS | EPWM7I | EC7T2SI | EC7T1SI | xxxx,0000 |
中断向量地址及中断控制
中断名称
| 入口地址
| 优先级设置
| 中断请求位
| 中断允许控制
| 中断标志清除方式
| PWM中断 | 00B3H (22) | PPWM | CBIF | ENPWM/ECBI/EA | 需软件清除
| C2IF | ENPWM/ EPWM2I/ EC2T2SI|| EC2T1SI/EA | 需软件清除
| C3IF | ENPWM/ EPWM3I/ EC3T2SI|| EC3T1SI/EA | 需软件清除
| C4IF | ENPWM/ EPWM4I/ EC4T2SI|| EC4T1SI/EA | 需软件清除
| C5IF | ENPWM/ EPWM5I/ EC5T2SI|| EC5T1SI/EA | 需软件清除
| C6IF | ENPWM/ EPWM6I/ EC6T2SI|| EC6T1SI/EA | 需软件清除
| C7IF | ENPWM/ EPWM7I/ EC7T2SI|| EC7T1SI/EA | 需软件清除
| PWM异常检测中断 | 00BBH (23) | PPWMFD | FDIF | ENPWM/ENFD/EFDI/EA | 需软件清除
|
在Keil C中声明中断函数
void PWM_Routine(void) interrupt 22;
void PWMFD_Routine(void) interrupt 23;
PWM波形发生器的结构框图

汇编示例代码1
假如要生成一个重复的PWM波形,波形如下:
PWM波形发生器的时钟频率为系统时钟/4,波形由通道4输出,周期为20个PWM时钟,占空比为1/3,由4个PWM时钟的相位延迟(波形如下图所示)

汇编代码可以如下设计:
;; +-------------------------+
;; | Global Configuration
|
;; +-------------------------+
; Set EAXSFR to enable xSFRwriting against XRAM writing
mov
A, P_SW2
orl
A, #10000000B
mov
P_SW2, A
;
; Set channel-4 outputregister start at LOW
mov
A, PWMCFG
anl
A, #11111011B
; channel-4 start at LOW
mov
PWMCFG, A
;
; Set a clock of thewaveform generator consists of 4 Fosc
mov
DPTR, #PWMCKS
; FFF2H
mov
A, #00000011B
movx
@DPTR, A
;
; Set period as 20
; {PWMCH,PWMCL} <= 19
mov
DPTR, #PWMCH
; FFF0H
mov
A, #00H
; PWMCH should be changed first
movx
@DPTR, A
mov
DPTR, #PWMCL
; FFF1H
mov
A, #13H
; Write PWMCL simultaneous update PWMCH
movx
@DPTR, A
;
;; +-------------------------+
;; | Channel-4 Configuration |
;; +-------------------------+
; Set toggle point 1 ofChannel-4 as 3
mov
DPTR, #PWM4T1H
; FF20H
mov
A, #00H
movx
@DPTR, A
;
mov
DPTR, #PWM4T1L
; FF21H
mov
A, #03H
movx
@DPTR, A
;
; Set toggle point 2 of Channel-4 as 16
mov
DPTR, #PWM4T2H
; FF22H
mov
A, #00H
movx
@DPTR, A
;
mov
DPTR, #PWM4T2L
; FF23H
mov
A, #10H
movx
@DPTR, A
;
; Set Channel-4 output pinas default, and disable interrupting
mov
DPTR, #PWM4CR
; FF24H
mov
A, #00H
movx
@DPTR, A
;
; Clear EAXSFR to disablexSFR, return movx-DPTR to normal XRAM access
mov
A, P_SW2
anl
A, #01111111B
mov
P_SW2, A
;
;; +-------------------------+
;; | Operate PWM output
|
;; +-------------------------+
; Enable counter counting,and enable Channel-4 output
mov
A, PWMCR
orl
A, #10000100B
mov
PWMCR, A
;
汇编示例代码2
假如要生成两个互补对称输出的PWM波形,波形如下:
PWM波形发生器的时钟频率为系统时钟/4,波形由信道4和信道5输出,,周期为20个PWM时钟,通道4的有效高电平为13个PWM时钟,通道5的有效低电平为10个PWM时钟,信道4和信道5前端死区为2个PWM时钟,末端死区为1个PWM时钟(波形如下图所示)

汇编代码可以如下设计:
;; +-------------------------+
;; | Global Configuration
|
;; +-------------------------+
;;;
;;; Set EAXSFR to enablexSFR writing against XRAM writing
;;;
mov
A, P_SW2
orl
A, #10000000B
mov
P_SW2, A
;
; Set channel-4 outputregister start at LOW, channel-5 at HIGH
mov
A, PWMCFG
anl
A, #11111011B
; channel-4 start at LOW
orl
A, #00001000B
; channel-5 start at HIGH
mov
PWMCFG, A
;
; Set a clock of thewaveform generator consists of 4 Fosc
mov
DPTR, #PWMCKS
; FFF2H
mov
A, #00000011B
movx
@DPTR, A
;
; Set period as 20
; {PWMCH,PWMCL} <= 19
mov
DPTR, #PWMCH
; FFF0H
mov
A, #00H
; PWMCH should be changed first
movx
@DPTR, A
mov
DPTR, #PWMCL
; FFF1H
mov
A, #13H
; Write PWMCL simultaneous update PWMCH
movx
@DPTR, A
;
;; +-------------------------+
;; | Channel-4 Configuration |
;; +-------------------------+
; Set toggle point 1 ofChannel-4 as 3
mov
DPTR, #PWM4T1H
;FF20H
mov
A, #00H
movx
@DPTR, A
;
mov
DPTR, #PWM4T1L
; FF21H
mov
A, #03H
movx
@DPTR, A
;
; Set toggle point 2 ofChannel-4 as 16
mov
DPTR, #PWM4T2H
;FF22H
mov
A, #00H
movx
@DPTR, A
;
mov
DPTR, #PWM4T2L
; FF23H
mov
A, #10H
movx
@DPTR, A
;
; Set Channel-4 output pinas default, and disable interrupting
mov
DPTR, #PWM4CR
; FF24H
mov
A, #00H
movx
@DPTR, A
;
;; +-------------------------+
;; | Channel-5 Configuration |
;; +-------------------------+
; Set toggle point 1 ofChannel-5 as 5
mov
DPTR, #PWM5T1H
; FF30H
mov
A, #00H
movx
@DPTR, A
;
mov
DPTR, #PWM5T1L
; FF31H
mov
A, #03H
movx
@DPTR, A
;
; Set toggle point 3 of Channel-5as 15
mov
DPTR, #PWM5T2H
; FF32H
mov
A, #00H
movx
@DPTR, A
;
mov
DPTR, #PWM5T2L
; FF33H
mov
A, #0FH
movx
@DPTR, A
;
; Set Channel-5 output pinas default, and disable interrupting
mov
DPTR, #PWM5CR
; FF34H
mov
A, #00H
movx
@DPTR, A
;
;;; Clear EAXSFR to disable xSFR, return movx-DPTR to normal XRAM access
mov
A, P_SW2
anl
A, #01111111B
mov
P_SW2, A
;
;; +-------------------------+
;; | Operate PWM output
|
;; +-------------------------+
; Enable counter counting,and enable Channel-4 and Channel-5 output
mov
A, PWMCR
orl
A, #10001100B
mov
PWMCR, A
;
两通道CCP/PCA/增强PWM相关SFR
符号
| 描述
| 地址
| 位地址及符号
| 初始值
| B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 | CCON |
| D8H | CF | CR | - | - | - | - | CCF1 | CCF0 | 00xx,xx00 | CMOD |
| D9H | CIDL | - | - | - | CPS2 | CPS1 | CPS0 | ECF | 0xxx,0000 | CCAPM0 |
| DAH | - | ECOM0 | CCAPP0 | CCAPN0 | MAT0 | TOG0 | PWM0 | ECCF0 | x000,0000 | CCAPM1 |
| DBH | - | ECOM1 | CCAPP1 | CCAPN1 | MAT1 | TOG1 | PWM1 | ECCF1 | x000,0000 | CL |
| E9H |
|
|
|
|
|
|
|
| 0000,0000 | CH |
| F9H |
|
|
|
|
|
|
|
| 0000,0000 | CCAP0L |
| EAH |
|
|
|
|
|
|
|
| 0000,0000 | CCAP0H |
| FAH |
|
|
|
|
|
|
|
| 0000,0000 | CCAP1L |
| EBH |
|
|
|
|
|
|
|
| 0000,0000 | CCAP1H |
| FBH |
|
|
|
|
|
|
|
| 0000,0000 | PCA_PWM0 |
| F2H | EBS0_1 | EBS0_0 | PWM0_B9H | PWM0_B8H | PWM0_B9L | PWM0_B8L | EPC0H | EPC0L | 0000,0000 | PCA_PWM1 |
| F3H | EBS1_1 | EBS1_0 | PWM1_B9H | PWM1_B8H | PWM1_B9L | PWM1_B8L | EPC1H | EPC1L | 0000,0000 | STC15W4K32S4的两路CCP与STC12F2K60S2的CCP完全兼容,并在STC12F2K60S2的CCP的基础上对PWM的功能进行增强,不仅可将STC15W4K32S4的CCP设置为6/7/8位PWM,还可设置为10位PWM。10位PWM的低字节仍用CCAP0L/CCAP1L设置(CCAP0H/CCAP1H为重装值),10位PWM的高两位使用[PWM0_B9L,PWM0_B8L]/[PWM1_B9L,PWM1_B8L]进行设置([PWM0_B9H,PWM0_B8H]/ [PWM1_B9H,PWM1_B8H] 为重装值)。
[EBS0_1,EBS0_0]:
00:PWM0为8位PWM模式
01:PWM0为7位PWM模式
10:PWM0为6位PWM模式
11:PWM0为10位PWM模式
[EBS1_1,EBS1_0]:
00:PWM1为8位PWM模式
01:PWM1为7位PWM模式
10:PWM1为6位PWM模式
11:PWM1为10位PWM模式
10位PWM的比较值由{PWMn_B9L,PWMn_B8L,CCAPnL[7:0]}组成,10重装值由{PWMn_B9H,PWMn_B8H,CCAPnH[7:0]}组成 注意:在更新重装值时,必须先写高两位PWMn_B9H,PWMn_B8H,后写低八位CCAPnH |
|