图片
文本
测量原理,脉冲上升沿记一个此时的时间,下降沿再记一时间,这两时间差就是脉冲宽度。
此程序就是测量某脚的脉冲宽带,也可以推算出频率
利用了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);
}
}