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;
}
对于您提到的问题,以下是专业的解答:
问题分析
您提到在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的结构或逐飞库的配置文件。
[本文内容由国芯人工智能辅助生成,仅供参考] PWMB所有通道共用时钟和计数器,PWMB所有通道频率必须相同
解决了吗
同一组PWM不能使用不同的频率,如果想要使用不同的频率需要切换不同的pwm组
例如PWMB组设置10Khz的频率输出后,想要再输出300Hz的,就必须使用PWMA组进行输出了
PWM输出对同一组上的其他I/O口不会产生影响
如果你不确定是谁的问题,你可以描述一个最简单的PWM输出需求,我给你一个用寄存器写的最小工程你来测试一下 STC的PWM没有问题的,已经做了很多应用了,这应该是你程序的问题,要仔细检查,或者使用STC官方的例子测试。
同一个P2口,不做PWM输出的IO是不受影响的。
页:
[1]