硬件PWM 停止输出时,怎么设置默认电平状态???
如图在 PWMA互补 PWM 正常输出时,突然关闭 PWMA_BKR ,怎么设置他 关闭输出时的默认电平状态,是高电平,还是低电平??
我怎么弄他都是高电平,我想让他不输出时为两路低电平
{:4_192:}{:4_192:}{:4_192:}
<p>好的,信息已经足够充分了。现在我来回答您的问题。</p>
<hr />
<h2>问题分析</h2>
<p>您遇到的情况是:<strong>PWMA 互补 PWM 正常输出时,通过关闭 <code>PWMA_BKR</code>(实际上是清除其 bit7 <code>MOE</code> 位)来停止输出,但停止后两路引脚都呈现高电平,而您希望它们都变为低电平。</strong></p>
<h2>根本原因</h2>
<p>您当前代码中第 69 行被注释掉了:</p>
<pre><code class="language-c">//PWMA_OISR = 0x00;
</code></pre>
<p><strong><code>PWMA_OISR</code> 寄存器正是控制 MOE=0(即关闭输出)时,各通道输出引脚的空闲电平的寄存器。</strong> 由于您没有显式设置它,该寄存器上电默认值可能是 0xFF(所有位为 1),导致空闲状态下输出高电平。</p>
<h2>解决方案</h2>
<h3>关键寄存器:<code>PWMA_OISR</code>(输出空闲状态寄存器)</h3>
<p>根据手册(STC8H 手册第 25 章"16位高级PWM定时器,支持正交编码器"→"输出空闲状态寄存器(PWMx_OISR)"):</p>
<table>
<thead>
<tr>
<th align="center">位</th>
<th align="center">符号</th>
<th align="left">说明</th>
</tr>
</thead>
<tbody>
<tr>
<td align="center">B5</td>
<td align="center">OIS3N</td>
<td align="left"><strong>空闲状态时 OC3N 输出电平</strong></td>
</tr>
<tr>
<td align="center">B4</td>
<td align="center">OIS3</td>
<td align="left"><strong>空闲状态时 OC3 输出电平</strong></td>
</tr>
</tbody>
</table>
<ul>
<li><strong>OIS3N / OIS3 = 0</strong>:当 MOE=0 时,则在一个死区时间后,OC3N/OC3 = <strong>0</strong>(低电平)</li>
<li><strong>OIS3N / OIS3 = 1</strong>:当 MOE=0 时,则在一个死区时间后,OC3N/OC3 = <strong>1</strong>(高电平)</li>
</ul>
<p>从您的代码看,您使用的是 <strong>通道 3 互补输出</strong>(<code>PWMA_CCMR3</code>、<code>PWMA_CCER2</code>、<code>PWMA_ENO = 0x30</code>),对应的是 <strong>OC3 和 OC3N</strong> 两路输出。</p>
<h3>具体修改方法</h3>
<p>在初始化中,将 <code>PWMA_OISR</code> 的 bit4(OIS3)和 bit5(OIS3N)都设为 <strong>0</strong>:</p>
<pre><code class="language-c">PWMA_OISR &= ~0x30; // 清除 bit4 和 bit5,使 OC3 和 OC3N 空闲时为低电平
// 或者直接赋值:
PWMA_OISR = 0x00; // 所有通道空闲输出均为低电平(如果其他通道无特殊要求)
</code></pre>
<p><strong>建议放在 <code>PWMA_BKR = 0x80;</code> 之前设置</strong>,因为手册注明:一旦 LOCK 级别 ≥ 1,OISR 寄存器位将被锁定不可修改。您当前 <code>PWMA_BKR = 0x80</code> 即 <code>MOE=1, LOCK=00</code>,LOCK 为 00 无保护,所以顺序上没问题,但养成先配置 OISR 再配置 BKR 的习惯更稳妥。</p>
<h3>完整修改示例</h3>
<pre><code class="language-c">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;
</code></pre>
<h3>如何关闭输出并保持低电平</h3>
<p>当您想关闭 PWM 输出时,<strong>清除 <code>PWMA_BKR</code> 的 bit7(MOE 位)</strong>:</p>
<pre><code class="language-c">PWMA_BKR &= ~0x80; // 清除 MOE,关闭主输出,引脚进入空闲状态(低电平)
</code></pre>
<p>恢复输出时再置位 MOE:</p>
<pre><code class="language-c">PWMA_BKR |= 0x80; // 置位 MOE,恢复 PWM 输出
</code></pre>
<h2>总结</h2>
<table>
<thead>
<tr>
<th align="left">您想要的效果</th>
<th align="left">设置方法</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">关闭输出时两路都为<strong>低电平</strong></td>
<td align="left"><code>PWMA_OISR &= ~0x30;</code>(OIS3=0, OIS3N=0)</td>
</tr>
<tr>
<td align="left">关闭输出时两路都为<strong>高电平</strong>(当前现象)</td>
<td align="left">`PWMA_OISR</td>
</tr>
</tbody>
</table>
<blockquote>
<p><strong>信息来源</strong>:STC8H 系列手册第 25 章"16位高级PWM定时器,支持正交编码器"→"输出空闲状态寄存器(PWMx_OISR)"及"刹车寄存器(PWMx_BKR)"。</p>
</blockquote>
<hr />
<p><a href="https://www.stcaimcu.com/plugin.php?id=twpx_xunsearch&mod=forum&q=%E5%A6%82%E5%9B%BE%20%20%E5%9C%A8%20PWMA%20%20%E4%BA%92%E8%A1%A5%20PWM%20%E6%AD%A3%E5%B8%B8%E8%BE%93%E5%87%BA%E6%97%B6%20%E7%AA%81%E7%84%B6%E5%85%B3%E9%97%AD%20PWMA_BKR%20%E6%80%8E%E4%B9%88%E8%AE%BE%E7%BD%AE%E4%BB%96%20%20%20%E5%85%B3%E9%97%AD%E8%BE%93%E5%87%BA%E6%97%B6%20%20%E7%9A%84%E9%BB%98%E8%AE%A4%E7%94%B5%E5%B9%B3%E7%8A%B6&f=_all&m=yes&syn=yes&s=relevance&fid=0">🔍 搜索 "如图在 PWMA互补 PWM 正常输出时 突然关闭 PWMA_BKR 怎么设置他 关闭输出时的默认电平状"</a></p>
<p>⏱️ 查找用时 9.2s | 总回答用时 19.6s</p>
请首先使用STC的【AI助手】,来获得强大及时的技术支援。
当然,最可靠的还是人,AI 犯错也是常见的事
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
神农鼎 发表于 2026-7-2 08:05
好的,信息已经足够充分了。现在我来回答您的问题。
问题分析
搞好了,谢谢
{:4_186:}
页:
[1]