找回密码
 立即注册
查看: 372|回复: 9

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

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:275
  • 最近打卡:2025-06-16 10:45:51
已绑定手机

19

主题

125

回帖

1289

积分

金牌会员

STC-镇江-老蔡

积分
1289
发表于 2025-2-20 22:35:48 | 显示全部楼层 |阅读模式
各位大佬:

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:499
  • 最近打卡:2025-06-16 10:06:31
已绑定手机
已实名认证

112

主题

2391

回帖

6018

积分

版主

积分
6018
发表于 2025-2-20 22:54:44 | 显示全部楼层
可以给出你的部分代码嘛?我之前试过20Khz的PWM输入捕获采样,分辨率从0~100%都很准,大概是你有什么地方处理时间过长或者你的方波不是50%占空比的
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:275
  • 最近打卡:2025-06-16 10:45:51
已绑定手机

19

主题

125

回帖

1289

积分

金牌会员

STC-镇江-老蔡

积分
1289
发表于 2025-2-21 10:21:48 | 显示全部楼层
[code]#include "all.h"
unsigned int cnt;
void Display_Allot()
{
                SMG_Write_Buffer[0] = SEG_DISPLAY[cnt/10000];//赋值给每一位寄存器;
                SMG_Write_Buffer[1] = SEG_DISPLAY[cnt%10000/1000];
                SMG_Write_Buffer[2] = SEG_DISPLAY[cnt%1000/100];
                SMG_Write_Buffer[3] = SEG_DISPLAY[cnt%100/10];
                SMG_Write_Buffer[4] = SEG_DISPLAY[cnt%10];
}
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;
        }
}
平安快乐
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:94
  • 最近打卡:2025-06-16 11:51:06

74

主题

6090

回帖

1万

积分

超级版主

积分
12723
发表于 2025-2-21 10:30:47 | 显示全部楼层
PWM是一个纯数字外设,自身不会附加误差的,你可以同时检测到的周期是多少ms?我想知道你不做的设置是否正确。
如果周期是1ms,则你的信号高电平是0.6ms。
如果周期是1.2ms,则捕获到高低电平时间相等,请确认信号的周期(或频率)是否正确。
如果确认信号的周期(或频率)正确,则请检查你的时钟主频、PWM时钟分频系数是否正确。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:275
  • 最近打卡:2025-06-16 10:45:51
已绑定手机

19

主题

125

回帖

1289

积分

金牌会员

STC-镇江-老蔡

积分
1289
发表于 2025-2-21 10:51:36 | 显示全部楼层
梁工你好,我提供的信号是由标准信号源发出的1khz的方波信号没有问题,可能是PWM时钟分频系数的问题,我还没有找到怎么设置这个分频系数的地方,谢谢你
平安快乐
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:275
  • 最近打卡:2025-06-16 10:45:51
已绑定手机

19

主题

125

回帖

1289

积分

金牌会员

STC-镇江-老蔡

积分
1289
发表于 2025-2-21 11:13:06 | 显示全部楼层
梁*** 发表于 2025-2-21 10:30
PWM是一个纯数字外设,自身不会附加误差的,你可以同时检测到的周期是多少ms?我想知道你不做的设置是否正 ...

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

点评

你的程序没有初始化PWM时钟分频器,则默认为0,PWM时钟等于系统时钟12MHz,那么,你捕捉到的高电平计数值为5999或6000(时钟误差可忽略时),你不会是将5999当做0.5999ms吧?  详情 回复 发表于 2025-2-21 11:46
平安快乐
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:94
  • 最近打卡:2025-06-16 11:51:06

74

主题

6090

回帖

1万

积分

超级版主

积分
12723
发表于 2025-2-21 11:46:36 | 显示全部楼层
金*** 发表于 2025-2-21 11:13
梁工我的单片机主频是12MHZ,这个分频系数怎么设定呢,能帮忙指导一下吗

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

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:275
  • 最近打卡:2025-06-16 10:45:51
已绑定手机

19

主题

125

回帖

1289

积分

金牌会员

STC-镇江-老蔡

积分
1289
发表于 2025-2-21 13:40:14 | 显示全部楼层
梁工我是这么认为的

点评

捕捉到高电平为6000个时钟,6000/12=500us,这是正确的。  详情 回复 发表于 2025-2-21 15:14
平安快乐
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:94
  • 最近打卡:2025-06-16 11:51:06

74

主题

6090

回帖

1万

积分

超级版主

积分
12723
发表于 2025-2-21 15:14:32 | 显示全部楼层
金*** 发表于 2025-2-21 13:40
梁工我是这么认为的

捕捉到高电平为6000个时钟,6000/12=500us,这是正确的。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:275
  • 最近打卡:2025-06-16 10:45:51
已绑定手机

19

主题

125

回帖

1289

积分

金牌会员

STC-镇江-老蔡

积分
1289
发表于 2025-2-21 19:25:43 | 显示全部楼层
谢谢梁工
平安快乐
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-6-17 05:35 , Processed in 0.218329 second(s), 106 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表