huiyong828 发表于 2024-5-1 22:35:41

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中断?

神农鼎 发表于 2024-5-2 08:41:29





深圳国芯人工智能有限公司-产品_STC8A系列 (stcai.com)




深圳国芯人工智能有限公司-实验箱 (stcai.com)

STC8A8K64D4的演示程序

huiyong828 发表于 2024-5-2 23:56:58

神农鼎 发表于 2024-5-2 08:41
深圳国芯人工智能有限公司-产品_STC8A系列 (stcai.com)




按照官方提供的实例测试,还是不能进入PWM中断


请各位老师指点下,在线期待回复

huiyong828 发表于 2024-5-5 22:07:13

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:25:00

huiyong828 发表于 2024-5-5 22:07
PWM模块关键寄存器查看,运行时不能进PWM中断,请各位老师指点下.
...

已找到不能进入PWM中断的问题,项目工程中有15位增强型PWM中断函数,如下图


仿真运行时进入上面中断函数,没有进入自定义PWM中断函数

huiyong828 发表于 2024-5-5 23:10:08

huiyong828 发表于 2024-5-5 22:25
已找到不能进入PWM中断的问题,项目工程中有15位增强型PWM中断函数,如下图












达到预期目标,可以实现PWM计数器归零中断中修改占空比目的.

页: [1]
查看完整版本: STC8A8K64芯片增强型PWM模块中断向量问题请教