小垃圾 发表于 2025-4-16 18:45:08

PWM编码器模式范例程序

<p><img src="data/attachment/forum/202504/16/184254hst3mvabwwve8z0v.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202504/16/184325krfffqbq0q0zfshk.png" alt="image.png" title="image.png" /></p>
<ul>
<li>配置PWMA_CCER1 = 0x55;是对B6,B4 ,B2,B0位进行操作,但是编码器应该工作在输入模式,应该是0x33才对。如果分析的有问题,请大佬指出。</li>
</ul>

国芯人工智能 发表于 2025-4-16 18:48:00

关于您提到的PWM编码器模式配置问题,首先需要明确的是,PWM编码器模式的具体配置取决于所使用的微控制器或处理器的寄存器定义及其功能描述。以下是对您提出的问题的专业分析:

1. 寄存器配置分析
您提到的PWMACCER1寄存器,其配置值0x55和0x33分别对应不同的位操作。具体来说:
0x55的二进制表示为01010101,这意味着对B7、B5、B3、B1位进行了置位操作。
0x33的二进制表示为00110011,这意味着对B6、B5、B2、B1位进行了置位操作。

2. 编码器模式的工作机制
在PWM编码器模式下,通常需要配置相关的输入捕获通道以捕获编码器的脉冲信号。具体配置可能包括:
输入捕获模式:将PWM通道配置为输入捕获模式,以捕获编码器的脉冲信号。
极性配置:根据编码器的信号极性,配置捕获通道的极性。
滤波器配置:根据需要配置输入信号的滤波器,以消除噪声。

3. 配置值的合理性
根据您提供的信息,0x33的配置值可能更符合编码器输入模式的需求,因为它对B6、B5、B2、B1位进行了置位操作,这些位可能对应输入捕获通道的使能和极性配置。

4. 具体配置建议
为了确保编码器模式正常工作,建议您参考所使用的微控制器或处理器的参考手册,确认PWMACCER1寄存器的具体位定义及其功能。以下是一个可能的配置步骤:

1. 使能输入捕获通道:根据编码器连接的PWM通道,使能相应的输入捕获通道。
2. 配置极性:根据编码器的信号极性,配置捕获通道的极性。
3. 配置滤波器:根据需要配置输入信号的滤波器。
4. 启动PWM模块:启动PWM模块,开始捕获编码器的脉冲信号。

5. 示例代码
以下是一个可能的配置示例代码:

c
// 假设PWMACCER1寄存器的位定义如下:
// B7: 保留
// B6: 通道3输入捕获使能
// B5: 通道3输入捕获极性
// B4: 通道2输入捕获使能
// B3: 通道2输入捕获极性
// B2: 通道1输入捕获使能
// B1: 通道1输入捕获极性
// B0: 保留

// 配置PWMACCER1寄存器为0x33
PWMACCER1 = 0x33; // 使能通道1、通道2、通道3的输入捕获,并配置极性

// 其他相关配置
// 例如,配置滤波器、启动PWM模块等

6. 总结
在配置PWM编码器模式时,务必参考所使用的微控制器或处理器的参考手册,确保寄存器的配置值符合实际需求。您提到的0x33配置值可能更符合编码器输入模式的需求,但具体配置仍需根据实际情况进行调整。

希望以上分析对您有所帮助。如有进一步问题,欢迎继续讨论。

[本文内容由国芯人工智能辅助生成,仅供参考]

小垃圾 发表于 2025-4-16 18:50:47

国芯人工智能 发表于 2025-4-16 18:48
关于您提到的PWM编码器模式配置问题,首先需要明确的是,PWM编码器模式的具体配置取决于所使用的微控制器或 ...

好的好的 碉堡了 太强了

ercircle 发表于 2025-4-16 19:06:47

输入捕获流程里确实没提要用CC1NE,看输入捕获单独用例没配置这个。
你看的这个正交编码器用例没用过,应该不是单纯的捕获用例吧。

小垃圾 发表于 2025-4-16 19:29:13

ercircle 发表于 2025-4-16 19:06
输入捕获流程里确实没提要用CC1NE,看输入捕获单独用例没配置这个。
你看的这个正交编码器用例没用过,应该 ...

这个PWMCCER1=0x55;在互补PWM里面也是这么写的 我感觉互补那个代码是对的,这个应该是有问题的

小垃圾 发表于 2025-4-16 21:17:25

<pre><code>void PWMA_init(void)
{
    P2M0 &amp;=~0X05;
    P2M1 &amp;=~0X05;
    PWMA_PS = 0X0a;//选择P20 P22输入捕获引脚

    PWMA_PSCRH = 0X00;
    PWMA_PSCRL = 0X00;
    PWMA_ARRH =0XFF;
    PWMA_ARRL = 0XFF;
    PWMA_CNTRH = 0;
    PWMA_CNTRL = 0;
    PWMA_SMCR = 0X02;
    PWMA_CCMR1 = 0x01+(10&lt;&lt;4);//0xa0
    PWMA_CCMR2 = 0x01+(10&lt;&lt;4);
    PWMA_SMCR = 0X03;
    PWMA_CCER1 = 0X33;//使能输入捕获
    PWMA_CCER2 = 0X33;
    //PWMA_IER = 0X06;
    PWMA_CR1 |=0X01;
}

void PWMB_init(void)
{
    P0M0 &amp;=~0X0a;
    P0M1 &amp;=~0X0a;//设置捕获输入为准双向口
    PWMB_PS=0X00;//P01 P03输入捕获引脚
    PWMB_PSCRH = 0X00;
    PWMB_PSCRL = 0X00;
    PWMB_ARRH = 0XFF;
    PWMB_ARRL = 0XFF;
    PWMB_CNTRH = 0X00;
    PWMB_CNTRL = 0X00;
    PWMB_SMCR = 0X03;//02是只捕获一路,03是捕获两路
    PWMB_CCMR1 = 0x01+(10&lt;&lt;4);
    PWMB_CCMR2 = 0x01+(10&lt;&lt;4);
    PWMB_SMCR = 0X03;
    PWMB_CCER1=0X33;
    PWMB_CCER2=0X33;

    PWMB_CR1 |= 0X01;
}
</code></pre>
<hr />
<ul>
<li>main.c</li>
</ul>
<pre><code>

uint16_t encoder_dataA,encoder_dataB;
SYS_Init();
PWMB_init();
PWMA_init();
printf(&quot;Hello World !\n&quot;);

while (1)
{
if(flag)
{
encoder_dataB=(PWMB_CNTRH&lt;&lt;8)+PWMB_CNTRL;
encoder_dataA=(PWMA_CNTRH&lt;&lt;8)+PWMA_CNTRL;
if(encoder_dataA)
printf(&quot;encoder_dataA = %d\n&quot;,encoder_dataA);
if(encoder_dataB)
printf(&quot;encoder_dataB = %d\n&quot;,encoder_dataB);
flag=0;
}
}

</code></pre>
<ul>
<li>使用的时候,使用一个定时器定时去读取寄存器的值即可。这个代码经过测试,可以同时捕获两路正交编码器的值。在AI8051U上.只需要修改PWMB_PS,PWMA_PS选择对应的管脚,即可实现对应IO输入捕获,只有PWMA_1P PWMA_2P 这两个可以捕获一路正交编码器信号。PWMB_5P,PWMB_6P这两个可以捕获一路正交编码器信号。</li>
<li>使用两路正交编码器以后,就不能再使用PWMA和PWMB做PWM输出了。</li>
</ul>
<pre><code>
</code></pre>
页: [1]
查看完整版本: PWM编码器模式范例程序