stm32驱动超声波模块源码

发布者:科技小巨人最新更新时间:2022-12-26 来源: zhihu关键字:stm32  驱动  超声波模块 手机看文章 扫描二维码
随时随地手机看文章

  下面是关于stm32驱动超声波模块的一段代码,有需要的朋友可以复制参考,希望对大家能够有所帮助和启发。


  #define HCSR04_PORT GPIOB

  #define HCSR04_CLK RCC_APB2Periph_GPIOB

  #define HCSR04_TRIG GPIO_Pin_8

  #define HCSR04_ECHO GPIO_Pin_9

  #define TRIG_Send(n) do{

  if(n == 0)

  GPIO_ResetBits(HCSR04_PORT,HCSR04_TRIG);

  else if(n == 1)

  GPIO_SetBits(HCSR04_PORT,HCSR04_TRIG);

  }while(0)

  #define ECHO_Reci GPIO_ReadInputDataBit(GPIOB,HCSR04_ECHO)

  void UltrasonicInit(void)

  {

  GPIO_InitTypeDef GPIO_InitStructure;

  RCC_APB2PeriphClockCmd(HCSR04_CLK, ENABLE);

  //IO初始化

  GPIO_InitStructure.GPIO_Pin = HCSR04_TRIG; //发送电平引脚

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出

  GPIO_Init(HCSR04_PORT, &GPIO_InitStructure);

  GPIO_ResetBits(HCSR04_PORT,HCSR04_TRIG);

  GPIO_InitStructure.GPIO_Pin = HCSR04_ECHO; //返回电平引脚

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入

  GPIO_Init(HCSR04_PORT, &GPIO_InitStructure);

  GPIO_ResetBits(HCSR04_PORT,HCSR04_ECHO);

  TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; //生成用于定时器设置的结构体

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE); //使能对应RCC时钟

  //配置定时器基础结构体

  TIM_DeInit(TIM6);

  TIM_TimeBaseStructure.TIM_Period = (1000-1); //设置在下一个更新事件装入活动的自动重装载寄存器周期的值  计数到1000为1ms

  TIM_TimeBaseStructure.TIM_Prescaler =(72-1); //设置用来作为TIMx时钟频率除数的预分频值  1M的计数频率 1US计数

  TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;//不分频

  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式

  TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure);  //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

  TIM_ClearFlag(TIM6, TIM_FLAG_Update); //清除更新中断,免得一打开中断立即产生中断

  TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE); //打开定时器更新中断

  NVIC_InitTypeDef NVIC_InitStructure;

  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

  NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn; //选择串口1中断

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //抢占式中断优先级设置为1

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应式中断优先级设置为1

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中断

  NVIC_Init(&NVIC_InitStructure);

  TIM_Cmd(TIM6,DISABLE);

  }

  //定时器6中断服务程序

  u32 msHcCount = 0;

  void TIM6_IRQHandler(void) //TIM6中断

  {

  if (TIM_GetITStatus(TIM6, TIM_IT_Update) != RESET) //检查TIM3更新中断发生与否

  {

  TIM_ClearITPendingBit(TIM6, TIM_IT_Update); //清除TIMx更新中断标志

  msHcCount++;

  }

  }

  static void OpenTimerForHc() //打开定时器

  {

  TIM_SetCounter(TIM6,0); //清除计数

  msHcCount = 0;

  TIM_Cmd(TIM6, ENABLE); //使能TIMx外设

  }

  static void CloseTimerForHc() //关闭定时器

  {

  TIM_Cmd(TIM6, DISABLE); //使能TIMx外设

  }

  //获取定时器时间

  u32 GetEchoTimer(void)

  {

  u32 t = 0;

  t = msHcCount*1000; //将MS转换成US

  t += TIM_GetCounter(TIM6); //得到总的US

  TIM6->CNT = 0; //将TIM6计数寄存器的计数值清零

  return t;

  }

  //一次获取超声波测距数据 两次测距之间需要相隔一段时间,隔断回响信号

  //为了消除余震的影响,取五次数据的平均值进行加权滤波。

  float Hcsr04GetLength(void )

  {

  u32 t = 0;

  int i = 0;

  float lengthTemp = 0;

  float sum = 0;

  while(i!=5)

  {

  /*发送一个20ms的脉冲*/

  TRIG_Send(1);

  osDelay(20);

  TRIG_Send(0);

  while(ECHO_Reci == 0); //等待接收口高电平输出(超声波发出)

  OpenTimerForHc(); //打开定时器

  while(ECHO_Reci == 1); //等待超声波返回

  CloseTimerForHc(); //关闭定时器

  t = GetEchoTimer(); //获取时间,分辨率为1US

  lengthTemp = ((float)t*17/1000.0);//cm

  sum = lengthTemp + sum ;

  i = i + 1;

  }

  lengthTemp = sum/5.0;

  return lengthTemp;

  }


关键字:stm32  驱动  超声波模块 引用地址:stm32驱动超声波模块源码

上一篇:STM32开发入门之串口详解
下一篇:使用Keil下载Hex文件进STM32

推荐阅读最新更新时间:2024-11-12 08:06

Elmo携领先伺服驱动器亮相深圳工业自动化博览会
以色列Elmo Motion Control公司(埃莫运动控制技术) 是全球领先的运动控制解决方案提供商,一直致力于降低自动化行业各种设备的成本、减小机器尺寸,同时加强设备的性能与可靠性。Elmo将于7月1日至3日在深圳举行的深圳工业自动化博览会上展出其经过实战检验的智能伺服驱动器,其展位位于深圳会展中心2号厅2A09。   客户需要能够节省空间以及减少布线的运动控制解决方案,这种需求日益增加。客户始终寻求摆脱“布线噩梦”以及摒弃笨重的电气柜。通过使用Elmo的PCB插针式智能驱动器,即可减小设备的尺寸,优化机器的生产性能,并节约成本(占用更少空间,减少电气柜、线缆、接插件、滤波器、人工和维护)。     El
[嵌入式]
STM32 禁用swd-jtag下载口后,重新下载程序的方法
由于工作需要,复用了PA15的时候,程序禁用swd-jtag功能,网上多方查找解决方法。 在重新上电的时候,保证BOOT0为高电平,BOOT1为低电平,即可禁止程序从烧写过的代码启动,这时,重新烧写程序即可。 STM32三种启动模式对应的存储介质均是芯片内置的,它们是: 1)用户闪存=芯片内置的Flash。 2)SRAM=芯片内置的RAM区,就是内存啦。 3)系统存储器=芯片内部一块特定的区域,芯片出厂时在这个区域预置了一段Bootloader,就是通常说的ISP程序。这个区域的内容在芯片出厂后没有人能够修改或擦除,即它是一个ROROMM区。 在每个STM32的芯片上都有两个管脚BOOT0和BOOT1,这两个管脚在芯片复位
[单片机]
一文详解STM32端口复用及映射
复用 STM32有很多的内置外设,这些外设的外部引脚都是与GPIO复用的。也就是说,一个GPIO如果可以复用为内置外设的功能引脚,那么当这个GPIO作为内置外设使用的时候,就叫做复用。 哪些端口可以复用为什么,这个查表就可以了 2,如何进行端口复用? 比如AF1要复用到TIM1; 通过设置AFRL寄存器和AFRH寄存器 就可以AF1----- TIM1; 一组IO口有16个 GPIOAF0~15 AFRL负责低八位IO AFRH负责高八位IO 举例 除了ADC或者DAC配置为模拟之外,其他外设都要配置为复用 //完整版 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIO
[单片机]
一文详解<font color='red'>STM32</font>端口复用及映射
STM32中将常量存储在FLASH中(CONST关键字)
今天在写程序时,想把一个字符串常量存储在STM32的FLASH中,看了一会儿别人的例子程序,知道是用const这个关键字,但第一次没有成功。 前提:我用的是STM32F103ZE单片机, FLASH的存储范围为:0x08000000~0x0807ffff, RAM的存储范围:0x20000000~0x200007ff 失败例子: #include..... 。。。。 int main(void) { u8 const c = somen ; while(1); } 通过调试,查看c 数组的存储位置为0x200*****的位置,常量仍旧处在RAM中。 成功的例子: #include..... u
[单片机]
STM32 ADC采样不准怎么办
最近在使用STM32L011的ADC时,发现ADC采样值极其不准确。经过查找资料,和反复测试,总算摸出点门道。 如将VDDA接到VDD,那么电源的波动会极大的影响ADC精度。 不过使用内部参考电压可以计算实际的VDDA电压。 说明: VREFINT_CAL:芯片出厂时固化在存储器中的。使用时需要通过软件读取。 VREFINT_DATA:ADC读取VREFINT(内部参考电压通道ch17)得到的值,每次采样序列,将ch17一并采集,用来后续的AD值补偿计算。 如何读取VREFINT_CAL? 首先,找到芯片的datasheet,是所使用的那款芯片的数据手册,因为同一系列的不同芯片,可能存在区别。例如,我需要找到
[单片机]
<font color='red'>STM32</font> ADC采样不准怎么办
STM32文字取模&图片取模
1.文字取模 2.图片取模 总结 这只是文字显示,图片显示的一种方式,可以说还是一种比较笨的方法!可以不用但是要知道。 我也是很久不用了,还卡了一些时间。 现在大家都是再用字符下载到W25Qxx中,或者直接用文件读写SD卡的方式打开图片。
[单片机]
<font color='red'>STM32</font>文字取模&图片取模
STM32+DHT11 读取温湿度数据显示
一、环境介绍 MCU: STM32F103C8T6 温湿度模块: DHT11 开发软件: Keil5 二、DHT11 介绍 DHT11 数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。 它应用专用的数字模块采集技术和温湿度传感技术, 确保产品具有极高的可靠性与卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个 NTC 测温元件,并与一个高性能 8 位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。 每个 DHT11 传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式储存在 OTP 内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。 单线制串行接口, 使
[单片机]
浅谈LED驱动电源的隔离与非隔离
LED驱动LED电源目前在一般的LED照明市场上,存在非隔离设计和隔离型驱动电源之分。非隔离设计仅限于双绝缘产品,例如灯泡的替代产品,其中LED和整个产品都集成并密封在非导电塑料中,因此,最终用户并没有任何触电的危险。二级产品都是隔离型的,价格相对比较昂贵,但在用户可以接触到LED和输出接线的地方(通常在LED照明和路灯照明应用的情况下),这种产品必不可少。 解析驱动电源的隔离与非隔离 带隔离变压器或者电气隔离的LED驱动电源意味着LED可以直接用手接触而不会触电。而无隔离变压器的LED驱动电源虽仍可以借助防护外壳实现部分机械绝缘,但此时的LED在工作时并不能直接接触。 绝缘型灯泡在今后将成为主流 物理设计决定着驱动器是隔离式还是
[电源管理]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved