eiaydxyb 发表于 2026-4-16 10:28:12

用高级PWM捕获外部PWM高电平宽度

<p>我想捕获P1.0和P1.2两个引脚上的PWM高电平宽度,并打印出来。以下是我的部分代码。哪位大神帮忙看一下这样写行吗?看看有没有多余或缺少了哪些语句。因这我对高级PWM不熟悉。</p>
<p>//======================== 主函数 ========================<br />
void main(void)<br />
{<br />
P_SW2 |= 0x80;</p>
<pre><code>// P1.0 P1.2 高阻输入
P1M1 |= 0x05;
P1M0 &amp;= ~0x05;

PWMA_Capture_Init();
Uart1_Init();
EA = 1;

while (1)
{
    if (B_Capture1)
    {
      B_Capture1 = 0;
      g_high_p10 = CCAP1_Time;// 单位:us
    }
    if (B_Capture2)
    {
      B_Capture2 = 0;
      g_high_p12 = CCAP2_Time;
    }

    // 打印
    Uart1_SendString(&quot;P1.0=&quot;);
    u16_to_str(g_high_p10);
    Uart1_SendString(&quot;us&quot;);

    Uart1_SendString(&quot;P1.2=&quot;);
    u16_to_str(g_high_p12);
    Uart1_SendString(&quot;us\r\n&quot;);

    delay_ms(200);
}
</code></pre>
<p>}</p>
<p>//======================== PWMA 捕获初始化 ========================<br />
void PWMA_Capture_Init(void)<br />
{<br />
P_SW2 |= 0x80;</p>
<pre><code>PWMA_CCER1 = 0;
PWMA_SR1 = 0;
PWMA_IER = 0;
PWMA_ENO = 0;

// 11.0592MHz 12分频 = 1us 精度
PWMA_PSCR = 11;
PWMA_ARR = 0xFFFF;

// ========= 通道1:P1.0 上升/下降沿都捕获 =========
PWMA_CCMR1 = (3 &lt;&lt; 4) | 0x01;   // 输入模式 + 滤波
PWMA_CCER1 |= 0x01;             // 先上升沿
PWMA_CCER1 |= 0x03;             // 双边沿捕获

// ========= 通道2:P1.2 上升/下降沿都捕获 =========
PWMA_CCMR2 = (3 &lt;&lt; 4) | 0x01;
PWMA_CCER1 |= 0x10;
PWMA_CCER1 |= 0x30;

PWMA_PS = 0x00;   // 必须00:P1.0 P1.2
PWMA_IER = 0x06;    // 通道1 + 通道2 中断
PWMA_EGR = 0x01;
PWMA_CR1 |= 0x01;
</code></pre>
<p>}</p>
<p>//======================== PWMA 中断 ========================<br />
void PWMA_ISR(void) interrupt 26<br />
{<br />
u16 j;<br />
u8 sr;</p>
<pre><code>sr = PWMA_SR1;
PWMA_SR1 = 0;

// -------- P1.0 测高电平 --------
if (sr &amp; 0x02)
{
    j = PWMA_CCR1;
    CCAP1_Time = j - CCAP1_tmp;
    CCAP1_tmp = j;
    B_Capture1 = 1;
}

// -------- P1.2 测高电平 --------
if (sr &amp; 0x04)
{
    j = PWMA_CCR2;
    CCAP2_Time = j - CCAP2_tmp;
    CCAP2_tmp = j;
    B_Capture2 = 1;
}
</code></pre>
<p>}</p>
<p>打印出来的结果是这样的,感觉不对。</p>
<p><img src="data/attachment/forum/202604/16/093019jui3xvdnyiynzi9m.png" alt="image.png" title="image.png" /></p>
<p>实际波形是这个的。</p>
<p><img src="data/attachment/forum/202604/16/102806pbvcnjycpvnj80nc.jpg" alt="446d09173d0ddd8bded8d6cd503cdf45.jpg" title="446d09173d0ddd8bded8d6cd503cdf45.jpg" /></p>

乘风飞扬 发表于 2026-4-16 12:06:35

CC1与CC2组合捕获高电平宽度,可以选择捕获PWM1P或者PWM2P引脚信号。
如果你需要捕获两路高电平信号,另外一路可选择CC3与CC4组合,通过PWM3P或者PWM4P引脚捕获。
附件例子供参考。


eiaydxyb 发表于 2026-4-16 14:47:33

乘风飞扬 发表于 2026-4-16 12:06
CC1与CC2组合捕获高电平宽度,可以选择捕获PWM1P或者PWM2P引脚信号。
如果你需要捕获两路高电平信号,另外 ...

我刚学用高级PWM。你发来的例程我也看不懂呀,{:ganga:},我写的代码也是抄官方例程的。你帮我看看我的代码对不对?有哪里是错误的,谢谢!这个项目有点急{:baoquan:}

eiaydxyb 发表于 2026-4-16 15:17:55

乘风飞扬 发表于 2026-4-16 12:06
CC1与CC2组合捕获高电平宽度,可以选择捕获PWM1P或者PWM2P引脚信号。
如果你需要捕获两路高电平信号,另外 ...

您好,您给的资料太多了,有没有只是捕获P1.0引脚的?代码太多,看得太乱了。{:fadai:}

王昱顺 发表于 2026-4-16 15:18:52

eiaydxyb 发表于 2026-4-16 15:17
您好,您给的资料太多了,有没有只是捕获P1.0引脚的?代码太多,看得太乱了。 ...
可以用一下AiCube的自动生成程序来进行捕获,会简单很多
或者可以看一下技术手册里面的例程,里面的例程比较简短,只有是来行,比较好看懂的

eiaydxyb 发表于 2026-4-16 15:32:19

王昱顺 发表于 2026-4-16 15:18
可以用一下AiCube的自动生成程序来进行捕获,会简单很多
或者可以看一下技术手册里面的例程,里面的例程比 ...

AiCube在官网可以下载吗?

王昱顺 发表于 2026-4-16 15:48:46

eiaydxyb 发表于 2026-4-16 15:32
AiCube在官网可以下载吗?



ISP软件里就可以直接打开了

eiaydxyb 发表于 2026-4-16 15:58:02

王昱顺 发表于 2026-4-16 15:48
ISP软件里就可以直接打开了

好的,谢谢!
页: [1]
查看完整版本: 用高级PWM捕获外部PWM高电平宽度