STC8A8K64芯片增强型PWM模块中断向量问题请教
本帖最后由 huiyong828 于 2024-5-1 22:36 编辑硬件实现四路PWM,应用于开关电源全桥电路
现在只是按照要求初始化PWM,能实现PWM1 PWM4 与PWM2 PWM3相位差90度。
代码如下:
/******************** PWM15配置 ********************/
void PWM15_config(void)
{
PWM15_InitTypeDef PWM15_InitStructure;
// DT_Value = 2; //占空比
// CY_Value = 225; //周期
temp1 = (u16)(CY_Value * DT_Value /100); //计算出导通时间
temp2 = (u16)(CY_Value/2 + temp1); //低电平输出位置
temp3 = (u16)(CY_Value/2); //高电平输出位置
PWM15_InitStructure.PWM_Enable = ENABLE; //PWM使能,ENABLE, DISABLE
PWM15_InitStructure.PWM_Period = CY_Value; //PWM周期,0~0x7fff
PWM15_InitStructure.PWM_Clock_Sel = PWM_CLK_SYS; //时钟源选择,PWM_CLK_SYS, PWM_CLK_TM2
PWM15_InitStructure.PWM_Clock_PS= 0; //系统时钟分频参数(PS+1分频),0~15
PWM15_InitStructure.PWM_CInt = ENABLE; //计数器归零中断使能,ENABLE, DISABLE
PWM15_InitStructure.PWM_Counter = ENABLE; //计数器使能,ENABLE, DISABLE
PWM15_Init(&PWM15_InitStructure);
PWM15Duty(PWM15_1,temp1, 0); //PWM_ID, 输出低电平位置, 输出高电平位置
PWM15Duty(PWM15_2,temp2,temp3); //PWM_ID, 输出低电平位置, 输出高电平位置
PWM15Duty(PWM15_3,temp2,temp3); //PWM_ID, 输出低电平位置, 输出高电平位置
PWM15Duty(PWM15_4,temp1, 0); //PWM_ID, 输出低电平位置, 输出高电平位置
PWMChannelCtrl(PWM15_1,ENABLE,PWM15_SW_P2,0,ENABLE,ENABLE,DISABLE); //PWM_ID, 输出使能, 输出通道, 初始电平, PWM中断, 第二个触发点中断, 第一触发点中断
PWMChannelCtrl(PWM15_2,ENABLE,PWM15_SW_P2,0,DISABLE,DISABLE,DISABLE); //PWM_ID, 输出使能, 输出通道, 初始电平, PWM中断, 第二个触发点中断, 第一触发点中断
PWMChannelCtrl(PWM15_3,ENABLE,PWM15_SW_P2,0,DISABLE,DISABLE,DISABLE); //PWM_ID, 输出使能, 输出通道, 初始电平, PWM中断, 第二个触发点中断, 第一触发点中断
PWMChannelCtrl(PWM15_4,ENABLE,PWM15_SW_P2,0,DISABLE,DISABLE,DISABLE); //PWM_ID, 输出使能, 输出通道, 初始电平, PWM中断, 第二个触发点中断, 第一触发点中断
}
/******************** task A **************************/
void main(void)
{
EAXSFR(); /* MOVX A,@DPTR/MOVX @DPTR,A指令的操作对象为扩展SFR(XSFR) */
GPIO_config();
PWM15_config();
pwm0 = 0;
pwm1 = 0;
B_PWM0_Dir = 0;
EA = 1;
while (1)
{
delay_ms(1);
if(B_PWM0_Dir)
{
if(-- DT_Value <=1) B_PWM0_Dir = 0;
}
else if(++ DT_Value >=45) B_PWM0_Dir = 1;
temp1 = (u16)((u32)CY_Value * DT_Value /100); //计算出导通时间 低电平输出位置
temp2 = (u16)(CY_Value/2 + temp1); //低电平输出位置
temp3 = (u16)(CY_Value/2); //高电平输出位置
PWM15Duty(PWM15_1,temp1, 0);
PWM15Duty(PWM15_2,temp2,temp3);
PWM15Duty(PWM15_3,temp2,temp3);
PWM15Duty(PWM15_4,temp1, 0);
}
}
void PWM_ISR (void) interrupt PWM_VECTOR
{
char store;
store = P_SW2;
P_SW2 |= 0x80;
if(PWMCFG & PWMCBIF) //PWM计数器归零中断标志
{
PWMCFG &= ~PWMCBIF; //清除中断标志
// TODO: 在此处添加用户代码
}
if(PWMIF & PWM_C0IF) //PWM0匹配中断
{
PWMCFG &= ~PWM_C0IF; //清除中断标志
// TODO: 在此处添加用户代码
}
if(PWMIF & PWM_C1IF) //PWM1匹配中断
{
PWMCFG &= ~PWM_C1IF; //清除中断标志
// TODO: 在此处添加用户代码
}
if(PWMIF & PWM_C2IF) //PWM2匹配中断
{
PWMCFG &= ~PWM_C2IF; //清除中断标志
// TODO: 在此处添加用户代码
}
if(PWMIF & PWM_C3IF) //PWM3匹配中断
{
PWMCFG &= ~PWM_C3IF; //清除中断标志
// TODO: 在此处添加用户代码
}
if(PWMIF & PWM_C4IF) //PWM4匹配中断
{
PWMCFG &= ~PWM_C4IF; //清除中断标志
// TODO: 在此处添加用户代码
}
if(PWMIF & PWM_C5IF) //PWM5匹配中断
{
PWMCFG &= ~PWM_C5IF; //清除中断标志
// TODO: 在此处添加用户代码
}
if(PWMIF & PWM_C6IF) //PWM6匹配中断
{
PWMCFG &= ~PWM_C6IF; //清除中断标志
// TODO: 在此处添加用户代码
}
if(PWMIF & PWM_C7IF) //PWM7匹配中断
{
PWMCFG &= ~PWM_C7IF; //清除中断标志
// TODO: 在此处添加用户代码
}
if(PWMFDCR & PWMFD_FDIF) //PWM异常检测中断
{
PWMFDCR &= ~PWMFD_FDIF; //清除中断标志
// TODO: 在此处添加用户代码
}
P_SW2 = store;
}
问题1:硬件仿真时,进不了PWM中断,上面设置了PWM1的T1中断?
深圳国芯人工智能有限公司-产品_STC8A系列 (stcai.com)
深圳国芯人工智能有限公司-实验箱 (stcai.com)
STC8A8K64D4的演示程序
神农鼎 发表于 2024-5-2 08:41
深圳国芯人工智能有限公司-产品_STC8A系列 (stcai.com)
按照官方提供的实例测试,还是不能进入PWM中断
请各位老师指点下,在线期待回复
huiyong828 发表于 2024-5-2 23:56
按照官方提供的实例测试,还是不能进入PWM中断
/******************** PWM15配置 ********************/
void PWM15_config(void)
{
PWM15_InitTypeDef PWM15_InitStructure;
// DT_Value = 2; //占空比
// CY_Value = 225; //周期
temp1 = (u16)(CY_Value * DT_Value /100); //计算出导通时间
temp2 = (u16)(CY_Value/2 + temp1); //低电平输出位置
temp3 = (u16)(CY_Value/2); //高电平输出位置
PWM15_InitStructure.PWM_Enable = ENABLE; //PWM使能,ENABLE, DISABLE
PWM15_InitStructure.PWM_Period = CY_Value; //PWM周期,0~0x7fff
PWM15_InitStructure.PWM_Clock_Sel = PWM_CLK_SYS; //时钟源选择,PWM_CLK_SYS, PWM_CLK_TM2
PWM15_InitStructure.PWM_Clock_PS= 0; //系统时钟分频参数(PS+1分频),0~15
PWM15_InitStructure.PWM_CInt = ENABLE; //计数器归零中断使能,ENABLE, DISABLE
PWM15_InitStructure.PWM_Counter = ENABLE; //计数器使能,ENABLE, DISABLE
PWM15_Init(&PWM15_InitStructure);
PWMCFG &= ~PWMCBIF; //清除中断标志
PWM15Duty(PWM15_1,temp1, 0); //PWM_ID, 输出低电平位置, 输出高电平位置
PWM15Duty(PWM15_2,temp2,temp3); //PWM_ID, 输出低电平位置, 输出高电平位置
PWM15Duty(PWM15_3,temp2,temp3); //PWM_ID, 输出低电平位置, 输出高电平位置
PWM15Duty(PWM15_4,temp1, 0); //PWM_ID, 输出低电平位置, 输出高电平位置
PWMChannelCtrl(PWM15_1,ENABLE,PWM15_SW_P2,0,ENABLE,DISABLE,DISABLE); //PWM_ID, 输出使能, 输出通道, 初始电平, PWM中断, 第二个触发点中断, 第一触发点中断
PWMChannelCtrl(PWM15_2,ENABLE,PWM15_SW_P2,0,ENABLE,DISABLE,DISABLE); //PWM_ID, 输出使能, 输出通道, 初始电平, PWM中断, 第二个触发点中断, 第一触发点中断
PWMChannelCtrl(PWM15_3,ENABLE,PWM15_SW_P2,0,ENABLE,DISABLE,DISABLE); //PWM_ID, 输出使能, 输出通道, 初始电平, PWM中断, 第二个触发点中断, 第一触发点中断
PWMChannelCtrl(PWM15_4,ENABLE,PWM15_SW_P2,0,ENABLE,DISABLE,DISABLE); //PWM_ID, 输出使能, 输出通道, 初始电平, PWM中断, 第二个触发点中断, 第一触发点中断
}
PWM模块关键寄存器查看,运行时不能进PWM中断,请各位老师指点下.
huiyong828 发表于 2024-5-5 22:07
PWM模块关键寄存器查看,运行时不能进PWM中断,请各位老师指点下.
...
已找到不能进入PWM中断的问题,项目工程中有15位增强型PWM中断函数,如下图
仿真运行时进入上面中断函数,没有进入自定义PWM中断函数
huiyong828 发表于 2024-5-5 22:25
已找到不能进入PWM中断的问题,项目工程中有15位增强型PWM中断函数,如下图
达到预期目标,可以实现PWM计数器归零中断中修改占空比目的.
页:
[1]