金南京 发表于 2025-2-20 22:35:48

关于输入捕获模式测量脉冲高电平宽度(捕获上升沿到下降沿)

各位大佬:

      关于输入捕获模式测量脉冲高电平宽度(捕获上升沿到下降沿)手册上的示例,我用8H4K32TL做了验证,
结果是测得的时间与信号波形的时间耦合很多,例如我输入的方波信号是1KHZ,那么捕获到的高电平宽度应该是0.5ms才对,
但是测得的时间确实0.5999ms,感觉误差好大,不知道哪里可以设置或修改参数;请大佬给予指导。
      感谢大佬的关注和指导!

王昱顺 发表于 2025-2-20 22:54:44

可以给出你的部分代码嘛?我之前试过20Khz的PWM输入捕获采样,分辨率从0~100%都很准,大概是你有什么地方处理时间过长或者你的方波不是50%占空比的

金南京 发表于 2025-2-21 10:21:48

#include "all.h"
unsigned int cnt;
void Display_Allot()
{
                SMG_Write_Buffer = SEG_DISPLAY;//赋值给每一位寄存器;
                SMG_Write_Buffer = SEG_DISPLAY;
                SMG_Write_Buffer = SEG_DISPLAY;
                SMG_Write_Buffer = SEG_DISPLAY;
                SMG_Write_Buffer = SEG_DISPLAY;
}
void main()
{
        P_SW2 |= 0x80;
        P0M0 |= 0x0f;
        P0M1 &= ~0x0f;
        P1M0 &= ~0x3b;
        P1M1 &= ~0x3b;
        P2M0 = 0x1f;
        P2M1 = 0x1f;
        P3M0 = 0xf0;
        P3M1 = 0x00;
        P3DR &= ~0xf0;
        P0DR &= ~0x0f;
        P2DR &= ~0x1f;
        XOSCCR = 0xc0; // 启动外部晶振
        while (!(XOSCCR & 1))
                ;                   // 等待时钟稳定
        CLKDIV = 0x00; // 时钟不分频
        CLKSEL = 0x01; // 选择外部晶振
        P_SW2 |= 0x80;
       
        PWMA_CCER1 = 0x00;        //(CC1捕获TI1上升沿,CC2捕获TI1下降沿)
        PWMA_CCMR1 = 0x01;        //CC1为输入模式,且映射到TI1FP1上
        PWMA_CCMR2 = 0x02;        //CC2为输入模式,且映射到TI1FP2上
        PWMA_CCER1 = 0x11;        //使能CC1/CC2上的捕获功能
        PWMA_CCER1 |= 0x00;        //设置捕获极性为CC1的上升沿
        PWMA_CCER1 |= 0x20;        //设置捕获极性为CC2的下降沿
        PWMA_CR1 = 0x01;
       
        PWMA_IER = 0x04;
        EA = 1;
        while(1)
        {
                Display_Allot();
                DISPLAY_SER();
        }
}
void PWMA_ISR() interrupt 26
{
        if(PWMA_SR1 & 0x04)
        {       
                PWMA_SR1 &= ~0x04;
                cnt = PWMA_CCR2 - PWMA_CCR1;
        }
}

梁工 发表于 2025-2-21 10:30:47

PWM是一个纯数字外设,自身不会附加误差的,你可以同时检测到的周期是多少ms?我想知道你不做的设置是否正确。
如果周期是1ms,则你的信号高电平是0.6ms。
如果周期是1.2ms,则捕获到高低电平时间相等,请确认信号的周期(或频率)是否正确。
如果确认信号的周期(或频率)正确,则请检查你的时钟主频、PWM时钟分频系数是否正确。

金南京 发表于 2025-2-21 10:51:36

梁工你好,我提供的信号是由标准信号源发出的1khz的方波信号没有问题,可能是PWM时钟分频系数的问题,我还没有找到怎么设置这个分频系数的地方,谢谢你

金南京 发表于 2025-2-21 11:13:06

梁工 发表于 2025-2-21 10:30
PWM是一个纯数字外设,自身不会附加误差的,你可以同时检测到的周期是多少ms?我想知道你不做的设置是否正 ...

梁工我的单片机主频是12MHZ,这个分频系数怎么设定呢,能帮忙指导一下吗

梁工 发表于 2025-2-21 11:46:36

金南京 发表于 2025-2-21 11:13
梁工我的单片机主频是12MHZ,这个分频系数怎么设定呢,能帮忙指导一下吗

你的程序没有初始化PWM时钟分频器,则默认为0,PWM时钟等于系统时钟12MHz,那么,你捕捉到的高电平计数值为5999或6000(时钟误差可忽略时),你不会是将5999当做0.5999ms吧?

金南京 发表于 2025-2-21 13:40:14

梁工我是这么认为的

梁工 发表于 2025-2-21 15:14:32

金南京 发表于 2025-2-21 13:40
梁工我是这么认为的

捕捉到高电平为6000个时钟,6000/12=500us,这是正确的。

金南京 发表于 2025-2-21 19:25:43

谢谢梁工
页: [1]
查看完整版本: 关于输入捕获模式测量脉冲高电平宽度(捕获上升沿到下降沿)