cadillacxlr 发表于 2023-5-15 20:45:24

[求助]PWM在不同引脚间切换的配置问题

大家好!求助一下PWM配置问题。

我的使用场景是 PWM8 连接了 P2.3 与 P0.3 两个引脚,需要输出不同频率与占空比的 PWM 波形,不会同时输出。
程序中如果只初始化其中一个,都能正确输出 PWM 波形。
但要将PWM输出在 两个引脚间切换时,示波器看着波形的频率和占空比不对。
像这种需要将 PWM 关闭, 再配置到另外引脚输出的情况, 需要注意哪些寄存器的操作呢?
望赐教,谢谢!

梁工 发表于 2023-5-15 22:08:12

有2组PWM,为什么不各用一组,不需要切换。

cadillacxlr 发表于 2023-5-16 08:19:54

梁工 发表于 2023-5-15 22:08
有2组PWM,为什么不各用一组,不需要切换。

梁工你好,感谢关注。实际情况是PWMA 和 PWMB 8个输出我都用完了。因为要驱动好几个电机。
PWM的引脚重映射挺好的,但我试了每次映射前去初始化PWM,不知道是哪里没对,波形不是我想要的频率和占空比。

cadillacxlr 发表于 2023-5-16 08:51:25

本帖最后由 cadillacxlr 于 2023-5-16 08:53 编辑


我用了 PWM8_1(P2.3)与PWM8_3(P0.3)输出 PWM信号。
每2秒切换一下通道,这个是对的。
PWM8_1 设置的占空比是 高电平75%, PWM8_3设置的占空比是 50%, 这个对于高电平来说是对的,但是对于低电平来说,它里面还有PWM波形。

现在的问题就是 PWM波形低电平,为什么里面会有高电平。

单片机是 STC8H8K64U,在开发板上做的实验,用逻辑分析仪查看的波形。

梁工 发表于 2023-5-16 10:00:41

cadillacxlr 发表于 2023-5-16 08:51
我用了 PWM8_1(P2.3)与PWM8_3(P0.3)输出 PWM信号。
每2秒切换一下通道,这个是对的。
PWM8_1 设置的 ...

你没有关闭PWM,所以依旧有输出。

STC8H系列的高级PWM,连续输出0或1有2种方法(以PWM1P为例):

1、使用PWMx_ENO禁止输出PWM,对应IO成为普通IO,禁止PWM输出后,由这个IO直接输出高或低电平。
PWMA_ENO |= 0x01;   // 允许PWM1P输出
delay_ms(5);      // P1.0输出PWM 5ms
P10 = 1;            // P1.0输出高电平
PWMA_ENO &= ~0x01;// 关闭PWM输出
delay_ms(5);      // P1.0输出高电平5ms
               
PWMA_ENO |= 0x01;   // 允许PWM1P输出
delay_ms(5);      // P1.0输出PWM 5ms
P10 = 0;            // P1.0输出低电平
PWMA_ENO &= ~0x01;// 关闭PWM输出
delay_ms(5);      // P1.0输出高电平5ms

2、设置PWMx_CCMRn,强制PWM输出有效(高)电平/无效(低)电平。
PWMA_CCMR1 = (PWMA_CCMR1 & ~0x70) | 0x60;// PWM正常输出
delay_ms(5);                               // PWM输出5ms
PWMA_CCMR1 = (PWMA_CCMR1 & ~0x70) | 0x40;// 强制PWM输出无效(低)电平
delay_ms(5);                               // PWM输出低电平5ms
PWMA_CCMR1 = (PWMA_CCMR1 & ~0x70) | 0x60;// PWM正常输出
delay_ms(5);                               // PWM输出5ms
PWMA_CCMR1 = (PWMA_CCMR1 & ~0x70) | 0x50;//强制PWM输出有效(高)电平
delay_ms(5);                               // PWM输出高电平5ms

cadillacxlr 发表于 2023-5-16 11:13:26

我找到问题了,是一个低级的问题。
PWM初始化是正确的,操作相关寄存器之前,都是关闭了寄存器的。
错的是我在主循环一直在初始化PWM,其实只要初始化一下就够了,下次切换再初始化一下。但我一停不停在初始化,就不对了。
我还怀疑是寄存器操作问题... 其实是自己粗心大意了...
谢谢梁工支持,谢谢关注!

cadillacxlr 发表于 2023-5-16 11:16:37




同一个PWM8, 不同引脚,不同配置,输出都是正常的

梁工 发表于 2023-5-16 11:30:13

cadillacxlr 发表于 2023-5-16 11:13
我找到问题了,是一个低级的问题。
PWM初始化是正确的,操作相关寄存器之前,都是关闭了寄存器的。
错的是 ...

所有的外设(不单单是PWM),只要配置不变,都不需要重新初始化。

xymxym 发表于 2023-5-25 09:31:37

看了楼主的用法,给我提供了一个很好的思路,最近也想用STC32G驱动多路电机,但PWM不够,本来想通过PWMA组的互补输出P和N端切换来复用,但看了楼主的用法,感觉更简单实用,很好的思路,感谢!
页: [1]
查看完整版本: [求助]PWM在不同引脚间切换的配置问题