使用定时器的超声波接口

了解更多常见问题教程

5个职位/ 0个新职位
最后发表
巴拉吉
离线
最后看到:1个月3天前
加入:2019-12-06 06:48
使用定时器的超声波接口

嗨,对话框中,

我们的产品是盲人障碍检测。为了升级到基于BLE的设备,我们选择DA14531模块。

组件是超声波传感器,蜂鸣器,触觉振动器,电池。

我正在尝试接口以下超声波传感器400 S/T R 100。为了产生40 KHz脉冲突发,我配置定时器0没有PWM。我在定时器ISR内部创建了一个计数器来产生传输脉冲。我成功地做到了(参考附件)。现在在ISR内部经过1ms的延迟后,我调用adc_get_sample()函数。然后根据超声波传感器原理确定距离。在keil调试模式下运行了几次后,它卡住了

静态内联void dlg_error_isr(void)

ASSERT_WARNING (0);

在rwble.c所选择的项目是BLE Barbone项目。我已经附加了触发脉冲,当障碍物放置在50厘米处时产生回声。正如你所看到的,当转换到51厘米左右的距离时,时间间隔是3毫秒。我有一系列的查询来在代码中实现这个,

1.我无法在ISR内读取ADC样本。

2.你的ADC的准确度是多少?w。r。to precision in毫微米电压。

3.即使当我运行一个没有任何上述功能的ISR,我不能连接BLE扫描仪应用程序。

定时器的配置

//启用Timer0/Timer2输入时钟
timer0_2_clk_enable ();

timer0_init (TIM0_CLK_FAST PWM_MODE_ONE TIM0_CLK_NO_DIV);

//设置Timer0/Timer2输入时钟划分因子为28 MHz输入时钟
timer0_2_clk_div_set(&clk_div_config);

//重新加载值12.5微秒(T = 1/8 MHz * RELOAD_12.5_US = 0.125 * 100 = 12.5微秒)
timer0_set_pwm_on_counter (TIMER_ON);
timer0_set_pwm_high_counter (NO_PWM);
timer0_set_pwm_low_counter(no_pwm);
//注册SWTIM_IRQn的irq回调函数
timer0_register_callback (burst_user_callback_function);

//开启SWTIM_IRQn的irq
timer0_enable_irq ();

ADC配置

/ / adc配置
adc_offset_calibrate (ADC_INPUT_MODE_SINGLE_ENDED);

adc_config_t echo_pin_cfg =

.input_mode = ADC_INPUT_MODE_SINGLE_ENDED,
.input = ADC_INPUT_SE_P0_6,
.smpl_time_mult = 2,
.continuous = false,
.interval_mult = 0,
.Input_attenuator = ADC_INPUT_ATTN_4X,
.chopping = false,
.oversampling = 0
};

adc_init (&echo_pin_cfg);

你能帮我集成这个传感器吗?我需要知道如何运行定时器ISR和BLE服务在同一时间?

问候,

巴拉吉

PM_Dialog
离线
最后看到:13小时18分钟前
工作人员
加入:2018-02-08 11:03
嗨巴拉吉,

嗨巴拉吉,

谢谢你的在线问题。让我检查一下,我会给你反馈我的意见。

谢谢,PM_Dialog

PM_Dialog
离线
最后看到:13小时18分钟前
工作人员
加入:2018-02-08 11:03
我,巴拉

嗨巴拉吉,

我尝试在SDK的ble-app_barebone示例中复制这种行为。到目前为止,我使用的是在回调函数中切换gpio:

// Timer0设置#define NO_PWM 0x0 #define TIMER_ON 100 static tim02_clk_div_config_t clk_div_config = {.clk_div = tim02_clk_div_2};Static uint8_t counter = 0;Static void burst_user_callback_function(void) {counter++;if (2 == counter) {if (GPIO_GetPinStatus(LED_PORT, LED_PIN)) {GPIO_SetInactive(LED_PORT, LED_PIN);} else {GPIO_SetActive(LED_PORT, LED_PIN);}} void timer_0(void){//启用Timer0/Timer2输入时钟timer0_2_clk_enable();timer0_init (TIM0_CLK_FAST PWM_MODE_ONE TIM0_CLK_NO_DIV);//设置Timer0/Timer2输入时钟划分因子为2,因此8 MHz输入时钟timer0_2_clk_div_set(&clk_div_config);//重新加载12.5微秒的值(T = 1/8 MHz * RELOAD_12.5_US = 0.125 * 100 = 12.5微秒)timer0_set_pwm_high_counter (NO_PWM); timer0_set_pwm_low_counter(NO_PWM); // register callback function for SWTIM_IRQn irq timer0_register_callback(burst_user_callback_function); // enable SWTIM_IRQn irq timer0_enable_irq(); }

如果我有任何配置错误,请让我知道。您能分享您在应用程序代码中使用的burst_user_callback_function()函数吗?

您应该能够在ISR内读取。请分享应在BLE_APP_BAREBONE示例中复制此操作以进行操作。您是否使用了任何可用的睡眠模式?

ADC的准确性给出了数据表-请检查表23。

谢谢,PM_Dialog

巴拉吉
离线
最后看到:1个月3天前
加入:2019-12-06 06:48
嗨,对话框中,

嗨,对话框中,

这实际上是一个定时器延迟问题。我在里面读了Adc_smple12.5微秒ISR计时器,但是,当我检查MDO时adc_get_sample() API的修正60微秒。目前还没有问题。谢谢你的建议。如果有任何问题出现,我将在这个相同的线程在未来。

由于这个定时器问题,BLE连接被阻塞。现在解决了。

PM_Dialog
离线
最后看到:13小时18分钟前
工作人员
加入:2018-02-08 11:03
嗨巴拉吉,

嗨巴拉吉,

谢谢你的迹象,很高兴你有工作。如果您有任何后续问题,请提出一个新的论坛线程。

谢谢,PM_Dialog