esp32 驱动超声波模块(测量脉冲宽度)

图片

723401000c6d4cdfb900aff4a9a5304a.jpg

 

文本

测量原理,脉冲上升沿记一个此时的时间,下降沿再记一时间,这两时间差就是脉冲宽度。

此程序就是测量某脚的脉冲宽带,也可以推算出频率

利用了esp32 自带的函数 esp_timer_get_time()

编程中发现,模块的时序为,TX发送一脉冲后,测量一次距离。再要测距,必须再发送一脉冲。如再不发送脉冲,永远不会再测量。网上的资料没有说清楚这一点。

这里利用了上升和下降沿中断

如果是对连续脉冲测量,只需对一个脉冲测量后关闭中断就行了。

#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "esp_log.h"
#include "esp_task_wdt.h"
#include "esp_timer.h"
#include "esp_rom_sys.h"

#define TX  2
#define RX  4
 static  uint64_t n1;
 static  uint64_t n2;
 
void IRAM_ATTR handler(void* arg) {
	if(gpio_get_level(RX)){
	   n1=esp_timer_get_time();    //esp32 开机到此时经过的时间 us
    }else{
		n2=esp_timer_get_time();
	}
}

void app_main() {
	
    gpio_config_t io_conf;
	io_conf.pin_bit_mask = (1ULL << TX); 
	io_conf.intr_type = GPIO_INTR_DISABLE; 
    io_conf.mode = GPIO_MODE_OUTPUT;       
    io_conf.pull_down_en = 1;
    io_conf.pull_up_en = 1;
    gpio_config(&io_conf);
	
    io_conf.pin_bit_mask = (1ULL << RX);
	io_conf.intr_type = GPIO_INTR_ANYEDGE; 
    io_conf.mode = GPIO_MODE_INPUT;        
    io_conf.pull_down_en = 1;
    io_conf.pull_up_en = 0; 
    gpio_config(&io_conf);
	
    gpio_install_isr_service(0);
    gpio_isr_handler_add(RX, handler, NULL);
	
	gpio_set_level(TX,0);
	gpio_set_level(TX,1);
	esp_rom_delay_us(20);
	gpio_set_level(TX,0);

    for(;;) {  
	
         printf("%f\n",(n2-n1)*340*100/2000000.0);  //cm
		 vTaskDelay(1000 / portTICK_PERIOD_MS);
		 gpio_set_level(TX,0);
		 
		 gpio_set_level(TX,0);
	     gpio_set_level(TX,1);
	     esp_rom_delay_us(20);
	     gpio_set_level(TX,0);

    } 
}

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值