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

硬件PWM 停止输出时,怎么设置默认电平状态???

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:18
  • 最近打卡:2026-07-02 00:52:37
已绑定手机

5

主题

16

回帖

41

积分

新手上路

积分
41
发表于 3 天前 来自手机 | 显示全部楼层 |阅读模式
如图  在 PWMA  互补 PWM 正常输出时,突然关闭 PWMA_BKR ,
怎么设置他   关闭输出时  的默认电平状态,是高电平,还是低电平??
我怎么弄他都是高电平,我想让他不输出时为两路低电平

IMG_3135.jpeg
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:453
  • 最近打卡:2026-07-03 08:57:36

830

主题

1万

回帖

2万

积分

管理员

积分
23929
发表于 3 天前 | 显示全部楼层
截图202607020804586099.jpg
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:453
  • 最近打卡:2026-07-03 08:57:36

830

主题

1万

回帖

2万

积分

管理员

积分
23929
发表于 3 天前 | 显示全部楼层

好的,信息已经足够充分了。现在我来回答您的问题。


问题分析

您遇到的情况是:PWMA 互补 PWM 正常输出时,通过关闭 PWMA_BKR(实际上是清除其 bit7 MOE 位)来停止输出,但停止后两路引脚都呈现高电平,而您希望它们都变为低电平。

根本原因

您当前代码中第 69 行被注释掉了:

//PWMA_OISR = 0x00;

PWMA_OISR 寄存器正是控制 MOE=0(即关闭输出)时,各通道输出引脚的空闲电平的寄存器。 由于您没有显式设置它,该寄存器上电默认值可能是 0xFF(所有位为 1),导致空闲状态下输出高电平。

解决方案

关键寄存器:PWMA_OISR(输出空闲状态寄存器)

根据手册(STC8H 手册第 25 章"16位高级PWM定时器,支持正交编码器"→"输出空闲状态寄存器(PWMx_OISR)"):

符号 说明
B5 OIS3N 空闲状态时 OC3N 输出电平
B4 OIS3 空闲状态时 OC3 输出电平
  • OIS3N / OIS3 = 0:当 MOE=0 时,则在一个死区时间后,OC3N/OC3 = 0(低电平)
  • OIS3N / OIS3 = 1:当 MOE=0 时,则在一个死区时间后,OC3N/OC3 = 1(高电平)

从您的代码看,您使用的是 通道 3 互补输出PWMA_CCMR3PWMA_CCER2PWMA_ENO = 0x30),对应的是 OC3 和 OC3N 两路输出。

具体修改方法

在初始化中,将 PWMA_OISR 的 bit4(OIS3)和 bit5(OIS3N)都设为 0

PWMA_OISR &= ~0x30;   // 清除 bit4 和 bit5,使 OC3 和 OC3N 空闲时为低电平
// 或者直接赋值:
PWMA_OISR = 0x00;     // 所有通道空闲输出均为低电平(如果其他通道无特殊要求)

建议放在 PWMA_BKR = 0x80; 之前设置,因为手册注明:一旦 LOCK 级别 ≥ 1,OISR 寄存器位将被锁定不可修改。您当前 PWMA_BKR = 0x80MOE=1, LOCK=00,LOCK 为 00 无保护,所以顺序上没问题,但养成先配置 OISR 再配置 BKR 的习惯更稳妥。

完整修改示例

PWMA_CCER2 = 0x00;
PWMA_CCMR3 = 0x68;
PWMA_CCER2 = 0x0f;
Temp = 24000000/HZ2/(PSCR_Cnt+1) - 1;
PWMA_ARR = (unsigned int)Temp;
PWMA_CCR3 = (unsigned int)(Temp*PWM1/100);

PWMA_OISR = 0x00;          // ★ 关键:空闲时所有通道输出低电平
PWMA_ENO = 0x30;
PWMA_BKR = 0x80;           // MOE=1,使能主输出
PWMA_DTR = 255;
PWMA_CR1 = 0x01;

如何关闭输出并保持低电平

当您想关闭 PWM 输出时,清除 PWMA_BKR 的 bit7(MOE 位)

PWMA_BKR &= ~0x80;   // 清除 MOE,关闭主输出,引脚进入空闲状态(低电平)

恢复输出时再置位 MOE:

PWMA_BKR |= 0x80;    // 置位 MOE,恢复 PWM 输出

总结

您想要的效果 设置方法
关闭输出时两路都为低电平 PWMA_OISR &= ~0x30;(OIS3=0, OIS3N=0)
关闭输出时两路都为高电平(当前现象) `PWMA_OISR

信息来源:STC8H 系列手册第 25 章"16位高级PWM定时器,支持正交编码器"→"输出空闲状态寄存器(PWMx_OISR)"及"刹车寄存器(PWMx_BKR)"。


🔍 搜索 "如图 在 PWMA 互补 PWM 正常输出时 突然关闭 PWMA_BKR 怎么设置他 关闭输出时 的默认电平状"

⏱️ 查找用时 9.2s | 总回答用时 19.6s

回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:453
  • 最近打卡:2026-07-03 08:57:36

830

主题

1万

回帖

2万

积分

管理员

积分
23929
发表于 3 天前 | 显示全部楼层
请首先使用STC的【AI助手】,来获得强大及时的技术支援。
当然,最可靠的还是人,AI 犯错也是常见的事
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:393
  • 最近打卡:2026-07-04 17:13:30

83

主题

7888

回帖

1万

积分

超级版主

积分
16827
发表于 3 天前 | 显示全部楼层
STC8H系列的高级PWM,连续输出0或1有2种方法(以PWM1P为例):

1、使用PWMx_ENO禁止输出PWM,对应IO成为普通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

回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-7-5 07:47 , Processed in 0.077552 second(s), 63 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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