|
在调试STC8H的时候设置死区时间没有生效,此外想在PWM波行中插入一小段延时高电平或低电平,应该怎么做呢
程序是在 STC8H的手册中 22.8.23 产生 3 路相位差 120 度的互补 PWM 波形基础上修改
/ 测试工作频率为 24MHz
/*****************************************************
主要功能 : P2.0-P2.5 输出互补的三路相位差 120 度的 PWM
第 1 路 P2.0/P2.1 为 PWM 输出 模式,第 2 路 P2.2/P2.3 和第 3 路 P2.4/P2.5 为比较输出模式
程序下载进目标芯片 , 输出 50hz 的 SPWM, 占空比 25%
*****************************************************/
#include "stc8h.h"
#define FOSC 24000000UL
#define PWM_PSC (240-1) // 定义 PWM 时钟预分频系数
#define PWM_PERIOD 2000 // 定义 PWM 周期值
//( 频率 =FOSC/(PWM_PSC+1)/PWM_PERIOD=50Hz)
#define PWM_DUTY 500 // 定义 PWM 的占空比值
//( 占空比 =PWM_DUTY/PWM_PERIOD*100%=25%)
void SYS_Init();
void PWM_Init();
void main()
{
SYS_Init();
PWM_Init();
EA = 1; // 打开总中断
while (1);
}
void SYS_Init()
{
P_SW2 |= 0x80; // 扩展寄存器 (XFR) 访问使能
P0M1 = 0x00; P0M0 = 0x00;
P1M1 = 0x00; P1M0 = 0x00;
P2M1 = 0x00; P2M0 = 0x00;
P3M1 = 0x00; P3M0 = 0x00;
P4M1 = 0x00; P4M0 = 0x00;
P5M1 = 0x00; P5M0 = 0x00;
P6M1 = 0x00; P6M0 = 0x00;
P7M1 = 0x00; P7M0 = 0x00;
}
void PWM_Init()
{
PWMA_PSCR = PWM_PSC; // 配置预 分频系数
PWMA_DTR = 0x8C; // 死区设置
PWMA_CCER1 = 0x00; // 写 CCMRx 前必须先清零 CCxE 关闭通道
PWMA_CCER2 = 0x00;
PWMA_CCMR1 = 0x60; // 通道模式配置 PWM 模式 1
PWMA_CCMR2 = 0x30; // 通道模式配置输出比较模式
PWMA_CCMR3 = 0x30; // 通道模式配置输出比较模式
PWMA_CCER1 = 0x55; // 配置通道 1,2,3 输出使能和极性
PWMA_CCER2 = 0x05;
PWMA_ARR = PWM_PERIOD; // 设置周期时间
PWMA_ENO = 0x3f; // 使能 PWM 输出
PWMA_PS = 0x15; // 高级 PWM 通道输出脚选择 P2.0-P2.5
PWMA_CCR1 = PWM_DUTY; // 设置占空比时间
PWMA_CCR2 = PWM_PERIOD/3; // 设置 OC2 起始翻转位
PWMA_CCR3 = PWM_PERIOD/3*2; // 设置 OC3 起始翻转位
PWMA_IER = 0x0d; // 使能 OC2/OC3 比较中断 , 更新中断
PWMA_BKR = 0x80; // 使能主输出
PWMA_CR1 |= 0x01; // 开始计时
}
void PWMA_ISR() interrupt 26
{
if (PWMA_SR1 & 0x01)
{
PWMA_CCR2 = PWM_PERIOD/3; // 设置占空比时间
PWMA_CCR3 = PWM_PERIOD/3*2; // 设置占空比时间
PWMA_SR1 &= ~0x01;
}
else if (PWMA_SR1 & 0x04)
{
PWMA_CCR2 = (PWM_PERIOD/3+PWM_DUTY); // 设置 0C2 结束翻转位
PWMA_SR1 &= ~0x04;
}
else if (PWMA_SR1 & 0x08)
{
PWMA_CCR3 = (PWM_PERIOD/3*2+PWM_DUTY); // 设置 0C3 结束翻转位
PWMA_SR1 &= ~0x08;
}
else
{
PWMA_SR1 = 0;
}
}
|
-
在PWM波形中插入一段低电平
|