ESP32C3驱动HC-SR04超声测距模块

打样板子购买物料时看到有HC-SR04模块,购入。模块工作电压3v-5.5v,直接用3.3v供电。

测距原理

声波在空气中的传播速度是固定的,发射的超声波遇到障碍物会反射回来,我们记录下发射波到接受反射波之间的时间差,就可以计算出模块距离障碍物的距离。我们可以把这个用于测距、避障等领域。

编程思路

启用定时器组0的定时器0,实现微秒延时和时间测量。定时器频率为4MHz,每个us计数4个。按模块使用方法,给Trig脚一个10us的高电平,测量echo脚高电平的时间,此时间即为声波信号发送到接收之间的时间。

程序写入到头文件中,在app_main函数中直接调用hcsr04_task()即可

#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "sdkconfig.h"
#include "esp32/rom/ets_sys.h"
#include "driver/timer.h"
#include "driver/gpio.h"

//定义引脚,测距时小于35mm的距离,干扰,不准确
#define Trig 0
#define Echo 1
 
static const char *HCSR04TAG = "HCSR04";

//set 80m hz /20 ,4m hz tick 
void hcsr04_timer_init(void)
{
#define TIMER_DIVIDER         (20)  //  Hardware timer clock divider
#define TIMER_SCALE           (TIMER_BASE_CLK / TIMER_DIVIDER)  // convert counter value to seconds, 80M hz
    int group = 0;
    int timer = 0;
    /* Select and initialize basic parameters of the timer */
    timer_config_t config = {
        .divider = TIMER_DIVIDER,
        .counter_dir = TIMER_COUNT_UP,
        .counter_en = TIMER_PAUSE,
        .alarm_en = TIMER_ALARM_DIS,
        .auto_reload = TIMER_AUTORELOAD_DIS,
    }; // default clock source is APB
    timer_init(group, timer, &config);
    /* Timer's counter will initially start from value below.
       Also, if auto_reload is set, this value will be automatically reload on alarm */
    timer_set_counter_value(group, timer, 0);
    timer_start(group, timer);
}

void hcsr04_delay_us(uint16_t us) {
    uint64_t timer_counter_value = 0;
    uint64_t timer_counter_update = 0;
    //uint32_t delay_ccount = 200 * us;
    
    timer_get_counter_value(0,0,&timer_counter_value);
    timer_counter_update = timer_counter_value + (us << 2);
    do {
        timer_get_counter_value(0,0,&timer_counter_value);
    } while (timer_counter_value < timer_counter_update);
}

void hcsr04_task(void)
{
    uint64_t timer_counter_value = 0;
    uint64_t timer_counter_update = 0;
    float length_mm=0;
    //设置Trig引脚为输出模式 Echo引脚为输入模式//
    gpio_pad_select_gpio(Trig); 
    gpio_pad_select_gpio(Echo);
    gpio_set_direction(Trig,GPIO_MODE_OUTPUT);
    gpio_set_direction(Echo,GPIO_MODE_INPUT);
    
    while(1){
        hcsr04_timer_init(); //初始化
 
        gpio_set_level(Trig,0);
        hcsr04_delay_us(20);
        gpio_set_level(Trig,1);//然后拉高Trig至少10us以上
        ets_delay_us(10);
        gpio_set_level(Trig,0);//再拉低Trig,完成一次声波发出信号
  
        //检测Echo引脚,一直为低电平就一直在等待
        while(gpio_get_level(Echo)==0){
        }
        timer_get_counter_value(0,0,&timer_counter_value);
        while(gpio_get_level(Echo)==1){
        }
        timer_get_counter_value(0,0,&timer_counter_update);
        //计算Echo引脚高电平持续的时间
        if(timer_counter_update-timer_counter_value < 130000){//131989 value for error
            length_mm = 0.0425*(timer_counter_update-timer_counter_value);//counter * 340000 / 4000000 / 2
            ESP_LOGE(HCSR04TAG,"length: %.2f mm", length_mm);
        }else{
            //ESP_LOGE(HCSR04TAG,"length: error");
        }
        vTaskDelay(200 / portTICK_PERIOD_MS);
    }
}

实验效果

达成目标。观测模块在小于35mm时数据不准;测量失败时定时器计数131989。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
2022 / 01/ 30: 新版esptool 刷micropython固件指令不是 esptool.py cmd... 而是 esptool cmd... 即可;另外rshell 在 >= python 3.10 的时候出错解决方法可以查看:  已于2022年发布的: 第二章:修复rshell在python3.10出错 免费内容: https://edu.csdn.net/course/detail/29666 micropython语法和python3一样,编写起来非常方便。如果你快速入门单片机物联网而且像轻松实现各种功能,那绝力推荐使用micropython。方便易懂易学。 同时如果你懂C语音,也可以用C写好函数并编译进micropython固件里然后进入micropython调用(非必须)。 能通过WIFI联网(2.1章),也能通过sim卡使用2G/3G/4G/5G联网(4.5章)。 为实现语音控制,本教程会教大家使用tensorflow利用神经网络训练自己的语音模型并应用。为实现通过网页控制,本教程会教大家linux(debian10 nginx->uwsgi->python3->postgresql)网站前后台入门。为记录单片机传输过来的数据, 本教程会教大家入门数据库。  本教程会通过通俗易懂的比喻来讲解各种原理与思路,并手把手编写程序来实现各项功能。 本教程micropython版本是 2019年6月发布的1.11; 更多内容请看视频列表。  学习这门课程之前你需要至少掌握: 1: python3基础(变量, 循环, 函数, 常用库, 常用方法)。 本视频使用到的零件与淘宝上大致价格:     1: 超声波传感器(3)     2: MAX9814麦克风放大模块(8)     3: DHT22(15)     4: LED(0.1)     5: 8路5V低电平触发继电器(12)     6: HX1838红外接收模块(2)     7:红外发射管(0.1),HX1838红外接收板(1)     other: 电表, 排线, 面包板(2)*2,ESP32(28)  

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值