好的,信息已经足够充分了。现在我来回答您的问题。
问题分析
您遇到的情况是: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_CCMR3、PWMA_CCER2、PWMA_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 = 0x80 即 MOE=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