找回密码
 立即注册
查看: 24|回复: 4

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

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-06-15 15:39:23
已绑定手机

2

主题

4

回帖

28

积分

新手上路

积分
28
发表于 昨天 15:39 | 显示全部楼层 |阅读模式
为什么P2多个引脚输出不同频率PWM时,同一组的其他PWM引脚会不稳定吗???
当P23配置输出PWM时,导致我们之前调的PID完全不正常,
我们本以为是电压不够,但经过示波器打过,我感觉像是没问题。

图1

图1

我们确定了硬件是没问题的(这次是真没问题。。。)如图三,
前半段是未屏蔽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[pwmch>>5])) |= (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[pwmch>>5])) |= (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[pwmch>>6])) = (uint8)(period_temp>>8);                //高8位
        (*(unsigned char volatile far *) (PWM_ARR_ADDR[pwmch>>6] + 1)) = (uint8)period_temp;                //低8位

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

//        P_SW2 &= 0x7F;

}


图2

图2
微信图片_20250615152811.png

123112.rar

2.21 MB, 下载次数: 1

工程文件

回复

使用道具 举报 送花

3

主题

727

回帖

165

积分

等待验证会员

积分
165
发表于 昨天 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()函数中。您提供的代码显示:
  1. c
  2. void pwminit(PWMCHenum pwmch, uint32 freq, uint32 duty)
  3. {
  4.     uint32 matchtemp;
  5.     uint32 periodtemp;
  6.     uint16 freqdiv = 0;
  7.     PSW2 |= 0x80;
  8.     // GPIO需要设置为推挽输出
  9.     pwmsetgpio(pwmch);
  10. }
复制代码

这里,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的结构或逐飞库的配置文件。

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:467
  • 最近打卡:2025-06-15 16:24:12
已绑定手机

79

主题

5130

回帖

9132

积分

超级版主

DebugLab

积分
9132
发表于 昨天 16:28 | 显示全部楼层
PWMB所有通道共用时钟和计数器,PWMB所有通道频率必须相同

截图202506151627445925.jpg
截图202506151627532381.jpg
截图202506151628057710.jpg

DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-06-15 11:58:16
已绑定手机

1

主题

21

回帖

61

积分

注册会员

积分
61
发表于 昨天 17:02 | 显示全部楼层
解决了吗
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:498
  • 最近打卡:2025-06-15 10:18:37
已绑定手机
已实名认证

112

主题

2387

回帖

6004

积分

版主

积分
6004
发表于 昨天 18:35 | 显示全部楼层
同一组PWM不能使用不同的频率,如果想要使用不同的频率需要切换不同的pwm组
例如PWMB组设置10Khz的频率输出后,想要再输出300Hz的,就必须使用PWMA组进行输出了
PWM输出对同一组上的其他I/O口不会产生影响
如果你不确定是谁的问题,你可以描述一个最简单的PWM输出需求,我给你一个用寄存器写的最小工程你来测试一下
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-6-16 03:44 , Processed in 0.170458 second(s), 79 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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