找回密码
 立即注册
查看: 1215|回复: 8

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

[复制链接]

1

主题

4

回帖

25

积分

新手上路

积分
25
发表于 2023-5-15 20:45:24 | 显示全部楼层 |阅读模式
大家好!求助一下PWM配置问题。

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

回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:51
  • 最近打卡:2025-05-02 10:07:51

73

主题

5883

回帖

1万

积分

超级版主

积分
12081
发表于 2023-5-15 22:08:12 | 显示全部楼层
有2组PWM,为什么不各用一组,不需要切换。
回复 支持 反对

使用道具 举报 送花

1

主题

4

回帖

25

积分

新手上路

积分
25
发表于 2023-5-16 08:19:54 | 显示全部楼层
梁*** 发表于 2023-5-15 22:08
有2组PWM,为什么不各用一组,不需要切换。

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

使用道具 举报 送花

1

主题

4

回帖

25

积分

新手上路

积分
25
发表于 2023-5-16 08:51:25 | 显示全部楼层
本帖最后由 cadillacxlr 于 2023-5-16 08:53 编辑

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

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

点评

你没有关闭PWM,所以依旧有输出。 STC8H系列的高级PWM,连续输出0或1有2种方法(以PWM1P为例): 1、使用PWMx_ENO禁止输出PWM,对应IO成为普通IO,禁止PWM输出后,由这个IO直接输出高或低电平。 PWMA_ENO |= 0x0  详情 回复 发表于 2023-5-16 10:00
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:51
  • 最近打卡:2025-05-02 10:07:51

73

主题

5883

回帖

1万

积分

超级版主

积分
12081
发表于 2023-5-16 10:00:41 | 显示全部楼层
cadill*** 发表于 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

回复 支持 反对

使用道具 举报 送花

1

主题

4

回帖

25

积分

新手上路

积分
25
发表于 2023-5-16 11:13:26 | 显示全部楼层
我找到问题了,是一个低级的问题。
PWM初始化是正确的,操作相关寄存器之前,都是关闭了寄存器的。
错的是我在主循环一直在初始化PWM,其实只要初始化一下就够了,下次切换再初始化一下。但我一停不停在初始化,就不对了。
我还怀疑是寄存器操作问题... 其实是自己粗心大意了...
谢谢梁工支持,谢谢关注!

点评

所有的外设(不单单是PWM),只要配置不变,都不需要重新初始化。  详情 回复 发表于 2023-5-16 11:30
回复 支持 反对

使用道具 举报 送花

1

主题

4

回帖

25

积分

新手上路

积分
25
发表于 2023-5-16 11:16:37 | 显示全部楼层
20230516111454.png

20230516111543.png
同一个PWM8, 不同引脚,不同配置,输出都是正常的
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:51
  • 最近打卡:2025-05-02 10:07:51

73

主题

5883

回帖

1万

积分

超级版主

积分
12081
发表于 2023-5-16 11:30:13 | 显示全部楼层
cadill*** 发表于 2023-5-16 11:13
我找到问题了,是一个低级的问题。
PWM初始化是正确的,操作相关寄存器之前,都是关闭了寄存器的。
错的是 ...

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

使用道具 举报 送花

2

主题

2

回帖

102

积分

注册会员

积分
102
发表于 2023-5-25 09:31:37 | 显示全部楼层
看了楼主的用法,给我提供了一个很好的思路,最近也想用STC32G驱动多路电机,但PWM不够,本来想通过PWMA组的互补输出P和N端切换来复用,但看了楼主的用法,感觉更简单实用,很好的思路,感谢!
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-3 22:25 , Processed in 0.122355 second(s), 106 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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