3 posts / 0 new
Last post
herrkaefer
Offline
Last seen: 1 year 4 months ago
Joined: 2017-12-16 15:38
如何精确测量 GPIO 波形时长?

我使用 ultrasonic sensor (HC-SR04), 需要测量某个 GPIO 上 echo 波形的时长, 误差要求是几十个微秒以下. 

尝试过的方法:

1) 检测到 GPIO 值发生变化时, 直接读 Timer1 的寄存器值. 结果误差很大.

2) 使用 Timer1 的 GPIO trigger 功能, 需要定义 dg_configUSER_CAN_USE_TIMER1 和 dg_configUSE_HW_TIMER0. 结果: 编译不过, sys_power_mgr似乎不允许 dg_configUSER_CAN_USE_TIMER1 定义为 1.

3) 使用 Timer0, 设置on_reload 为 1, t0_reload 为 (0,0), 同时设置中断函数. 这样中断被调用的频率应该是 32k/4 = 8kHz. 在中断处理中查询 GPIO 值, 并做计数. 结果测得的时长总是 1 或 2 个 count.

 

请问这些方法哪种是可行的, 问题是什么? 有没有别的合适的解决办法? 谢谢!

 

 

 

Device: 
CYibin
Offline
Last seen: 2 years 1 month ago
Staff
Joined: 2017-12-14 02:48
你好,

你好,

timer1 为 RTOS 所用。

可使用 timer0 或 timer2 作为脉冲计数。

因为从休眠中唤醒的时间比较长,无法满足你的精度要求,

所以,建议你在开始计数脉冲前,先有一个信号,把 DA1468X 系统唤醒,然后才使用 timer 计数判断脉冲时长。

herrkaefer
Offline
Last seen: 1 year 4 months ago
Joined: 2017-12-16 15:38
谢谢回复! 我们试了 Timer0, 使用下面的方法,

谢谢回复! 我们试了 Timer0, 使用下面的方法, 没有得到好的测量结果, 能否帮忙看一下哪里有问题?

 

1) Set Timer0 by

hw_timer0_init(NULL);
hw_timer0_set_clock_source(HW_TIMER0_CLK_SRC_SLOW); // 32kHz (slow) clock
hw_timer0_set_on_clock_div(false); // Don't divide by 10
hw_timer0_set_t0_reload(0, 0);
hw_timer0_set_on_reload(1);

hw_timer0_register_int(timer0_interrupt_cb);
hw_timer0_enable();

Hopefully with this setting, we can get 32k/4=8k Hz frequency of interrupt.

2) In the interrupt function, detect GPIO status and do the counting.

 

波形高电平的时长约为数个毫秒. 如果 Timer0 中断是 8k Hz (或者 125 微秒间隔) 被调用的话, 测得的结果总是一个或两个 125 微秒. 

请问这样的实现方法是不是不合适? 哪里有问题呢? 多谢!