为了便于对照PWM功能引脚,附上TSSOP20封装的HC18M003单片机引脚分布图
HC18M003集成了1组12位PWM模块,提供PWM0/PWM1两路输出,通过控制相关寄存器可使每对 PWM 输出配置成互补输出模式或独立输出模式。和PWM有关的寄存器如下:
※使能寄存器 PWMEN
※FLT模式寄存器FLTMODE
※PWM模式寄存器PWMM
※PWM0控制寄存器PWM0C
※PWM0周期寄存器PWM0PL、PWM0PH
※PWM0占空比寄存器PWM0DL、PWM0DH
※PWM0死区时间寄存器PWM0DTL、PWM0DH
一、使能寄存器 PWMEN
PWM0_EN控制PWM0的使能
PWM1_EN控制PWM1的使能
二、FLT模式寄存器FLTMODE
EFLT0=0时,第10引脚可以作为GPIO用,或者复用为其它功能。
EFLT0=1时,第10引脚为FLT0使用,此时作为输入引脚。输入的电平信号可以控制PWM0的输出。一旦检测到FLT0 引脚输入有效电平,PWM 输出会立即关闭,但 PWM 内部计数器仍在继续运行,这样方便在 FLT0引脚错误去除后继续 PWM 输出。在 FLT0 输入信号有效期间,FLT0S 位无法清除。只有当 FLT0 输入信号消失后,才能软件清除 FLT0S 状态位,此时 PWM 恢复正常输出。
FLT0_MODE用来设置在故障期间PWM0和PWM1的输出状态。
三、PWM模式寄存器PWMM
PWM0M控制位控制PWM0和PWM1是互补输出,还是各自独立输出。
RELOAD0控制位控制PWM0是否执行自动重载功能,默认为1,执行自动重载。
四、PWM0控制寄存器PWM0C
PWM0IE用于控制是否允许PWM产生中断。
PWM0IF是中断标志位,在允许PWM中断,且发生PWM中断时,硬件自动设置该标志位。标志位的清除只能由软件实现。
FLT0S是PWM0 FLT的状态标志位。在检测到FLT0 引脚输入端存在有效电平时,该标志位被建立。同样该标志位的清除只能由软件实现。
FLT0C是PWM0 FLT 引脚配置位,用于控制FLT有效期间PWM是否输出。
PWM0S是PWM0和PWM01输出模式选择位。
CK0用于选择PWM0的时钟源。
以下是PWM0S和PWM0M的不同配置模式下,PWM0和PWM1的输出变化
五、PWM0周期寄存器PWM0PL、PWM0PH
1、PWM0PL
2、PWM0PH
因为是12位的PWM,所以PWMOPH的高4位是无效的。
修改PWM0周期时先修改高位,后修改低位,读时不受限制,例如
(1) PWM0PH = 0x05;
(2) PWM0PL = 0x08; //此时PWM计数器溢出,则下一个周期开始周期计算数据为0x0508
(3) PWM0PH = 0x06; //此时PWM计数器溢出,则下一个周期开始周期计算数据为0x0508
(4) PWM0PL = 0x08; //此时PWM计数器溢出,则下一个周期开始周期计算数据为0x0608
(5) PWM0PL = 0x09; //此时PWM计数器溢出,则下一个周期开始周期计算数据为0x0609
只要修改PWM周期,无论低位寄存器是否需要修改,低位都必须写入一次,且周期修改都只会在下一个 PWM 周期才会生效。
PWM0周期 = [ PWM0PH : PWM0PL] * PWM0工作时钟源周期
六、PWM0占空比寄存器PWM0DL、PWM0DH
1、PWM0DL
2、PWM0DH
因为是12位的PWM,所以PWM0DH的高4位是无效的。
当PWM0_M=1时,PWM0工作在2路独立模式,此时的死区时间寄存器被用来当做 PWM01 的占空比寄存器,即独立模式的PWM0可以产生2路周期相同,但占空比可以不同的 PWM 波形。
在互补模式下:
1)PWM0 死区时间 = [ PWM0DTH : PWM0DTL] * PWM0 工作时钟周期
2)死区时间必须小于占空比时间,死区时间与占空比时间的和必须小于PWM0的周期
在独立模式下:
PWM01 占空比时间 = [ PWM0DTH : PWM0DTL] * PWM0 工作时钟周期