找回密码
 立即注册
查看: 129|回复: 5

STC8A8K64芯片增强型PWM模块中断向量问题请教

[复制链接]
  • TA的每日心情
    开心
    2024-5-7 14:11
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    6

    主题

    27

    回帖

    146

    积分

    注册会员

    积分
    146
    发表于 2024-5-1 22:35:41 | 显示全部楼层 |阅读模式
    本帖最后由 huiyong828 于 2024-5-1 22:36 编辑

    硬件实现四路PWM,应用于开关电源全桥电路

    截图202405012213116250.jpg

    现在只是按照要求初始化PWM,能实现PWM1 PWM4 与PWM2 PWM3相位差90度。
    15位增强型PWM模式全桥变换器测试程序.rar (186.48 KB, 下载次数: 3)

    代码如下:
    1. /******************** PWM15配置 ********************/
    2. void        PWM15_config(void)
    3. {
    4.         PWM15_InitTypeDef                PWM15_InitStructure;
    5. //        DT_Value = 2;                                //占空比
    6. //        CY_Value = 225;                        //周期
    7.         temp1 = (u16)(CY_Value * DT_Value /100);        //计算出导通时间
    8.         temp2 = (u16)(CY_Value/2 + temp1);                                //低电平输出位置
    9.         temp3 = (u16)(CY_Value/2);                                                                //高电平输出位置
    10.         PWM15_InitStructure.PWM_Enable    = ENABLE;                //PWM使能,  ENABLE, DISABLE
    11.         PWM15_InitStructure.PWM_Period    = CY_Value;                //PWM周期,  0~0x7fff
    12.         PWM15_InitStructure.PWM_Clock_Sel = PWM_CLK_SYS;                //时钟源选择,  PWM_CLK_SYS, PWM_CLK_TM2
    13.         PWM15_InitStructure.PWM_Clock_PS  = 0;                                //系统时钟分频参数(PS+1分频),  0~15
    14.         PWM15_InitStructure.PWM_CInt      = ENABLE;        //计数器归零中断使能,  ENABLE, DISABLE
    15.         PWM15_InitStructure.PWM_Counter   = ENABLE;                //计数器使能,  ENABLE, DISABLE
    16.         PWM15_Init(&PWM15_InitStructure);
    17.        
    18.         PWM15Duty(PWM15_1,temp1,                0);                //PWM_ID, 输出低电平位置, 输出高电平位置
    19.         PWM15Duty(PWM15_2,temp2,temp3);                //PWM_ID, 输出低电平位置, 输出高电平位置
    20.         PWM15Duty(PWM15_3,temp2,temp3);                //PWM_ID, 输出低电平位置, 输出高电平位置
    21.         PWM15Duty(PWM15_4,temp1,                0);                //PWM_ID, 输出低电平位置, 输出高电平位置
    22.         PWMChannelCtrl(PWM15_1,ENABLE,PWM15_SW_P2,0,ENABLE,ENABLE,DISABLE);   //PWM_ID, 输出使能, 输出通道, 初始电平, PWM中断, 第二个触发点中断, 第一触发点中断
    23.         PWMChannelCtrl(PWM15_2,ENABLE,PWM15_SW_P2,0,DISABLE,DISABLE,DISABLE);   //PWM_ID, 输出使能, 输出通道, 初始电平, PWM中断, 第二个触发点中断, 第一触发点中断
    24.         PWMChannelCtrl(PWM15_3,ENABLE,PWM15_SW_P2,0,DISABLE,DISABLE,DISABLE);   //PWM_ID, 输出使能, 输出通道, 初始电平, PWM中断, 第二个触发点中断, 第一触发点中断
    25.         PWMChannelCtrl(PWM15_4,ENABLE,PWM15_SW_P2,0,DISABLE,DISABLE,DISABLE);   //PWM_ID, 输出使能, 输出通道, 初始电平, PWM中断, 第二个触发点中断, 第一触发点中断
    26. }
    27. /******************** task A **************************/
    28. void main(void)
    29. {
    30.         EAXSFR();                /* MOVX A,@DPTR/MOVX @DPTR,A指令的操作对象为扩展SFR(XSFR) */
    31.         GPIO_config();
    32.         PWM15_config();
    33.         pwm0 = 0;
    34.         pwm1 = 0;
    35.         B_PWM0_Dir = 0;
    36.         EA = 1;
    37.        
    38.         while (1)
    39.         {
    40.                 delay_ms(1);
    41.                
    42.                 if(B_PWM0_Dir)
    43.                 {
    44.                         if(-- DT_Value <=1) B_PWM0_Dir = 0;
    45.                 }
    46.                 else if(++ DT_Value >=45) B_PWM0_Dir = 1;
    47.                 temp1 = (u16)((u32)CY_Value * DT_Value /100);                //计算出导通时间   低电平输出位置
    48.                 temp2 = (u16)(CY_Value/2 + temp1);                                                        //低电平输出位置
    49.                 temp3 = (u16)(CY_Value/2);                                                                                        //高电平输出位置
    50.                 PWM15Duty(PWM15_1,temp1,                0);
    51.                 PWM15Duty(PWM15_2,temp2,temp3);
    52.                 PWM15Duty(PWM15_3,temp2,temp3);
    53.                 PWM15Duty(PWM15_4,temp1,                0);
    54.         }
    55. }
    56. void        PWM_ISR (void) interrupt PWM_VECTOR
    57. {
    58.         char store;
    59.         store = P_SW2;
    60.         P_SW2 |= 0x80;
    61.         if(PWMCFG & PWMCBIF)                //PWM计数器归零中断标志
    62.         {
    63.                 PWMCFG &= ~PWMCBIF;        //清除中断标志
    64.                 // TODO: 在此处添加用户代码
    65.         }
    66.         if(PWMIF & PWM_C0IF)                //PWM0匹配中断
    67.         {
    68.                 PWMCFG &= ~PWM_C0IF;        //清除中断标志
    69.                 // TODO: 在此处添加用户代码
    70.         }
    71.         if(PWMIF & PWM_C1IF)                //PWM1匹配中断
    72.         {
    73.                 PWMCFG &= ~PWM_C1IF;        //清除中断标志
    74.                 // TODO: 在此处添加用户代码
    75.         }
    76.        
    77.         if(PWMIF & PWM_C2IF)                //PWM2匹配中断
    78.         {
    79.                 PWMCFG &= ~PWM_C2IF;        //清除中断标志
    80.                 // TODO: 在此处添加用户代码
    81.         }
    82.         if(PWMIF & PWM_C3IF)                //PWM3匹配中断
    83.         {
    84.                 PWMCFG &= ~PWM_C3IF;        //清除中断标志
    85.                 // TODO: 在此处添加用户代码
    86.         }
    87.        
    88.         if(PWMIF & PWM_C4IF)                //PWM4匹配中断
    89.         {
    90.                 PWMCFG &= ~PWM_C4IF;        //清除中断标志
    91.                 // TODO: 在此处添加用户代码
    92.         }
    93.         if(PWMIF & PWM_C5IF)                //PWM5匹配中断
    94.         {
    95.                 PWMCFG &= ~PWM_C5IF;        //清除中断标志
    96.                 // TODO: 在此处添加用户代码
    97.         }
    98.        
    99.         if(PWMIF & PWM_C6IF)                //PWM6匹配中断
    100.         {
    101.                 PWMCFG &= ~PWM_C6IF;        //清除中断标志
    102.                 // TODO: 在此处添加用户代码
    103.         }
    104.         if(PWMIF & PWM_C7IF)                //PWM7匹配中断
    105.         {
    106.                 PWMCFG &= ~PWM_C7IF;        //清除中断标志
    107.                 // TODO: 在此处添加用户代码
    108.         }
    109.         if(PWMFDCR & PWMFD_FDIF)                //PWM异常检测中断
    110.         {
    111.                 PWMFDCR &= ~PWMFD_FDIF;        //清除中断标志
    112.                 // TODO: 在此处添加用户代码
    113.         }
    114.         P_SW2 = store;
    115. }
    复制代码



    问题1:硬件仿真时,进不了PWM中断,上面设置了PWM1的T1中断?

    回复 送花

    使用道具 举报

    该用户从未签到

    551

    主题

    9441

    回帖

    1万

    积分

    管理员

    积分
    13983
    发表于 2024-5-2 08:41:29 | 显示全部楼层
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    2024-5-7 14:11
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    6

    主题

    27

    回帖

    146

    积分

    注册会员

    积分
    146
     楼主| 发表于 2024-5-2 23:56:58 | 显示全部楼层
    神农鼎 发表于 2024-5-2 08:41
    深圳国芯人工智能有限公司-产品_STC8A系列 (stcai.com)

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

    请各位老师指点下,在线期待回复
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    2024-5-7 14:11
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    6

    主题

    27

    回帖

    146

    积分

    注册会员

    积分
    146
     楼主| 发表于 2024-5-5 22:07:13 | 显示全部楼层
    huiyong828 发表于 2024-5-2 23:56
    按照官方提供的实例测试,还是不能进入PWM中断

    1. /******************** PWM15配置 ********************/
    2. void        PWM15_config(void)
    3. {
    4.         PWM15_InitTypeDef                PWM15_InitStructure;
    5. //        DT_Value = 2;                                //占空比
    6. //        CY_Value = 225;                        //周期
    7.         temp1 = (u16)(CY_Value * DT_Value /100);        //计算出导通时间
    8.         temp2 = (u16)(CY_Value/2 + temp1);                                //低电平输出位置
    9.         temp3 = (u16)(CY_Value/2);                                                                //高电平输出位置
    10.         PWM15_InitStructure.PWM_Enable    = ENABLE;                //PWM使能,  ENABLE, DISABLE
    11.         PWM15_InitStructure.PWM_Period    = CY_Value;                //PWM周期,  0~0x7fff
    12.         PWM15_InitStructure.PWM_Clock_Sel = PWM_CLK_SYS;                //时钟源选择,  PWM_CLK_SYS, PWM_CLK_TM2
    13.         PWM15_InitStructure.PWM_Clock_PS  = 0;                                //系统时钟分频参数(PS+1分频),  0~15
    14.         PWM15_InitStructure.PWM_CInt      = ENABLE;        //计数器归零中断使能,  ENABLE, DISABLE
    15.         PWM15_InitStructure.PWM_Counter   = ENABLE;                //计数器使能,  ENABLE, DISABLE
    16.         PWM15_Init(&PWM15_InitStructure);
    17.         PWMCFG &= ~PWMCBIF;        //清除中断标志
    18.        
    19.         PWM15Duty(PWM15_1,temp1,                0);                //PWM_ID, 输出低电平位置, 输出高电平位置
    20.         PWM15Duty(PWM15_2,temp2,temp3);                //PWM_ID, 输出低电平位置, 输出高电平位置
    21.         PWM15Duty(PWM15_3,temp2,temp3);                //PWM_ID, 输出低电平位置, 输出高电平位置
    22.         PWM15Duty(PWM15_4,temp1,                0);                //PWM_ID, 输出低电平位置, 输出高电平位置
    23.         PWMChannelCtrl(PWM15_1,ENABLE,PWM15_SW_P2,0,ENABLE,DISABLE,DISABLE);   //PWM_ID, 输出使能, 输出通道, 初始电平, PWM中断, 第二个触发点中断, 第一触发点中断
    24.         PWMChannelCtrl(PWM15_2,ENABLE,PWM15_SW_P2,0,ENABLE,DISABLE,DISABLE);   //PWM_ID, 输出使能, 输出通道, 初始电平, PWM中断, 第二个触发点中断, 第一触发点中断
    25.         PWMChannelCtrl(PWM15_3,ENABLE,PWM15_SW_P2,0,ENABLE,DISABLE,DISABLE);   //PWM_ID, 输出使能, 输出通道, 初始电平, PWM中断, 第二个触发点中断, 第一触发点中断
    26.         PWMChannelCtrl(PWM15_4,ENABLE,PWM15_SW_P2,0,ENABLE,DISABLE,DISABLE);   //PWM_ID, 输出使能, 输出通道, 初始电平, PWM中断, 第二个触发点中断, 第一触发点中断
    27. }
    复制代码



    微信截图_20240505220404.png


    PWM模块关键寄存器查看,运行时不能进PWM中断,请各位老师指点下.
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    2024-5-7 14:11
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    6

    主题

    27

    回帖

    146

    积分

    注册会员

    积分
    146
     楼主| 发表于 2024-5-5 22:25:00 | 显示全部楼层
    huiyong828 发表于 2024-5-5 22:07
    PWM模块关键寄存器查看,运行时不能进PWM中断,请各位老师指点下.
    ...

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

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

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    2024-5-7 14:11
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    6

    主题

    27

    回帖

    146

    积分

    注册会员

    积分
    146
     楼主| 发表于 2024-5-5 23:10:08 | 显示全部楼层
    huiyong828 发表于 2024-5-5 22:25
    已找到不能进入PWM中断的问题,项目工程中有15位增强型PWM中断函数,如下图


    截图202405052306228352.jpg

    截图202405052307595754.jpg


    截图202405052306036746.jpg

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

    回复 支持 反对 送花

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-5-16 02:54 , Processed in 0.065710 second(s), 51 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表