查看: 6022|回复: 16

[已解决] 求助:在PIT中断函数中使用i++,居然影响PWM输出波形的稳定(已解决)

[复制链接]

该用户从未签到

2

主题

15

帖子

0

新手上路

Rank: 1

积分
36
最后登录
1970-1-1
发表于 2014-6-10 22:03:03 | 显示全部楼层 |阅读模式
 PIT中断程序如下:
void timer0_isr(void)
{
  if (PIT_TFLG0 & PIT_TFLG_TIF_MASK == PIT_TFLG_TIF_MASK)
  {
    PIT_TFLG0 |= PIT_TFLG_TIF_MASK;
    FL1 = BGET(GPIOE_PDIR,5);
    FL2 = BGET(GPIOE_PDIR,4);
    FL3 = BGET(GPIOE_PDIR,3);
    FR3 = BGET(GPIOE_PDIR,2);
    FR2 = BGET(GPIOC_PDIR,13);
    FR1 = BGET(GPIOC_PDIR,12);
    if(time_counter >= 60000)
    {   
      time_counter = 0;
    }
    else
    {
      time_counter++;
    }
  }
}
其中time_counter是全局无符号16位整数;
运行程序的时候发现,PWM波形的占空比会有一定幅度的跳变,不稳定;当把  “time_counter++;”这句注释掉PWM波形就稳定了。   在该程序中,本意想用  time_counter来计计时器终端数以此来获得一个较为精确地时间计数,请问 “time_counter++;”这句为什么会影响到PWM波形,有什么解决办法?  PWM波形使用的是TPM模块产生。
我知道答案 目前已有15人回答

KL25PWM.zip

4.84 MB, 下载次数: 3, 下载积分: 威望 1

回复

使用道具 举报

该用户从未签到

145

主题

4926

帖子

0

金牌会员

Rank: 6Rank: 6

积分
9267
最后登录
1970-1-1
发表于 2014-6-11 10:39:32 | 显示全部楼层

RE:在PIT中断函数中使用i++,居然影响PWM输出波形的稳定

楼主,你用的是什么产品?请给出你芯片的型号全称。
另外,你说的跳变能否发两张图出来,不跳变和跳变的图。
还有,你的time_counter的定义也给出来。
回复 支持 反对

使用道具 举报

  • TA的每日心情
    难过
    2021-12-15 16:01
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    305

    主题

    4701

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    377
    最后登录
    2023-8-16
    发表于 2014-6-11 11:05:31 | 显示全部楼层

    RE:在PIT中断函数中使用i++,居然影响PWM输出波形的稳定

    这段代码执行的机器周期大概是在7-9个之间,他是有7-9个的延迟吗?
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    2

    主题

    15

    帖子

    0

    新手上路

    Rank: 1

    积分
    36
    最后登录
    1970-1-1
     楼主| 发表于 2014-6-12 14:26:25 | 显示全部楼层

    回复:在PIT中断函数中使用i++,居然影响PWM输出波形的稳定

    回复第 2 楼 于2014-06-11 10:39:32发表:
    楼主,你用的是什么产品?请给出你芯片的型号全称。
    另外,你说的跳变能否发两张图出来,不跳变和跳变的图。
    还有,你的time_counter的定义也给出来。
    我是用的是FRDM-KL25Z官方体验板。
    PWM初始化函数如下
    void pwm_Init(uint16 period, uint16 duty)
    {
      SIM_SOPT2 |= SIM_SOPT2_PLLFLLSEL_MASK;         //PLL/2作为总线时钟
      SIM_SOPT2 |= SIM_SOPT2_TPMSRC(1);             //选择TPM模块的时钟为PLL/2
      SIM_SCGC6 |= SIM_SCGC6_TPM0_MASK              //使能TPM0时钟
                  |SIM_SCGC6_TPM1_MASK              //使能TPM1时钟
                  |SIM_SCGC6_TPM2_MASK;             //使能TPM2时钟
      
    //  PORTE_PCR30 |= PORT_PCR_MUX(3);               
    //  PORTE_PCR24 |= PORT_PCR_MUX(3);
    //  PORTE_PCR31 |= PORT_PCR_MUX(3);
    //  PORTE_PCR25 |= PORT_PCR_MUX(3);
    //  PORTA_PCR12 |= PORT_PCR_MUX(3); 
    //  PORTA_PCR13 |= PORT_PCR_MUX(3);
    //  PORTA_PCR5 |= PORT_PCR_MUX(3);
    //  PORTB_PCR18 |= PORT_PCR_MUX(3);
    //  PORTB_PCR19 |= PORT_PCR_MUX(3);
    //  PORTC_PCR9 |= PORT_PCR_MUX(3);
      
      
      PORTD_PCR0 |= PORT_PCR_MUX(4); 
      PORTD_PCR1 |= PORT_PCR_MUX(4);
      PORTD_PCR2 |= PORT_PCR_MUX(4);
      PORTD_PCR3 |= PORT_PCR_MUX(4);
      PORTD_PCR4 |= PORT_PCR_MUX(4);
      PORTD_PCR5 |= PORT_PCR_MUX(4);
      PORTB_PCR0 |= PORT_PCR_MUX(3); 
      PORTB_PCR1 |= PORT_PCR_MUX(3);
      PORTB_PCR2 |= PORT_PCR_MUX(3);
      PORTB_PCR3 |= PORT_PCR_MUX(3);
      
      
      TPM0_BASE_PTR->SC = 0 | TPM_SC_CMOD(0) | TPM_SC_PS(7);
      TPM0_BASE_PTR->CNT = 0;
      TPM0_BASE_PTR->MOD = period;
     
      TPM0_C0SC = 0 | TPM_CnSC_MSB_MASK
                    | TPM_CnSC_ELSB_MASK;
      TPM0_C0V = duty;
       
      TPM0_C1SC = 0 | TPM_CnSC_MSB_MASK
                    | TPM_CnSC_ELSB_MASK;
      TPM0_C1V = duty;
       
      TPM0_C2SC = 0 | TPM_CnSC_MSB_MASK
                    | TPM_CnSC_ELSB_MASK;
      TPM0_C2V = duty;
     
      TPM0_C3SC = 0 | TPM_CnSC_MSB_MASK
                    | TPM_CnSC_ELSB_MASK;
      TPM0_C3V = duty;
      
      TPM0_C4SC = 0 | TPM_CnSC_MSB_MASK
                    | TPM_CnSC_ELSB_MASK;
      TPM0_C4V = duty;
        
      TPM0_C5SC = 0 | TPM_CnSC_MSB_MASK
                    | TPM_CnSC_ELSB_MASK;
      TPM0_C5V = duty;
      
      TPM0_BASE_PTR->SC  = 0 | TPM_SC_CMOD(1)
                             |TPM_SC_PS(7) ;
      
      TPM1_BASE_PTR->SC = 0 | TPM_SC_CMOD(0);
      TPM1_BASE_PTR->CNT = 0;
      TPM1_BASE_PTR->MOD = period;
     
      TPM1_C0SC = 0 | TPM_CnSC_MSB_MASK
                    | TPM_CnSC_ELSB_MASK;
      TPM1_C0V = duty;
       
      TPM1_C1SC = 0 | TPM_CnSC_MSB_MASK
                    | TPM_CnSC_ELSB_MASK;
      TPM1_C1V = duty;
      TPM1_BASE_PTR->SC  = 0 | TPM_SC_CMOD(1)
                           |TPM_SC_PS(7) ;
      
      TPM2_BASE_PTR->SC = 0 | TPM_SC_CMOD(0);
      TPM2_BASE_PTR->CNT = 0;
      TPM2_BASE_PTR->MOD = period;
     
      TPM2_C0SC = 0 | TPM_CnSC_MSB_MASK
                    | TPM_CnSC_ELSB_MASK;
      TPM2_C0V = duty;
       
      TPM2_C1SC = 0 | TPM_CnSC_MSB_MASK
                    | TPM_CnSC_ELSB_MASK;
      TPM2_C1V = duty;
      TPM2_BASE_PTR->SC  = 0 | TPM_SC_CMOD(1)
                           |TPM_SC_PS(7) ;
    }
    在main中调用“ pwm_Init(3750,281);”
    对time_counter 的定义为:uint16 volatile time_counter;
    在程序中并没有改变PWM的占空比,但是示波器显示的PWM波形在两个光标之间来回跳动。
    pwm1.jpg
     
    pwm2.jpg
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    2

    主题

    15

    帖子

    0

    新手上路

    Rank: 1

    积分
    36
    最后登录
    1970-1-1
     楼主| 发表于 2014-6-12 14:29:28 | 显示全部楼层

    回复:在PIT中断函数中使用i++,居然影响PWM输出波形的稳定

    回复第 3 楼 于2014-06-11 11:05:31发表:
    这段代码执行的机器周期大概是在7-9个之间,他是有7-9个的延迟吗?
    pwm1.jpg
    如两图所示。跳变的事件已经达到240us,我想这不是机器周期的问题了。 另外,PWM采用的是PWM模块输出,执行中断函数为什么会对其造成影响呢?
     
    pwm2.jpg
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    145

    主题

    4926

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    9267
    最后登录
    1970-1-1
    发表于 2014-6-12 16:04:29 | 显示全部楼层

    RE:在PIT中断函数中使用i++,居然影响PWM输出波形的稳定

    楼主你好,你是使用TPM输出PWM波形,然后又配置了一个PIT的中断,发现PIT的中断会影响到TPM的PWM是吗?
    理论上是不应该影响的,TPM是硬件方式的输出PWM, 这样你把你的工程给我调试下看看,是不是什么地方的配置有问题。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    4

    主题

    351

    帖子

    0

    高级会员

    Rank: 4

    积分
    973
    最后登录
    1970-1-1
    发表于 2014-6-13 11:51:25 | 显示全部楼层

    RE:在PIT中断函数中使用i++,居然影响PWM输出波形的稳定

    楼主还不如直接把整个程序发上来让大家调试算了,论坛里有FRDM-KL25Z开发板的人还是很多的。
    我就有一块
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2019-4-1 22:48
  • 签到天数: 302 天

    连续签到: 1 天

    [LV.8]以坛为家I

    87

    主题

    7322

    帖子

    4

    金牌会员

    Rank: 6Rank: 6

    积分
    4614
    最后登录
    2021-1-25
    发表于 2014-6-17 13:18:07 | 显示全部楼层

    RE:在PIT中断函数中使用i++,居然影响PWM输出波形的稳定

    周期总是和延迟同步的,你查下延迟时间的原因
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    2

    主题

    15

    帖子

    0

    新手上路

    Rank: 1

    积分
    36
    最后登录
    1970-1-1
     楼主| 发表于 2014-6-17 16:32:01 | 显示全部楼层

    回复:在PIT中断函数中使用i++,居然影响PWM输出波形的稳定

    回复第 6 楼 于2014-06-12 16:04:29发表:
    楼主你好,你是使用TPM输出PWM波形,然后又配置了一个PIT的中断,发现PIT的中断会影响到TPM的PWM是吗?
    理论上是不应该影响的,TPM是硬件方式的输出PWM, 这样你把你的工程给我调试下看看,是不是什么地方的配置有问题。
    不好意思 前两天忙着答辩, 明天上传 ,请多指教
     
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    2

    主题

    15

    帖子

    0

    新手上路

    Rank: 1

    积分
    36
    最后登录
    1970-1-1
     楼主| 发表于 2014-6-17 16:31:44 | 显示全部楼层

    回复:在PIT中断函数中使用i++,居然影响PWM输出波形的稳定

    回复第 6 楼 于2014-06-12 16:04:29发表:
    楼主你好,你是使用TPM输出PWM波形,然后又配置了一个PIT的中断,发现PIT的中断会影响到TPM的PWM是吗?
    理论上是不应该影响的,TPM是硬件方式的输出PWM, 这样你把你的工程给我调试下看看,是不是什么地方的配置有问题。
     
    工程有90M,方便给个邮箱吗?
     
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-21 21:34 , Processed in 0.112141 second(s), 30 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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