神农鼎 发表于 6 天前

网友问:用的官网测试程序 编码器脉冲怎么不计数呢一直是0

网友问:
用的官网测试程序 编码器脉冲怎么不计数呢一直是0



神仙问题问神仙,具体程序都没有啊




神农鼎 发表于 6 天前

<p>好的,信息已经比较充分了。现在我来分析您的问题。</p>
<p>从您提供的截图来看,串口通信正常(能收到&quot;PULSE=000000&quot;),但脉冲值始终为0。结合手册中的示例程序和配置,我来帮您排查。</p>
<hr />
<h2>问题分析:编码器脉冲始终为0的排查</h2>
<p>根据手册中 <strong>&quot;16位高级PWM定时器,支持正交编码器&quot;</strong> 章节的示例程序和配置说明,我列出以下几个<strong>最可能的原因</strong>,请您逐一检查:</p>
<hr />
<h3>🔍 原因一:编码器信号未正确接入(最常见)</h3>
<p>手册中明确说明编码器输入引脚为:</p>
<ul>
<li><strong>编码器A相 → PWM1P → P1.0</strong></li>
<li><strong>编码器B相 → PWM2P → P1.2</strong></li>
</ul>
<p>请检查:</p>
<ol>
<li><strong>编码器A相是否接到了 P1.0</strong>,B相是否接到了 <strong>P1.2</strong></li>
<li><strong>编码器的GND是否与单片机共地</strong></li>
<li>编码器是<strong>增量式编码器(正交输出)</strong> 吗?如果是霍尔传感器或开关信号,需要确认输出是否为标准的正交方波信号</li>
</ol>
<blockquote>
<p>如果编码器输出是 <strong>OC/OD 开漏输出</strong>,需要在 P1.0 和 P1.2 上<strong>外加上拉电阻(4.7kΩ~10kΩ)</strong>。</p>
</blockquote>
<hr />
<h3>🔍 原因二:I/O口模式未配置为高阻输入</h3>
<p>编码器输入属于<strong>外部信号输入</strong>,P1.0 和 P1.2 必须配置为 <strong>高阻输入模式</strong>。</p>
<p>手册示例程序中配置的是:</p>
<pre><code class="language-c">P1M1 = 0x00;
P1M0 = 0x00;   // 准双向口
</code></pre>
<p>但<strong>准双向口有弱上拉</strong>,可能会影响外部编码器信号的电平。建议改为:</p>
<pre><code class="language-c">P1M1 = 0x05;   // 二进制 0000 0101,P1.0和P1.2设为高阻输入
P1M0 = 0x00;
</code></pre>
<p>或者更精确地只配置 P1.0 和 P1.2:</p>
<pre><code class="language-c">P1M1 |= 0x05;   // P1.0(bit0)和P1.2(bit2)设为1 → 高阻输入
P1M0 &amp;= ~0x05;
</code></pre>
<hr />
<h3>🔍 原因三:PWMA_PS 引脚选择是否正确</h3>
<p>手册中 <code>PWMA_PS</code> 寄存器的默认值为 <code>0x00</code>,此时:</p>
<ul>
<li><strong>PWM1P → P1.0</strong> ✅</li>
<li><strong>PWM2P → P1.2</strong> ✅</li>
</ul>
<p>如果您的代码中修改了 <code>PWMA_PS</code>,请确认其值为 <code>0x00</code>。示例程序中已正确配置:</p>
<pre><code class="language-c">PWMA_PS = 0;   // IO选择P1.0 P1.2
</code></pre>
<hr />
<h3>🔍 原因四:编码器信号频率/电平不匹配</h3>
<ul>
<li><strong>信号电平</strong>:编码器输出高电平必须 ≥ 0.7×VCC(若 VCC=3.3V,则需 ≥ 2.3V),低电平必须 ≤ 0.3×VCC</li>
<li><strong>信号频率</strong>:STC8H 的编码器模式可以处理较高频率,但如果编码器转速极高(如 &gt; 数万转/分钟),需确认是否超出计数能力</li>
<li><strong>可以用示波器/逻辑分析仪</strong> 抓一下 P1.0 和 P1.2 的波形,确认是否有正常的正交方波信号</li>
</ul>
<hr />
<h3>🔍 原因五:检查 PWMA_CNTR 是否被意外清零</h3>
<p>示例程序中,<code>PWMA_config()</code> 函数内有:</p>
<pre><code class="language-c">PWMA_CNTR = 0;   // 清零编码器计数器值
</code></pre>
<p>这仅在初始化时清零一次,是正常的。但如果主循环中或中断中又对 <code>PWMA_CNTR</code> 写了值,会导致计数丢失。请检查您的代码中是否有其他地方对 <code>PWMA_CNTR</code> 进行了写操作。</p>
<hr />
<h3>🔍 原因六:确认编码器模式配置</h3>
<p>手册示例中配置的是 <strong>模式2</strong>(<code>PWMA_SMCR = 2</code>),即每个脉冲两个边沿加减2。您截图中注释提到模式1/2/3,请确认您实际下载的 hex 文件中配置的模式与您的编码器匹配。</p>
<hr />
<h3>✅ 快速验证步骤</h3>
<p>建议您按以下顺序快速排查:</p>
<table>
<thead>
<tr>
<th>步骤</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>1</strong></td>
<td>用万用表测 P1.0 和 P1.2 对 GND 的电压,用手转动编码器,看电压是否在高低电平之间变化</td>
</tr>
<tr>
<td><strong>2</strong></td>
<td>确认编码器 GND 与单片机 GND 已连接</td>
</tr>
<tr>
<td><strong>3</strong></td>
<td>在 P1.0 和 P1.2 对 VCC 各加一个<strong>10kΩ 上拉电阻</strong>(如果编码器是开漏输出)</td>
</tr>
<tr>
<td><strong>4</strong></td>
<td>在代码初始化中增加 `P1M1</td>
</tr>
<tr>
<td><strong>5</strong></td>
<td>重新下载程序(选择 11.059MHz IRC),再观察串口输出</td>
</tr>
</tbody>
</table>
<hr />
<p>如果以上排查后问题仍然存在,请您补充以下信息,我帮您进一步分析:</p>
<ol>
<li><strong>您使用的编码器型号</strong>(或输出信号类型:是正交方波?还是霍尔开关?)</li>
<li><strong>编码器的工作电压</strong> 和 <strong>单片机的供电电压</strong>(VCC 是 3.3V 还是 5V?)</li>
<li><strong>P1.0 和 P1.2 上是否有外接上拉电阻?</strong></li>
<li><strong>您是否修改过官方的示例代码?</strong> 如果修改过,请贴出修改后的 <code>PWMA_config()</code> 函数内容</li>
</ol>
<hr />
<p><a href="https://www.stcaimcu.com/plugin.php?id=twpx_xunsearch&amp;mod=forum&amp;q=%E7%94%A8%E7%9A%84%E5%AE%98%E7%BD%91%E6%B5%8B%E8%AF%95%E7%A8%8B%E5%BA%8F%20%E7%BC%96%E7%A0%81%E5%99%A8%E8%84%89%E5%86%B2%E6%80%8E%E4%B9%88%E4%B8%8D%E8%AE%A1%E6%95%B0%E5%91%A2%E4%B8%80%E7%9B%B4%E6%98%AF0&amp;f=_all&amp;m=yes&amp;syn=yes&amp;s=relevance&amp;fid=0">🔍 搜索 &quot;用的官网测试程序 编码器脉冲怎么不计数呢一直是0&quot;</a></p>
<p><strong>📌 相关论坛讨论</strong></p>
<ol>
<li><a href="https://www.stcaimcu.com/forum.php?mod=viewthread&amp;tid=5920&amp;highlight=%E7%94%A8%E7%9A%84%E5%AE%98%E7%BD%91%E6%B5%8B%E8%AF%95%E7%A8%8B%E5%BA%8F%20%E7%BC%96%E7%A0%81%E5%99%A8%E8%84%89%E5%86%B2%E6%80%8E%E4%B9%88%E4%B8%8D%E8%AE%A1%E6%95%B0%E5%91%A2%E4%B8%80%E7%9B%B4%E6%98%AF0&amp;page=3&amp;extra=#pid50234">STC32单片机学习记录 | 建议立即 【免费+包邮送】实验箱,提高学习效率</a></li>
<li><a href="https://www.stcaimcu.com/forum.php?mod=viewthread&amp;tid=22990&amp;highlight=%E7%94%A8%E7%9A%84%E5%AE%98%E7%BD%91%E6%B5%8B%E8%AF%95%E7%A8%8B%E5%BA%8F%20%E7%BC%96%E7%A0%81%E5%99%A8%E8%84%89%E5%86%B2%E6%80%8E%E4%B9%88%E4%B8%8D%E8%AE%A1%E6%95%B0%E5%91%A2%E4%B8%80%E7%9B%B4%E6%98%AF0&amp;page=1&amp;extra=#pid211690">用定时器4当计数器用该怎么设置</a></li>
<li><a href="https://www.stcaimcu.com/forum.php?mod=viewthread&amp;tid=15182&amp;highlight=%E7%94%A8%E7%9A%84%E5%AE%98%E7%BD%91%E6%B5%8B%E8%AF%95%E7%A8%8B%E5%BA%8F%20%E7%BC%96%E7%A0%81%E5%99%A8%E8%84%89%E5%86%B2%E6%80%8E%E4%B9%88%E4%B8%8D%E8%AE%A1%E6%95%B0%E5%91%A2%E4%B8%80%E7%9B%B4%E6%98%AF0&amp;page=1&amp;extra=#pid147113">求助:8H1K08 SOP16接编码器读不到脉冲数字 [已解决]</a></li>
</ol>
<p>⏱️ 查找用时 12.0s | 总回答用时 27.9s</p>
页: [1]
查看完整版本: 网友问:用的官网测试程序 编码器脉冲怎么不计数呢一直是0