模块学习(四) 您所在的位置:网站首页 超声波k值是什么意思啊 模块学习(四)

模块学习(四)

2024-06-20 19:39| 来源: 网络整理| 查看: 265

今天想着把测距模块全部一网打尽了,把点对点和点对面两种测距全部搞定,于是有了这篇关于超声波模块的博客分享,主要还是分享代码,原理啥的网上都有,这次是基于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,可谓是非常强大了.有任何疑问可以私信我或者评论区留言,看到一定回。有表述不好的地方或者可以优化的地方,也请各位点出来一下,共同进步!



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有