导航:首页 > 制冷设备 > stm32怎么看程序接超声波

stm32怎么看程序接超声波

发布时间:2023-07-10 17:37:50

1. 请求教,STM32超声波如何定义管脚,给管脚高低电平,是如何写的,稍微写一下,我理解理解

一般就是两个管脚:TRIG、ECHO。超声波又分两种,一种是自己驱动的(自己画超声波部分电路),一种是驱动第三方做好的。

一、自己驱动的

  1. TRIG脚初始化为输出,ECHO初始化为输入。同时ECHO脚设置为外部中断

2.TRIG脚发送脉冲,一般是循环发送8个脉冲。然后计时清0.

for(u8 i = 0; i < 8; i++)

{

TRIG_HIGH;

delay_us(10);

TRIG_LOW;

delay_us(10);

}

3.等待触发ECHO脚的外部中断,或者等待超时(这是为了前方空旷没有超声波返回)。

4.数据处理。((float)(SonicL.time.ms * 1000.0 + PULSE_TIME + WAIT_STABLE_TIME + SonicL.time.endCnt - SonicL.time.startCnt)/ 58.0);//cm

二、直接用模块,这个模块一般会有厂家提供手册

  1. TRIG脚初始化为输出,ECHO初始化为输入。同时ECHO脚设置为外部中断

  2. 2.TRIG脚发送脉冲,一般是循环发送8个脉冲。

    TRIG_HIGH; delay_us(20); TRIG_LOW;

3.等待触发ECHO脚的外部中断(上升沿中断时计时清0.下降沿中断时停止计时),或者等待超时(这是为了前方空旷没有超声波返回)

4.数据处理。((float)(SonicL.time.ms * 1000.0 + SonicL.time.endCnt - SonicL.time.startCnt)/ 58.0);//cm

2. 使用超声波传感器HY-SRF05时,VCC端接在STM32F103C8T6单片机的5V引脚

STM32F103的电源是3.3V的,而一般这个3.3V的电源都是从5V电源得来的;
如果你板上没有5V电源,如是直接从锂电池供电的,只需要加个小小的电源转换模块,3.3-->5V,便可得到5V电源,而传感器的耗电很小容易满足;

3. stm32中软件部分如何利用传感器接口驱动超声波测距

这个可以通过超声波传感器的输出端口采集,看传感器是数字接口还是模拟输出。

4. 关于stm32驱动超声波测距模块的问题,要疯了QAQ

1、目前大部分超声波模块都是5V供电的,STM32是3.3V供电,如果你的模块是3.3V那么它是不能正常工作的。
2、另外,如果模块使用5V供电,应当在通信口串联限流电阻,避免5V信号直接灌入芯片,造成损坏。

5. stm32引脚接超声波接口用什么模式

stm32引脚接超声波接口用什么模式
超声波模块测得的距离一直是固定值的同仁看过来:
如果你是用3.3v给开发板供电,但用到了开发板的5v给HC-SR04供电,那么你就和我掉进的同一个坑
出现这个问题的原因是STM32开发板一般没有升压芯片或其他升压措施,因此低于5v给开发板供电是不可能输出5v电压的 ,根据测量它只有2.86v,这就导致了HC-SR04供电不足的问题
在我认为是代码问题并修改了16个小时的最后一分钟,我发现他是供电不足引起的,这一结论真让我哭笑不得
开篇闲谝:
耀风(鄙人)是一个STM32才入门的小白所以文章写的不是很严谨,如果有错误欢迎大家指正。我写这篇文章的目的有两个:
第一,记录本次实验方便自己以后查看(毕竟卡了我16个小时,错误原因竟然是哭笑不得的供电不足)。
第二,分享给其他在学或还不知道怎么使用超声波模块的同仁,避免犯和我一样的错误。
编程IDE工具: KEIL5
实验所需材料:
1.STM32F1系列单片机任意一款
2. HC_SR04超声波模块
3.杜邦线若干
引脚连接:
Tring —>PA4
Echo —>PA5
GND —>GND
VCC —>5v~5.5v
网上资料说超声波模块的供电电压在3~5.5v,但是还是建议用5v左右,因为稳定。如果STM32不是5v供电,那么就不要用STM32开发板上的引脚给HC_SR04供电。
原因就是STM32开发板一般没有升压芯片或其他升压措施,因此低于5v给开发板供电是不可能输出5v电压的 (再啰嗦一遍)
实验原理:
通过STM32的GPIO给HC_SR04模块的Tring引脚输出一个至少10us的高电平开启超声波模块,然后超声波模块就会自动发送一个连续的由8个40KHZ脉冲组成的脉冲串,发送完成后HC_SR04模块的Echo引脚会变成低电平并且HC_SR04模块的芯片也会开始时。如果HC_SR04发出的脉冲串遇到障碍物就会被反射回来,当超声波模块接收到返回的脉冲串时就会将Echo引脚变成高电平并且HC_SR04模块的芯片也会停止计时,Echo引脚输出高电平的时间就是脉冲串从发出到接收的时间。
由上面这巴拉巴拉的一段话我们可以知道驱动HC_SR04的步骤:
1. 通过STM32的GPIO给HC_SR04的Tring引脚输出一个至少10us的高电平
2. 当HC_SR04的Echo引脚输出高电平时开启STM32的定时器或Systick定时器开始计时,当Echo引脚输出低电平时停止计时,并记录时间
3. 根据时间算距离
distance = T(所测时间)x 340m/s / 2 = T(所测时间) x 170m/s = T(所测时间) x 17000 cm / 1000 000 us = T(所测时间)/ 1000 000 us / 17000 cm = T(所测时间)/ 58.0(近似值)
不想看上面推导的朋友知道距离 distance = T(所测时间)/ 58.0 就可以了
代码核心片段讲解:
//**********引脚初始化*************
void init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStruct);
}
/***********延时函数定义(使用Systick定时器实现)**************
1.用Systick定时器的原因就是它操作简单一点,不用初始化,直接调用SysTick_Config()函数即可,然后在写个相应中断函数就可
2.因为在本项目中延时和定时不用同时运行,所以这两个功能用一个定时器就好
*************************************************************/
void delay_ms(uint32_t time)
{
TIME = time;
State = 0; // 用于区分是Systick因延时的进入中断还是因定时进入中断
SysTick_Config(72000); //定时器每1ms计时一次
while(TIME!=0);
SysTick->CTRL &=~ SysTick_CTRL_ENABLE_Msk; //关闭定时器
}

void delay_us(uint32_t time)
{
TIME = time;
State = 0;// 用于区分是Systick因延时的进入中断还是因定时进入中断
SysTick_Config(72);//定时器每1us计时一次
while(TIME!=0);
SysTick->CTRL &=~ SysTick_CTRL_ENABLE_Msk;//关闭定时器
}

//************测引脚电平持续时间函数定义******************
uint32_t pulseIn(GPIO_TypeDef* GPIOx,uint16_t Pin,STATE state)
{
uint32_t time = 0;
uint8_t i ;
while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_5) == (u8)!state){}
State = 1;
TIME = 0;
SysTick_Config(72); //一定要以1us为溢出时间,因为算距离的公式中的T是以us为单位的
while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_5) == (u8)state){}

SysTick->CTRL &=~SysTick_CTRL_ENABLE_Msk;
time = TIME;
TIME = 0;
printf(" Time = %d\n",time);

return time;
}

extern int TIME;
extern uint8_t State;
void SysTick_Handler(void)
{
if(State == 0) //因延时函数中的SysTick定时器溢出进入
TIME--;
else if(State == 1) //因定时中的SysTick定时器溢出进入
TIME++;
}

int main(void)
{
init();
Usart_begin(USART1,9600); //这是我自己写的STM32库函数二次封装中的USART1初始化函数
//啊吧啊吧,本来整个工程都是用我开发的二次封装写的,奈何我竟傻傻的16个小时都认为是代码问题,所以就改掉了。
while(1){
float distance;
GPIO_ResetBits(GPIOA,GPIO_Pin_4);
delay_us(10);
GPIO_SetBits(GPIOA,GPIO_Pin_4);
delay_us(20);
GPIO_ResetBits(GPIOA,GPIO_Pin_4);

distance = (float)pulseIn(GPIOA, GPIO_Pin_5,HIGH)/58.0; //算出距离(58.0的原因前面有讲解)

printf("distance = %.2lf\n",distance);
delay_ms(200);
}
}
登录后复制

后面我会专门写一个这个二次封装用法的文章的,大家先搞着用这个四不像的工程代码吧。啊吧啊吧
输出正常:

代码分享:
耀风写的代码,需要请点击下载
提取码:YFJS

阅读全文

与stm32怎么看程序接超声波相关的资料

热点内容
steam令牌换设备了怎么办 浏览:246
新生测听力仪器怎么看结果 浏览:224
化学试验排水集气法的实验装置 浏览:156
家用水泵轴承位置漏水怎么回事 浏览:131
羊水镜设备多少钱一台 浏览:125
机械制图里型钢如何表示 浏览:19
测定空气中氧气含量实验装置如图所示 浏览:718
超声波换能器等级怎么分 浏览:800
3万轴承是什么意思 浏览:110
鑫旺五金制品厂 浏览:861
苏州四通阀制冷配件一般加多少 浏览:153
江北全套健身器材哪里有 浏览:106
水表阀门不开怎么办 浏览:109
花冠仪表盘怎么显示时速 浏览:106
洗砂机多少钱一台18沃力机械 浏览:489
超声波碎石用什么材料 浏览:607
组装实验室制取二氧化碳的简易装置的方法 浏览:165
怎么知道天然气充不了阀门关闭 浏览:902
公司卖旧设备挂什么科目 浏览:544
尚叶五金机电 浏览:59