XInkkQwq 发表于 昨天 15:39

P2多个引脚同时输出PWM时,会导致P2其他引脚不稳定??

为什么P2多个引脚输出不同频率PWM时,同一组的其他PWM引脚会不稳定吗???
当P23配置输出PWM时,导致我们之前调的PID完全不正常,
我们本以为是电压不够,但经过示波器打过,我感觉像是没问题。

https://www.stcaimcu.com/forum.php?mod=image&aid=104274&size=300x300&key=86fd53cc06091264&nocache=yes&type=fixnonehttps://www.stcaimcu.com/forum.php?mod=image&aid=104276&size=300x300&key=490ac975bd6f5f8e&nocache=yes&type=fixnone
我们确定了硬件是没问题的(这次是真没问题。。。)如图三,
前半段是未屏蔽pwm_init(PWMB_CH4_P23 ,167,2100);      
这段代码,出来的波形不正常。后半段是屏蔽了,出来的效果就很正常。
是stc本身的问题还是逐飞库写的配置PWM输出有问题呢???
希望工程师解答一下了。
工程文件已发 所有的配置均在mian函数里面的My_Init()函数中 。

void pwm_init(PWMCH_enum pwmch,uint32 freq, uint32 duty)
{
      
      uint32 match_temp;
      uint32 period_temp;
      uint16 freq_div = 0;
      
      
      P_SW2 |= 0x80;
      
      //GPIO需要设置为推挽输出
      pwm_set_gpio(pwmch);


      //分频计算,周期计算,占空比计算
      freq_div = (sys_clk / freq) >> 16;                                                      //多少分频
      period_temp = sys_clk / freq ;                        
      period_temp = period_temp / (freq_div + 1) - 1;                              //周期

      if(duty != PWM_DUTY_MAX)
      {
                match_temp = period_temp * ((float)duty / PWM_DUTY_MAX);      // 占空比                        
      }
      else
      {
                match_temp = period_temp + 1;                                                                // duty为100%
      }

      
      if(PWMB_CH1_P20 <= pwmch)                              //PWM5-8
      {
                //通道选择,引脚选择
                PWMB_ENO |= (1 << ((2 * ((pwmch >> 4) - 4))));                                        //使能通道      
                PWMB_PS |= ((pwmch & 0x03) << ((2 * ((pwmch >> 4) - 4))));                //输出脚选择
               
                // 配置通道输出使能和极性      
                (*(unsigned char volatile far *) (PWM_CCER_ADDR)) |= (uint8)(1 << (((pwmch >> 4) & 0x01) * 4));
               
                //设置预分频
                PWMB_PSCRH = (uint8)(freq_div>>8);
                PWMB_PSCRL = (uint8)freq_div;
               
                PWMB_BKR = 0x80;         //主输出使能 相当于总开关
                PWMB_CR1 = 0x01;      //PWM开始计数
      }
      else
      {
                PWMA_ENO |= (1 << (pwmch & 0x01)) << ((pwmch >> 4) * 2);      //使能通道      
                PWMA_PS|= ((pwmch & 0x07) >> 1) << ((pwmch >> 4) * 2);    //输出脚选择
               
                // 配置通道输出使能和极性      
                (*(unsigned char volatile far *) (PWM_CCER_ADDR)) |= (1 << ((pwmch & 0x01) * 2 + ((pwmch >> 4) & 0x01) * 0x04));

               
                //设置预分频
                PWMA_PSCRH = (uint8)(freq_div>>8);
                PWMA_PSCRL = (uint8)freq_div;

                PWMA_BKR = 0x80;         // 主输出使能 相当于总开关
                PWMA_CR1 = 0x01;      //PWM开始计数
      }
      
      //周期
      (*(unsigned char volatile far *) (PWM_ARR_ADDR)) = (uint8)(period_temp>>8);                //高8位
      (*(unsigned char volatile far *) (PWM_ARR_ADDR + 1)) = (uint8)period_temp;                //低8位

      //设置捕获值|比较值
      (*(unsigned char volatile far *) (PWM_CCR_ADDR))                = match_temp>>8;                        //高8位
      (*(unsigned char volatile far *) (PWM_CCR_ADDR + 1))= (uint8)match_temp;                //低8位
      
      //功能设置
      (*(unsigned char volatile far *) (PWM_CCMR_ADDR)) |= 0x06<<4;                //设置为PWM模式1
      (*(unsigned char volatile far *) (PWM_CCMR_ADDR)) |= 1<<3;                //开启PWM寄存器的预装载功
      

//      P_SW2 &= 0x7F;

}


国芯人工智能 发表于 昨天 15:43

对于您提到的问题,以下是专业的解答:

问题分析

您提到在P2上同时输出多个PWM引脚时,会导致其他引脚不稳定。您还提到当P23配置PWM时,PID控制不正常,电压不够,但示波器显示没问题,因此怀疑是配置问题。以下是详细分析:

1.PWM引脚不稳定的原因

PWM引脚的不稳定通常与以下因素有关:
引脚电压设置错误:通常,PWM引脚的电压设置为逻辑高(1V左右)。如果引脚电压异常(如漏电或引脚处于低电平),会导致PWM不正常工作。
引脚状态错误:引脚状态(如开、关或不工作)可能影响PWM的正常运行。例如,如果引脚处于低电平,可能需要调整PWM位模式。
频率设置不一致:如果多个PWM引脚需要不同的频率,可能需要使用不同的频率设置或调制器(如MPLAB MTD)来实现。然而,您提到未屏蔽时P23的PWM波形异常,可能是引脚电压或频率设置的问题。
引脚与引脚之间的干扰:P2的结构可能导致多个PWM引脚之间存在耦合效应(Crosstalk)。如果未屏蔽P23的PWM,可能导致引脚之间的电压干扰,从而影响整体控制。

2. 检查Mian函数中的设置

您提到工程文件已发,所有配置均在Mian函数中的MyInit()函数中。您提供的代码显示:

c
void pwminit(PWMCHenum pwmch, uint32 freq, uint32 duty)
{
    uint32 matchtemp;
    uint32 periodtemp;
    uint16 freqdiv = 0;

    PSW2 |= 0x80;

    // GPIO需要设置为推挽输出
    pwmsetgpio(pwmch);
}

这里,PSW2 |= 0x80 通常用于设置PWM引脚的推挽状态(通常为逻辑高)。如果P2的引脚电压设置异常,可能导致PWM不正常工作。需要检查P2的引脚电压设置是否正确。

3. 检查逐飞库的设置

逐飞库的配置可能影响PWM输出。如果您未正确配置逐飞库,可能导致PWM引脚不稳定。建议检查逐飞库的PWM配置文件(如P23配置文件),确保所有引脚的频率、位模式和电压设置正确。

4. 电压异常的检查

您的示波器显示电压正常,但P23的PWM输出异常。这可能与引脚电压设置有关。建议检查P2的引脚电压设置,确保以下电压值:
常态引脚电压:+5V
推挽引脚电压:1V

如果引脚电压异常,可能需要调整P2的引脚电压设置。

5. 解决建议

1. 检查引脚电压设置:确保P2的引脚电压设置为+5V或1V,而不是异常值。
2. 检查引脚状态:确保引脚处于正确的状态(如推挽输出)。
3. 检查频率设置:如果多个PWM引脚需要不同的频率,可能需要使用不同的频率设置或调制器(如MPLAB MTD)。
4. 检查逐飞库的配置:确保逐飞库的配置正确,特别是P23的配置文件。
5. 检查P2的结构:P2的结构可能导致PWM引脚之间存在耦合效应,可能需要使用低伏或高伏引脚来减少耦合。

6. 建议查阅文档
查阅P2的PWM配置文档,确保所有引脚的设置正确。
查阅逐飞库的PWM配置文件,确保所有引脚的频率、位模式和电压设置正确。
查阅P2的引脚电压设置文档,确保引脚电压正确。

总结

您提到的P23PWM不稳定可能是以下原因的综合结果:
引脚电压设置异常
引脚状态错误
频率设置不一致
梅花效应(Crosstalk)
逐飞库的配置问题

建议检查上述因素,确保P2的引脚电压、频率和状态设置正确。如果问题依然存在,可能需要进一步查阅P2的结构或逐飞库的配置文件。

[本文内容由国芯人工智能辅助生成,仅供参考]

DebugLab 发表于 昨天 16:28

PWMB所有通道共用时钟和计数器,PWMB所有通道频率必须相同





sugrqbgp 发表于 昨天 17:02

解决了吗

王昱顺 发表于 昨天 18:35

同一组PWM不能使用不同的频率,如果想要使用不同的频率需要切换不同的pwm组
例如PWMB组设置10Khz的频率输出后,想要再输出300Hz的,就必须使用PWMA组进行输出了
PWM输出对同一组上的其他I/O口不会产生影响
如果你不确定是谁的问题,你可以描述一个最简单的PWM输出需求,我给你一个用寄存器写的最小工程你来测试一下

梁工 发表于 5 小时前

STC的PWM没有问题的,已经做了很多应用了,这应该是你程序的问题,要仔细检查,或者使用STC官方的例子测试。
同一个P2口,不做PWM输出的IO是不受影响的。
页: [1]
查看完整版本: P2多个引脚同时输出PWM时,会导致P2其他引脚不稳定??