STC8H的PWM的时候遇到的问题
在调试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"
#defineFOSC24000000UL
#definePWM_PSC(240-1)// 定义 PWM 时钟预分频系数
#definePWM_PERIOD 2000// 定义 PWM 周期值
//( 频率 =FOSC/(PWM_PSC+1)/PWM_PERIOD=50Hz)
#definePWM_DUTY500// 定义 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;
}
}
页:
[1]