[PIC®/AVR®/dsPIC®产品] 【CuriosityNano测评报告】基于AC0 + TCB的超声波测距仪设计

[复制链接]
6955|19
 楼主| 南来之风 发表于 2022-11-7 20:31 | 显示全部楼层 |阅读模式
本帖最后由 南来之风 于 2022-11-8 09:38 编辑

笔者之前在测评PIC18F单片机的时候,首次尝试用定时器来测量超声波的传播时间,参考:【CuriosityNano测评报告】定时器用于超声波传感器 https://bbs.21ic.com/icview-3244674-1-1.html。之前的测距结果感觉不是特别准确,有可能是定时器用法不正确。
此次有幸能够测评AVR64DD32单片机,这款好奇开发板功能丰富,尤其是模拟功能强大,易用。特别留意到这个片子带了Analog Comparator以及TCB ( 16-bit Timer/Counter Type B),我后面会利用这两个特性来设计超声波测距仪。
  • AVR64DD32微控制器
  • 一个黄色用户LED
  • 一个机械式用户开关
  • 一个32.768kHz晶体
  • 一个24MHz晶体
  • 板载调试器:
    • Microchip MPLAB® X IDE和Microchip Studio中板标识
    • 一个绿色电源及状态指示LED
    • 编程和调试
    • 虚拟串行端口 (CDC)
    • 两个调试GPIO通道 (DGI GPIO)
  • USB供电
  • 可调目标电压:
    • MIC5353 LDO稳压器,由板载调试器控制
    • 输出电压范围:1.8V至5.1V(受USB输入电压限制)
    • 最大输出电流:500mA(受环境温度和输出电压限制)



此次使用的超声波传感器型号是:HC-SR04,其内部模块原理图如下:


VTG -- 传感器VCC
GND -- 传感器GND
PORTD1 -- 传感器Trigger引脚
PORTD2 -- 传感器Echo模拟输入引脚



主程序代码:
  1. #include "mcc_generated_files/system/system.h"
  2. #include <util/delay.h>

  3. /*
  4.     Main application
  5. */

  6. volatile uint16_t signal_pulse = 0, signal_period = 0;

  7. int main(void)
  8. {
  9.    SYSTEM_Initialize();   
  10.    

  11.     PORTD.DIRSET = PIN4_bm;
  12.     PORTMUX.USARTROUTEA = PORTMUX_USART0_ALT3_gc;

  13.    
  14.    printf("Hello Microchip\r\n");
  15.    while(1)
  16.     {
  17.        IO_PD1_TriggerSig_SetLow();
  18.        _delay_ms(2);
  19.        IO_PD1_TriggerSig_SetHigh();
  20.        _delay_ms(10);
  21.        IO_PD1_TriggerSig_SetLow();
  22.       
  23.         if (TCB0.INTFLAGS & TCB_CAPT_bm)
  24.         {
  25.             /**
  26.             * First read the CNT register
  27.             * The interrupt flag is cleared by writing 1 to it, or when the Capture register
  28.             * is read in Capture mode
  29.             */
  30.             //signal_period = TCB0.CNT;
  31.             signal_pulse  = TCB0.CCMP;
  32.             asm("NOP");
  33.             printf("Calculate Dist...");
  34.             printf("  %f cm\r\n", signal_pulse/2.0/2*34300.0/1000000);
  35.         }
  36.      }   
  37. }

模拟比较器AC0的MCC配置:

TCB的模式配置,要注意设置未pulse width模式:

UART这里要使能 Redirct Printf to UART:

效果展示:



总结:本次基于AVR单片机的AC0和tcb硬件模块实现的超声波测距仪,极少的需要单片机运算,计算结果非常精确可靠,硬件设计非常简单。



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
tpgf 发表于 2022-12-7 10:04 | 显示全部楼层
超声波测距模块是通过串口和单片机进行通讯的吗
drer 发表于 2022-12-7 10:24 | 显示全部楼层
请问机械式用户开关在这里的用途是什么呢
 楼主| 南来之风 发表于 2022-12-7 10:46 | 显示全部楼层
tpgf 发表于 2022-12-7 10:04
超声波测距模块是通过串口和单片机进行通讯的吗

你好朋友,

根据我的理解,其实超声波测距模块在开始工作后(单片机给Trigger引脚一定时间的高电平),单片机会通过测量Echo引脚的高电平的持续时间(声波发射,然后返回的总时间)来获得声音传播的距离。

通过声速*传播时间,就可以测得距离了。其实并没有涉及到串口通信。
 楼主| 南来之风 发表于 2022-12-7 10:53 | 显示全部楼层
drer 发表于 2022-12-7 10:24
请问机械式用户开关在这里的用途是什么呢

你好朋友,

机械按键是开发板自带的,在本文提及的超声波测距模块中并没有使用到。

不过,可以根据自己的需要,在程序中读取Button的状态,然后做一些有意思的设计。
tfqi 发表于 2022-12-7 11:20 | 显示全部楼层
目前来看 超声波测距仪的精度能达到多少呢 可以测量多远的距离呀
coshi 发表于 2022-12-7 11:27 | 显示全部楼层
请问TCB的配置软件是使用的什么软件啊 可以免费下载到吗
kxsi 发表于 2022-12-7 11:42 | 显示全部楼层
测距仪发送给单片机的是模拟量的数据  还是数字量数据呀
 楼主| 南来之风 发表于 2022-12-7 11:44 | 显示全部楼层
kxsi 发表于 2022-12-7 11:42
测距仪发送给单片机的是模拟量的数据  还是数字量数据呀

是一个持续时间为声波传播距离两倍的高电平脉冲。是数字量。
 楼主| 南来之风 发表于 2022-12-7 11:46 | 显示全部楼层
coshi 发表于 2022-12-7 11:27
请问TCB的配置软件是使用的什么软件啊 可以免费下载到吗

是MPLAB X ide内置的一个MCC插件,用于配置各种外设,自动生成代码的插件。目前我是个人使用,完全免费的
wiba 发表于 2022-12-7 12:08 | 显示全部楼层
南来之风 发表于 2022-12-7 11:44
是一个持续时间为声波传播距离两倍的高电平脉冲。是数字量。

那是不是需要用定时器测量一下时长呢
tifmill 发表于 2023-1-5 14:15 | 显示全部楼层
感觉不如激光测距模块好用一些呢。
mickit 发表于 2023-1-6 15:55 | 显示全部楼层
怎么判断超声波超时呢?              
cashrwood 发表于 2023-1-6 21:23 | 显示全部楼层
这个超声波有串口形式的。              
lihuami 发表于 2023-1-6 22:54 | 显示全部楼层
MCC开发简单这么多了。              
plsbackup 发表于 2023-1-9 13:40 | 显示全部楼层
测量的最大范围是多少呢?              
burgessmaggie 发表于 2023-1-12 13:55 | 显示全部楼层
超声波模块的测量精度是多少?              
hilahope 发表于 2023-1-12 17:14 | 显示全部楼层
怎么驱动这个超声波产生信号 ?              
jimmhu 发表于 2023-1-12 18:35 | 显示全部楼层
反射的信号怎么测量?引脚是怎么变换?
hearstnorman323 发表于 2023-1-12 19:55 | 显示全部楼层
这个可以通过定时器捕获数据吗?              
您需要登录后才可以回帖 登录 | 注册

本版积分规则

69

主题

293

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部