关于输入捕获模式测量脉冲高电平宽度(捕获上升沿到下降沿)
各位大佬:关于输入捕获模式测量脉冲高电平宽度(捕获上升沿到下降沿)手册上的示例,我用8H4K32TL做了验证,
结果是测得的时间与信号波形的时间耦合很多,例如我输入的方波信号是1KHZ,那么捕获到的高电平宽度应该是0.5ms才对,
但是测得的时间确实0.5999ms,感觉误差好大,不知道哪里可以设置或修改参数;请大佬给予指导。
感谢大佬的关注和指导!
可以给出你的部分代码嘛?我之前试过20Khz的PWM输入捕获采样,分辨率从0~100%都很准,大概是你有什么地方处理时间过长或者你的方波不是50%占空比的 #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;
}
} PWM是一个纯数字外设,自身不会附加误差的,你可以同时检测到的周期是多少ms?我想知道你不做的设置是否正确。
如果周期是1ms,则你的信号高电平是0.6ms。
如果周期是1.2ms,则捕获到高低电平时间相等,请确认信号的周期(或频率)是否正确。
如果确认信号的周期(或频率)正确,则请检查你的时钟主频、PWM时钟分频系数是否正确。 梁工你好,我提供的信号是由标准信号源发出的1khz的方波信号没有问题,可能是PWM时钟分频系数的问题,我还没有找到怎么设置这个分频系数的地方,谢谢你 梁工 发表于 2025-2-21 10:30
PWM是一个纯数字外设,自身不会附加误差的,你可以同时检测到的周期是多少ms?我想知道你不做的设置是否正 ...
梁工我的单片机主频是12MHZ,这个分频系数怎么设定呢,能帮忙指导一下吗
金南京 发表于 2025-2-21 11:13
梁工我的单片机主频是12MHZ,这个分频系数怎么设定呢,能帮忙指导一下吗
你的程序没有初始化PWM时钟分频器,则默认为0,PWM时钟等于系统时钟12MHz,那么,你捕捉到的高电平计数值为5999或6000(时钟误差可忽略时),你不会是将5999当做0.5999ms吧? 梁工我是这么认为的 金南京 发表于 2025-2-21 13:40
梁工我是这么认为的
捕捉到高电平为6000个时钟,6000/12=500us,这是正确的。 谢谢梁工
页:
[1]