当前位置:网站首页>模块学习(四)——超声波测距
模块学习(四)——超声波测距
2022-07-20 12:09:00 【小树苗要冲冲冲】
今天想着把测距模块全部一网打尽了,把点对点和点对面两种测距全部搞定,于是有了这篇关于超声波模块的博客分享,主要还是分享代码,原理啥的网上都有,这次是基于MSP430F5529的driverlib库,没有找到开源的代码就自己分享一下了!
1.基本原理
还是稍稍讲一下原理,不然等下可能代码看不懂。两个引脚,一个TRIG,一个ECHO,就是触发和回响,顾名思义,trig是用来触发启动超声波模块的,echo模块是用来回收超声波的。此次使用的是US-100超声波模块,其实和常见的HC-SR04/5系列是一样的,代码均可用。
基本原理
trig引脚给一个大于10us的高电平脉冲,即会启动超声波模块。
启动之后,模块内部会发送一段8个40KHZ的脉冲,随后,在echo引脚会接受到一段时长的高电平,这个高电平时长就是模块发出的脉冲出去之后,碰到障碍物返回的时间。
2.代码
废话不多说,直接上大家最喜欢的代码。
1.初始化配置
/* * ultrasonic.c * * Created on: 2022年7月19日 * Author: S10 */
#include "ultrasonic.h"
void wave_Init(void)
{
GPIO_setAsOutputPin(Trig_Port,Trig_Pin);//设置触发引脚为输出模式
GPIO_setAsPeripheralModuleFunctionInputPin(Echo_Port,Echo_Pin);//设置接收引脚为输入模式
//Start timer in continuous mode sourced by SMCLK
Timer_A_initContinuousModeParam initContParam = {
0};//定义连续模式初始化结构体
initContParam.clockSource = TIMER_A_CLOCKSOURCE_SMCLK;//确定时钟源SMCLK
initContParam.clockSourceDivider = TIMER_A_CLOCKSOURCE_DIVIDER_16;//16分频
initContParam.timerInterruptEnable_TAIE = TIMER_A_TAIE_INTERRUPT_DISABLE;//禁用Tim A中断
initContParam.timerClear = TIMER_A_DO_CLEAR;//重置计数方向等.....
initContParam.startTimer = false;//先不开启计数器
Timer_A_initContinuousMode(TIMER_A2_BASE, &initContParam);
//清除比较模式中断(初始化比较模式)
Timer_A_clearCaptureCompareInterrupt(TIMER_A2_BASE,
TIMER_A_CAPTURECOMPARE_REGISTER_2
);
Timer_A_initCaptureModeParam initCapParam = {
0};//定义比较模式初始化结构体
initCapParam.captureRegister = TIMER_A_CAPTURECOMPARE_REGISTER_2;//选择TIM_A2的捕获比较通道2
initCapParam.captureMode = TIMER_A_CAPTUREMODE_RISING_AND_FALLING_EDGE;//捕获上升沿
initCapParam.captureInputSelect = TIMER_A_CAPTURE_INPUTSELECT_CCIxA;//确定输入选择为CCIxA(这个不知道怎么看怎么确定)
initCapParam.synchronizeCaptureSource = TIMER_A_CAPTURE_SYNCHRONOUS;//与时钟同步
initCapParam.captureInterruptEnable = TIMER_A_CAPTURECOMPARE_INTERRUPT_ENABLE;//使能捕获中断
Timer_A_initCaptureMode(TIMER_A2_BASE, &initCapParam);
Timer_A_startCounter( TIMER_A2_BASE,//开启计时
TIMER_A_CONTINUOUS_MODE
);
//Enter LPM0, enable interrupts开启全局中断
__bis_SR_register(GIE);
//For debugger
__no_operation();
}
void wave_star(void)
{
GPIO_setOutputHighOnPin(Trig_Port,Trig_Pin);
delay_us(20);//10us高电平即可触发
GPIO_setOutputLowOnPin(Trig_Port,Trig_Pin);
}
/* * ultrasonic.h * * Created on: 2022年7月19日 * Author: S10 */
#ifndef ULTRASONIC_H_
#define ULTRASONIC_H_
#include "driverlib.h"
#define Trig_Port GPIO_PORT_P2
#define Trig_Pin GPIO_PIN4
#define Echo_Port GPIO_PORT_P2
#define Echo_Pin GPIO_PIN5
#define CPU_CLOCK 16000000
#define delay_us(us) __delay_cycles(CPU_CLOCK/1000000*(us))
void wave_Init(void);
void wave_star(void);
#endif /* ULTRASONIC_H_ */
初始化代码大家根据自己所选引脚进行修改即可。
2.中断服务函数
switch(__even_in_range(TA2IV,14))//中断标志位——对应捕获通道
{
case 2 :break;//如果是CCR1产生的中断
case 4 : //如果是CCR2产生的中断
if(GPIO_getInputPinValue(Echo_Port,Echo_Pin) == 1)//读取此时电平状态,高电平则为上升沿捕获
{
Data_first = Timer_A_getCaptureCompareCount(TIMER_A2_BASE,TIMER_A_CAPTURECOMPARE_REGISTER_2);
}
else//读取此时电平状态,低电平为下降沿捕获
{
Data_second = Timer_A_getCaptureCompareCount(TIMER_A2_BASE,TIMER_A_CAPTURECOMPARE_REGISTER_2);
if(overflow_times == 0)
HIGH_Time = (Data_second - Data_first);
else
HIGH_Time = ((Data_second - Data_first) + overflow_times * 65535);
Distance = (((float)HIGH_Time/1000000)* 340)/2 ;//m
}
// Timer_A_clearCaptureCompareInterrupt(TIMER_A2_BASE,TIMER_A_CAPTURECOMPARE_REGISTER_2);
break;
case 10: break;
case 14:
if(GPIO_getInputPinValue(Echo_Port,Echo_Pin))
{
overflow_times++;
}
else
overflow_times = 0;
// Timer_A_clearTimerInterrupt(TIMER_A2_BASE);
break;//此时发生计数器溢出
default: break;
}
// Enable global interrupt
_BIC_SR_IRQ(LPM0_bits);
大概就是这些了,还需要注意的一点是在主函数中要记得调用超声波启动函数。
在使用过程中,超声波模块和平面的法向量之间的角度需要注意,否则会造成测量不准确。
该模块测量精度在2cm-450cm,可谓是非常强大了.有任何疑问可以私信我或者评论区留言,看到一定回。有表述不好的地方或者可以优化的地方,也请各位点出来一下,共同进步!
边栏推荐
- Kusionstack open source | exploration and practice of kusion model library and tool chain
- R语言使用mean函数计算样本(观测)数据中指定变量的相对频数:计算dataframe中指定数据列的值等于指定内容的比例(取值为NJ的内容在数据列中的比例)
- 2022/7/17
- Redis學習筆記(1)——B站動力節點
- Hcip notes day 8
- C语言 sscanf函数
- 面试真题2
- PG operation and maintenance -- common management commands
- Unity学习笔记 之 发射小球碰撞物体的代码记录
- Ocr/str data training | fine tune FAQ summary of paddleocr (3)
猜你喜欢
新建第一个HBuilder项目
grafana可视化配置图表Stat
音视频学习(九)——RTCP协议
Ocr/str data training | fine tune FAQ summary of paddleocr (3)
pytorch常见问题整理与解决方法
VPS、独服和云服务器哪种最适合您的业务?
Five ways of accelerating digital transformation with low code
技术解析|Doris Connector 结合 Flink CDC 实现 MySQL 分库分表 Exactly Once精准接入
阿里云发布《升舱-数据仓库升级交付标准化》白皮书
开源demo| ARCall 小程序开源示例发布
随机推荐
Report server calculation for optimizing report system structure
R语言ggplot2可视化:使用ggpubr包的ggsummarytable函数可视化箱图并在箱图下添加描述性统计信息、设置clean_table_theme函数为主题函数移除表格的初始主题信息
IReport导出PDF字体加粗失效
【暑期每日一题】洛谷 P6850 NOI
Surface strongest editor sublime | regular expression skills
包教包会-贝塞尔曲线的绘制原理与应用
自动推理的逻辑05--谓词演算
上海文旅局局长:安全是文旅业的生命线,正抢抓元宇宙新赛道
You might as well give more guidance to "cloud interview"
uva11100
【暑期每日一题】洛谷 P7550 [COCI2020-2021#6] Bold
how to deal with " no such file error or diretory" error for a new programmer in QT creator
Kusionstack open source | exploration and practice of kusion model library and tool chain
初柒科技致力于设计与开发
Insightface paddle User Guide (2)
R语言使用epiDisplay包的aggregate函数将数值变量基于因子变量拆分为不同的子集,计算每个子集的汇总统计信息、计算单个连续变量的分组汇总统计信息
MSYQL multiple or, and,
推荐一个 WordPress 付费主题站
[IOT] Product Manager: the underlying logic of human insight
百度飞桨PaddleHub | 词法分析