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

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

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2024-05-07 14:11:58

6

主题

27

回帖

150

积分

注册会员

积分
150
发表于 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, 下载次数: 47)

代码如下:
  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中断?

回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:56
  • 最近打卡:2025-05-03 10:05:34

718

主题

1万

回帖

1万

积分

管理员

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

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2024-05-07 14:11:58

6

主题

27

回帖

150

积分

注册会员

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

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

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

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2024-05-07 14:11:58

6

主题

27

回帖

150

积分

注册会员

积分
150
发表于 2024-5-5 22:07:13 | 显示全部楼层
huiyo*** 发表于 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中断,请各位老师指点下.
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2024-05-07 14:11:58

6

主题

27

回帖

150

积分

注册会员

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

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

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

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2024-05-07 14:11:58

6

主题

27

回帖

150

积分

注册会员

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


截图202405052306228352.jpg

截图202405052307595754.jpg


截图202405052306036746.jpg

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

回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-4 05:49 , Processed in 0.139242 second(s), 84 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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