当前位置: 首页 > article >正文

基于GD32E230的US-016模拟电压式超声波测距模块驱动移植与实战

基于GD32E230的US-016模拟电压式超声波测距模块驱动移植与实战最近在做一个智能小车的项目需要用到超声波测距来避障。市面上常见的超声波模块大多是像HC-SR04那样通过发送和接收回波的时间差来计算距离需要单片机提供触发信号并测量高电平时间。但这次我找到了一款挺特别的模块——US-016它直接把测得的距离转换成一个模拟电压输出用起来就像读一个电位器一样简单。正好手头有块立创的GD32E230C8T6开发板我就琢磨着把这两个东西搭起来用用。这篇文章我就来手把手带你走一遍完整的流程从了解US-016这个模块的特性到在GD32E230上配置ADC读取它的电压最后把电压值换算成实际的距离。整个过程我会尽量讲得细一些特别是电压和距离的换算关系以及ADC配置里容易踩的坑希望能帮到正在用GD32系列做项目或者学习传感器应用的朋友们。1. 认识US-016一款“另类”的超声波模块咱们先来看看US-016到底是个啥。它和HC-SR04最大的不同就是输出方式。HC-SR04输出的是数字脉冲信号而US-016输出的是一个模拟电压。这个电压值和你测量的距离是成正比的距离越远电压越高。模块核心特性工作电压3.3V - 5V。这意味着它可以直接用我们开发板的3.3V供电非常方便。工作电流大约3.8mA功耗很低。测量范围2厘米到3米。这个范围对于大部分室内避障、测距应用足够了。输出方式模拟电压输出。这是它的核心卖点。接口一共4个引脚分别是VCC电源、GND地、OUT模拟电压输出、RANGE量程选择。量程选择是关键US-016有一个很实用的功能可以通过RANGE引脚选择不同的量程就像相机的变焦一样让你在精度和范围之间做取舍。RANGE引脚悬空或接高电平量程为3米。这是默认状态适合测量较远的距离。RANGE引脚接低电平GND量程切换为1米。在这个量程下测量精度会更高因为满量程电压对应1.024米电压变化对距离更敏感。电压与距离的换算公式这是驱动US-016最核心的知识点一定要理解。模块输出的电压Vout范围是0V到供电电压Vcc。距离L单位毫米的计算公式如下量程为1米时L 1024 * (Vout / Vcc)当Vout 0V对应距离L 0mm。当Vout Vcc对应距离L 1024mm即1.024米。量程为3米时L 3096 * (Vout / Vcc)当Vout 0V对应距离L 0mm。当Vout Vcc对应距离L 3096mm即3.096米。注意公式里的Vcc指的是给US-016模块供电的电压比如5V或3.3V而Vout是我们用单片机ADC测量到的模块输出电压。如果单片机的ADC参考电压Vref和模块的Vcc不一样公式还需要乘以一个系数Vref/Vcc。在我们的例子里开发板和模块都用3.3V供电所以Vref Vcc这个系数就是1公式可以简化。2. 硬件连接与引脚规划接下来我们把模块和开发板连起来。连接非常简单VCC- 开发板的3.3V引脚。GND- 开发板的GND引脚。OUT- 开发板的PA1引脚这是我们选定的ADC输入引脚。RANGE- 我们暂时让它悬空使用默认的3米量程。为什么选PA1因为我们需要一个带ADC模数转换器功能的引脚来读取模拟电压。查一下GD32E230C8T6的数据手册第19页左右的引脚定义图可以看到PA1引脚复用了ADC的通道1ADC_CHANNEL_1功能正好符合我们的需求。3. 工程搭建与代码移植硬件连好了现在来搞软件。我们需要在GD32的工程里编写驱动代码来初始化ADC并读取电压值。3.1 创建驱动文件首先在你的工程里新建两个文件bsp_us016.c和bsp_us016.h“bsp”是板级支持包的意思用来放外设驱动。把下面的代码分别复制进去。头文件bsp_us016.h这个文件主要进行宏定义和函数声明让代码更清晰修改配置也方便。#ifndef _BSP_US016_H_ #define _BSP_US016_H_ #include gd32e23x.h // 超声波OUT引脚连接定义 #define RCU_OUT RCU_GPIOA // 引脚所在GPIO端口的时钟 #define PORT_OUT GPIOA // 引脚所在GPIO端口 #define GPIO_OUT GPIO_PIN_1 // 具体的引脚号PA1 // ADC相关定义 #define RCU_OUT_ADC RCU_ADC // ADC外设时钟 #define PORT_OUT_ADC ADC // ADC外设 #define CHANNEL_OUT_ADC ADC_CHANNEL_1 // ADC通道号对应PA1 #define CHANNEL_NUM 1 // 我们只使用1个ADC通道进行采样 // 量程选择宏。0代表3米量程1代表1米量程。这里我们选择悬空3米量程 #define RANGE 0 // 函数声明 void US016_GPIO_Init(void); // 初始化函数 float Get_distance(void); // 获取距离函数 #endif源文件bsp_us016.c这里是具体的实现包含了ADC初始化和距离计算。#include bsp_us016.h #include systick.h // 用于延时函数 #include bsp_usart.h // 用于printf调试可选 #include stdio.h /****************************************************************** * 函数名称US016_GPIO_Init * 函数说明初始化US-016模块所需的GPIO和ADC * 函数形参无 * 函数返回无 * 注 意这里配置ADC为单通道、连续转换模式方便持续读取 ******************************************************************/ void US016_GPIO_Init(void) { /* 第1步打开相关时钟 */ rcu_periph_clock_enable(RCU_OUT); // 使能GPIOA时钟 rcu_periph_clock_enable(RCU_OUT_ADC); // 使能ADC时钟 rcu_adc_clock_config(RCU_ADCCK_APB2_DIV4); // 配置ADC时钟为APB2的4分频 /* 第2步配置PA1引脚为模拟输入模式 */ // 读取模拟电压必须配置为模拟模式上下拉电阻无效 gpio_mode_set(PORT_OUT, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_OUT); /* 第3步配置ADC工作模式 */ adc_special_function_config(ADC_CONTINUOUS_MODE, ENABLE); // 使能连续转换模式 adc_special_function_config(ADC_SCAN_MODE, DISABLE); // 我们只有一个通道禁用扫描模式 adc_resolution_config(ADC_RESOLUTION_12B); // 设置ADC分辨率为12位0-4095 /* 第4步配置ADC触发源与数据对齐 */ adc_external_trigger_source_config(ADC_REGULAR_CHANNEL, ADC_EXTTRIG_REGULAR_NONE); // 不使用外部触发 adc_data_alignment_config(ADC_DATAALIGN_RIGHT); // 数据右对齐方便读取 /* 第5步配置ADC规则组通道 */ adc_channel_length_config(ADC_REGULAR_CHANNEL, CHANNEL_NUM); // 规则组通道数为1 // 配置规则组第0个转换序列为ADC通道1采样时间13.5个周期 adc_regular_channel_config(0, CHANNEL_OUT_ADC, ADC_SAMPLETIME_13POINT5); /* 第6步使能ADC并校准 */ adc_enable(); // 使能ADC delay_1ms(1); // 短暂延时等待ADC稳定 adc_calibration_enable(); // 开启ADC自校准这个很重要能减少误差 /* 第7步启动转换 */ adc_software_trigger_enable(ADC_REGULAR_CHANNEL); // 软件触发开始转换 } /****************************************************************** * 函数名称Get_ADC_Value * 函数说明获取指定次数的ADC采样平均值用于滤波 * 函数形参num - 平均次数 * 函数返回平均后的ADC原始值0-4095 ******************************************************************/ unsigned int Get_ADC_Value(unsigned int num) { unsigned int sum 0; for(int i 0; i num; i) { sum adc_regular_data_read(); // 读取ADC数据寄存器 delay_1ms(1); // 每次读取间隔1ms避免采样过快 } return (sum / num); // 返回平均值 } /****************************************************************** * 函数名称Get_distance * 函数说明核心函数读取ADC值并换算为距离单位毫米 * 函数形参无 * 函数返回浮点型距离值 * 注 意公式推导是关键 * 12位ADC最大值是4095对应电压Vref3.3V。 * 量程3米时ADC值d对应的电压 Vout d * (Vref / 4096)。 * 代入距离公式 L 3096 * (Vout / Vcc)。 * 因为Vref Vcc 3.3V公式简化为 L 3096 * (d / 4096) d * 0.7559。 * 同理1米量程时 L 1024 * (d / 4096) d * 0.25。 * 代码中为了计算快直接用乘法。 ******************************************************************/ float Get_distance(void) { float distance 0; unsigned int adc_val Get_ADC_Value(30); // 采样30次取平均 #if (RANGE 0) // 3米量程 distance adc_val * 0.75f; // 近似于 adc_val * 3096 / 4096 #else // 1米量程 distance adc_val * 0.25f; // 近似于 adc_val * 1024 / 4096 #endif return distance; // 返回的单位是毫米(mm) }3.2 代码要点解析ADC配置流程使能时钟 - 配置GPIO为模拟输入 - 设置ADC模式连续转换、分辨率 - 配置通道 - 使能并校准ADC - 软件触发开始转换。这是一套标准的ADC初始化流程。采样平均滤波Get_ADC_Value函数里对ADC采样了30次然后取平均。这是因为模拟信号容易受到干扰多次平均可以有效地让读数更稳定减少跳动。距离换算公式这是最核心的部分。在Get_distance函数里我们根据RANGE宏的定义选择不同的系数。这个系数是怎么来的就是前面讲的公式L 系数 * (Vout/Vcc)结合ADC值d与电压Vout的关系Vout d * (Vref/4096)以及Vref Vcc的假设推导出来的简化计算。直接相乘比做浮点除法快得多。4. 主函数调用与实验验证驱动写好了最后就是在主函数里调用它了。我们每隔500毫秒读取一次距离并通过串口打印出来方便在电脑上查看。#include gd32e23x.h #include systick.h #include bsp_usart.h // 串口初始化用于printf #include stdio.h #include bsp_us016.h // 包含我们刚写的驱动头文件 int main(void) { /* 系统初始化 */ systick_config(); // 初始化系统滴答定时器提供delay函数 usart_gpio_config(115200U); // 初始化串口波特率115200用于打印数据 /* US-016模块初始化 */ US016_GPIO_Init(); printf(US-016 Distance Measurement Demo Start!\r\n); while(1) { // 读取距离并打印 float dist Get_distance(); printf(Distance: %.1f mm\r\n, dist); // 打印距离保留一位小数 delay_1ms(500); // 延时500ms } }实验现象将代码编译下载到GD32E230开发板连接好US-016模块和串口线。打开电脑上的串口助手如XCOM、Putty等设置好波特率115200。在模块前方大约20厘米的地方放一个障碍物比如一本书你会在串口助手上看到类似Distance: 203.5 mm的输出。移动障碍物输出的距离值也会相应变化。提示如果发现测量值跳动比较大可以尝试增加Get_ADC_Value函数中的平均次数比如从30次增加到50次。检查电源是否稳定可以用万用表量一下给US-016供电的电压是否准确。确保测量前方物体表面平整超声波对光滑表面的反射效果最好。好了整个从硬件连接到软件驱动、从原理到实战的过程就是这样。用GD32E230驱动US-016这个模拟输出的超声波模块其实核心就是ADC的配置和那个距离换算公式。掌握了这个方法你就能轻松地把这个模块应用到你的测距、避障项目里去了。实际项目中你可能还需要根据环境对数据进行更复杂的滤波处理但基本的驱动框架就是这些。

相关文章:

基于GD32E230的US-016模拟电压式超声波测距模块驱动移植与实战

基于GD32E230的US-016模拟电压式超声波测距模块驱动移植与实战 最近在做一个智能小车的项目,需要用到超声波测距来避障。市面上常见的超声波模块大多是像HC-SR04那样,通过发送和接收回波的时间差来计算距离,需要单片机提供触发信号并测量高电…...

MuJoCo仿真中关节抽搐问题全解析:从碰撞检测到参数调优

MuJoCo仿真中关节抽搐问题全解析:从碰撞检测到参数调优 在机器人动力学仿真领域,MuJoCo以其高效的物理引擎和精准的刚体动力学计算著称。然而即便是经验丰富的开发者,也常会遇到关节异常抽搐的棘手问题——这种看似微小的异常往往导致整个仿真…...

vLLM调参实战:用H100压测gpt-oss-120b时我们踩过的那些坑

vLLM调参实战:H100压测gpt-oss-120b的深度优化手记 当H100遇上百亿参数大模型,性能调优就像在钢丝上跳舞——稍有不慎就会坠入延迟暴涨的深渊。这次我们团队在云计算环境中对gpt-oss-120b进行全链路压测时,记录下一系列反直觉的发现&#xff…...

Go之goroutine

go语句意味着一个函数或方法的并发执行.go语句是由关键字和表达式组成的.简单说.表达式就是用于描述针对若干操作数的计算方法的式子.Go的表达式有很多种.其中就包括调用表达式.调用表达式所表达的是针对函数或方法的调用.其中的函数可以是命名的.也可以是匿名的.能够称为表达式…...

openwrt ipv6与v4共存relay情况下ping6不通问题解决

有些校园网虽然开了slaac无状态,但仍然有监权机制。需要ipv4拨号。否则v6也不通。一个路由器下面的多个设备并不想多次拨号。按照前辈们的做法只分配/64的v6网络用relay就行了。尤其是openwrt22以后wan上的master也不用ssh。跑题了。^_^解决方案是用ndppd。下面是完…...

Phi-3-vision-128k-instructGPU优化:INT4量化后精度损失<1.2%的实测报告

Phi-3-vision-128k-instruct GPU优化&#xff1a;INT4量化后精度损失<1.2%的实测报告 1. 模型概述 Phi-3-Vision-128K-Instruct 是一个轻量级的开放多模态模型&#xff0c;属于Phi-3模型家族的最新成员。这个模型特别之处在于它同时支持文本和视觉数据的处理&#xff0c;并…...

生物信息学数据标准与格式解析:FASTA、FASTQ、BAM、VCF、GFF——从测序仪到分析管线的通用语言

点击 “AladdinEdu&#xff0c;你的AI学习实践工作坊”&#xff0c;注册即送-H卡级别算力&#xff0c;沉浸式云原生集成开发环境&#xff0c;80G大显存多卡并行&#xff0c;按量弹性计费&#xff0c;教育用户更享超低价。 摘要&#xff1a;随着高通量测序技术的飞速发展&#x…...

极空间NAS上5分钟搞定TaleBook书库:豆瓣刮削+Calibre Web完美整合

极空间NAS打造智能书库&#xff1a;TaleBook与豆瓣数据无缝对接指南 为什么选择TaleBook管理电子书收藏 作为一名藏书爱好者&#xff0c;我深知整理电子书库的痛点。传统文件夹管理方式难以展现书籍封面和元数据&#xff0c;而专业图书管理软件又往往操作复杂。直到在极空间N…...

JHenTai全场景部署攻略:从入门到精通的跨设备实践

JHenTai全场景部署攻略&#xff1a;从入门到精通的跨设备实践 【免费下载链接】JHenTai A cross-platform app made for e-hentai & exhentai by Flutter 项目地址: https://gitcode.com/gh_mirrors/jh/JHenTai JHenTai作为一款基于Flutter开发的跨平台应用&#xf…...

从Rayleigh商到Courant-Fischer:Hermite矩阵特征值的变分刻画

1. 从Rayleigh商理解Hermite矩阵特征值 我第一次接触Rayleigh商这个概念是在研究振动系统稳定性时。当时导师在黑板上写下一个看似简单的表达式&#xff1a;R(x)(xᴴAx)/(xᴴx)&#xff0c;告诉我这个比值能揭示系统固有频率的关键信息。后来我才明白&#xff0c;这其实就是理解…...

Phi-3-vision-128k-instruct案例分享:多模态安全机制拦截违规图像请求

Phi-3-vision-128k-instruct案例分享&#xff1a;多模态安全机制拦截违规图像请求 1. 模型简介 Phi-3-Vision-128K-Instruct 是一个轻量级的开放多模态模型&#xff0c;属于 Phi-3 模型家族的最新成员。这个模型特别之处在于它支持128K的超长上下文处理能力&#xff0c;能够同…...

强基计划简析

首先&#xff0c;强基计划是什么&#xff1f;强基计划全称为“基础学科招生改革试点”&#xff0c;是教育部自2020年起实施的招生改革项目。它替代了原有高校自主招生方式&#xff0c;主要选拔有志于服务国家重大战略需求且综合素质优秀或基础学科拔尖的学生。招生方面&#xf…...

AE视频剪辑脚本化:LiuJuan20260223Zimage根据文案自动生成After Effects操作指令

AE视频剪辑脚本化&#xff1a;用AI让视频制作更高效 最近和几个做视频的朋友聊天&#xff0c;发现大家都有个共同的烦恼&#xff1a;创意想法很多&#xff0c;但真正花在剪辑软件里的时间&#xff0c;大部分都耗在了重复性的操作上。比如&#xff0c;给几十个片段统一添加转场…...

MusePublic艺术创作引擎升级攻略:如何获得更快的生成速度

MusePublic艺术创作引擎升级攻略&#xff1a;如何获得更快的生成速度 1. 为什么你的MusePublic生成速度不够快 你有没有遇到过这样的情况&#xff1a;输入一段精心构思的提示词&#xff0c;点击生成按钮&#xff0c;然后盯着进度条等待——30秒、1分钟、甚至更久。等待的过程…...

基于STM32F103与MPU6050的立创数字水平仪DIY全流程解析

基于STM32F103与MPU6050的立创数字水平仪DIY全流程解析 最近在工位上捣鼓一些小玩意儿&#xff0c;想着能不能自己做一个既实用又有趣的电子工具。于是&#xff0c;一个数字水平仪的想法就冒出来了。它不仅能测量平面的倾斜角度&#xff0c;还能把数据直观地显示在屏幕上&#…...

开源Mod管理工具KKManager:全方位解决游戏插件管理难题

开源Mod管理工具KKManager&#xff1a;全方位解决游戏插件管理难题 【免费下载链接】KKManager Mod, plugin and card manager for games by Illusion that use BepInEx 项目地址: https://gitcode.com/gh_mirrors/kk/KKManager 在游戏Mod管理领域&#xff0c;玩家常面临…...

用生活案例学算法:动态规划就像理财,贪心算法像点外卖?

用生活案例学算法&#xff1a;动态规划就像理财&#xff0c;贪心算法像点外卖&#xff1f; 当你第一次听到"动态规划"和"贪心算法"这些术语时&#xff0c;是不是觉得它们离日常生活很遥远&#xff1f;其实&#xff0c;这些看似高深的算法概念&#xff0c;在…...

Qwen3-14b_int4_awq行业方案:为律所定制合同关键条款提取+风险提示生成服务

Qwen3-14b_int4_awq行业方案&#xff1a;为律所定制合同关键条款提取风险提示生成服务 1. 方案背景与价值 在法律服务行业&#xff0c;合同审查是一项高频且耗时的工作。传统人工审查方式面临以下挑战&#xff1a; 合同条款识别效率低&#xff1a;律师需要逐条阅读冗长合同风…...

突破限制:WeChatPad实现微信全设备适配的完整方案

突破限制&#xff1a;WeChatPad实现微信全设备适配的完整方案 【免费下载链接】WeChatPad 强制使用微信平板模式 项目地址: https://gitcode.com/gh_mirrors/we/WeChatPad 多设备登录困境与解决方案 当你尝试在手机和电脑同时登录微信时&#xff0c;是否遇到过"该…...

Win11系统优化:Nanbeige 4.1-3B部署性能调优

Win11系统优化&#xff1a;Nanbeige 4.1-3B部署性能调优 1. 开篇&#xff1a;为什么要在Win11上部署Nanbeige模型 最近很多朋友在Windows 11上跑AI模型时遇到了性能问题&#xff0c;特别是部署Nanbeige 4.1-3B这样的中等规模模型时&#xff0c;总觉得速度不够理想。其实Win11…...

Janus-Pro-7B解决C语言文件读写难题:示例代码生成与错误处理

Janus-Pro-7B解决C语言文件读写难题&#xff1a;示例代码生成与错误处理 1. 引言 如果你写过C语言&#xff0c;肯定对文件操作又爱又恨。爱的是它给了你直接操作系统的能力&#xff0c;恨的是那些看似简单的fopen、fread、fclose背后&#xff0c;藏着无数个让你程序崩溃的陷阱…...

Alibaba DASD-4B Thinking 快速开始:Node.js环境下的API调用与流式响应处理

Alibaba DASD-4B Thinking 快速开始&#xff1a;Node.js环境下的API调用与流式响应处理 最近在折腾一些AI应用的后端集成&#xff0c;发现不少开发者对如何在自己的Node.js服务里快速接入大模型API&#xff0c;特别是处理流式响应&#xff0c;感觉有点无从下手。正好&#xff…...

如何安装配置Goland并使用固定公网地址SSH远程连接本地服务器

文章目录 1. 安装配置GoLand2. 服务器开启SSH服务3. GoLand本地服务器远程连接测试4. 安装cpolar内网穿透远程访问服务器端 4.1 服务器端安装cpolar4.2 创建远程连接公网地址 5. 使用固定TCP地址远程开发 本文主要介绍使用GoLand通过SSH远程连接服务器&#xff0c;并结合cpol…...

网页编辑器如何处理KindEditor的Excel数据源格式保留?

&#x1f680; 老北京PHP程序员的逆袭&#xff1a;给KindEditor插上Word的翅膀&#xff01; 各位爷们儿姐们儿&#xff0c;您瞅瞅&#xff0c;咱一个北京土著PHP程序员&#xff0c;最近接了个CMS企业官网的活儿&#xff0c;客户爸爸提出了个"变态"需求&#xff1a;要…...

零基础上手骨骼动画转换:Mixamo到UE4的开源工具全攻略

零基础上手骨骼动画转换&#xff1a;Mixamo到UE4的开源工具全攻略 【免费下载链接】mixamo_converter Blender addon for converting mixamo animations to Unreal 4 rootmotion 项目地址: https://gitcode.com/gh_mirrors/mi/mixamo_converter 在游戏开发中&#xff0c…...

西门子200 SMART PLC MODBUS TCP协议多从站轮询实战程序案例解析与应用示例

西门子200SMART MODBUS TCP协议多从站轮询实战程序案例刚接手车间设备联网改造那会儿&#xff0c;碰到个头疼的问题——六台200SMART PLC要通过MODBUS TCP把数据汇总到上位机。官方例程都是单从站配置&#xff0c;真遇到多设备轮询才发现坑多得能养鱼。折腾了俩礼拜&#xff0c…...

C++——类模板的概念和意义

1.一些类主要用于存储和组织数据元素&#xff0c;类中数据组织的方式和数据元素的具体类型无关&#xff0c;只关注需要实现的功能&#xff0c;如数组类、链表类、Stack类、Queue类2.类模板的应用&#xff08;1&#xff09;只能显示指定具体类型&#xff0c;无法自动推导&#x…...

CV实战:Harris角点检测在图像拼接中的应用(Python+OpenCV实现)

1. 图像拼接为什么需要角点检测 第一次尝试用Python做图像拼接时&#xff0c;我直接把两张照片叠在一起&#xff0c;结果发现接缝处总是错位。后来才明白&#xff0c;计算机不像人眼能直观匹配图像&#xff0c;它需要明确的"路标"来对齐画面。这就是角点检测的价值所…...

Docker 27低代码容器化真香现场:Java/Spring Boot项目3分钟生成可验证镜像,含SBOM+SCA+签名三重合规凭证(附GPG密钥生成脚本)

第一章&#xff1a;Docker 27低代码容器化的革命性演进Docker 27并非官方发布的版本号&#xff0c;而是社区对Docker平台与低代码能力深度融合趋势的前瞻性代称——它标志着容器技术正从纯命令行驱动的运维范式&#xff0c;跃迁为可视化编排、策略即配置、应用即模板的新型开发…...

每日打卡15

128&#xff1a;#include <bits/stdc.h>using namespace std;int m, cnt;// 移动n块&#xff0c;从a->c&#xff0c;借助b void hanoi(int n, char a, char b, char c) {if (n 1) {// 如果当前步骤就是第m步&#xff0c;直接输出 if (cnt m) cout << a <&l…...