STM32系列(HAL库)——F103C8T6通过HC-SR04超声波模块实现测距

这篇具有很好参考价值的文章主要介绍了STM32系列(HAL库)——F103C8T6通过HC-SR04超声波模块实现测距。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.软件准备

(1)编程平台:Keil5

(2)CubeMX

(3)XCOM(串口调试助手)

2.硬件准备

(1)某宝买的超声波模块

stm32f1 hal 超声波测距,STM32(HAL库)外设实战,嵌入式硬件,单片机,stm32

 

(2)F1的板子,本例使用经典F103C8T6

stm32f1 hal 超声波测距,STM32(HAL库)外设实战,嵌入式硬件,单片机,stm32

(3)ST-link 下载器

stm32f1 hal 超声波测距,STM32(HAL库)外设实战,嵌入式硬件,单片机,stm32

(4)USB-TTL模块

stm32f1 hal 超声波测距,STM32(HAL库)外设实战,嵌入式硬件,单片机,stm32

(5)杜邦线若干

stm32f1 hal 超声波测距,STM32(HAL库)外设实战,嵌入式硬件,单片机,stm32

3.模块资料

(1)模块简介:

        超声波是振动频率高于20kHz的机械波。它具有频率高、波长短、绕射现象小、方向性好、能够成为射线而定向传播等特点。HC-SRO4是一款尺寸完全兼容老版本,增加UART和IIC功能的开放式超声波测距模块,默认条件下,软件与硬件完全兼容老版本HC-SRO4;可以通过电阻设置成UART或IIC模式。2CM盲区,4.5M典型最远测距,2.2mA作电流。采用升级解调芯片RCWL-9206,带UART与IIC功能MCU:使其外围更加简洁,工作电压更宽(3-5.5V),接口功能更多。

(2)模块参数:

①专业解调测距芯片RCWL-9206
②支持GPIO,UART与IIC三种模式接口
③2.2mA工作电流
④2cm最小盲区
⑤2cm-450cm的超宽测量范围
⑥工作温度:-10°C-70°c
⑦3V-5.5V宽电压供电

(3)工作原理

stm32f1 hal 超声波测距,STM32(HAL库)外设实战,嵌入式硬件,单片机,stm32

stm32f1 hal 超声波测距,STM32(HAL库)外设实战,嵌入式硬件,单片机,stm32

 (4)本例程实现思路:

        程序采用状态机编程,MCU给模块Trig引脚输出一个高电平脉冲-->模块发送脉冲信号-->定时器启动高电平输入捕获-->模块返回的高电平信号到达定时器开始计数-->返回信号变为低电平定时器停止计数-->得到定时器时间差-->根据公式计算距离

4.CubeMX配置

(1)芯片选择

stm32f1 hal 超声波测距,STM32(HAL库)外设实战,嵌入式硬件,单片机,stm32

 (2)配置RCC、SYS、时钟树

stm32f1 hal 超声波测距,STM32(HAL库)外设实战,嵌入式硬件,单片机,stm32

配置RCC

stm32f1 hal 超声波测距,STM32(HAL库)外设实战,嵌入式硬件,单片机,stm32

配置SYS

stm32f1 hal 超声波测距,STM32(HAL库)外设实战,嵌入式硬件,单片机,stm32

配置时钟树

(3)配置GPIO

stm32f1 hal 超声波测距,STM32(HAL库)外设实战,嵌入式硬件,单片机,stm32

(4)配置串口1

stm32f1 hal 超声波测距,STM32(HAL库)外设实战,嵌入式硬件,单片机,stm32

 (5)配置定时器

stm32f1 hal 超声波测距,STM32(HAL库)外设实战,嵌入式硬件,单片机,stm32

 (6)开启定时器中断

stm32f1 hal 超声波测距,STM32(HAL库)外设实战,嵌入式硬件,单片机,stm32

(7)设置路径、生成代码工程 

5、Keil5代码

(1)勾选Use MicroLIB

stm32f1 hal 超声波测距,STM32(HAL库)外设实战,嵌入式硬件,单片机,stm32

 

(2)创建SR04.c和SR04.h文件

(3)添加上述的SR04.c文件进工程

——————上述两步参考之前系列教学步骤,在此不再赘述(点击跳转)

(4)SR04.c和SR04.h代码

SR04.h

#ifndef __SR04_H
#define __SR04_H
#include "main.h"
#include "tim.h"
#include "stdio.h"

#define TRIG_H  HAL_GPIO_WritePin(Trig_GPIO_Port,Trig_Pin,GPIO_PIN_SET)
#define TRIG_L  HAL_GPIO_WritePin(Trig_GPIO_Port,Trig_Pin,GPIO_PIN_RESET)

void delay_us(uint32_t us);
void SR04_GetData(void);

#endif

SR04.c

#include "SR04.h"

float distant;      //测量距离
uint32_t measure_Buf[3] = {0};   //存放定时器计数值的数组
uint8_t  measure_Cnt = 0;    //状态标志位
uint32_t high_time;   //超声波模块返回的高电平时间


//===============================================读取距离
void SR04_GetData(void)
{
switch (measure_Cnt){
	case 0:
         TRIG_H;
         delay_us(30);
         TRIG_L;
    
		measure_Cnt++;
		__HAL_TIM_SET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_RISING);
		HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1);	//启动输入捕获       或者: __HAL_TIM_ENABLE(&htim5);                                                                                    		
        break;
	case 3:
		high_time = measure_Buf[1]- measure_Buf[0];    //高电平时间
         printf("\r\n----高电平时间-%d-us----\r\n",high_time);							
		distant=(high_time*0.034)/2;  //单位cm
        printf("\r\n-检测距离为-%.2f-cm-\r\n",distant);          
		measure_Cnt = 0;  //清空标志位
        TIM2->CNT=0;     //清空计时器计数
		break;
				
	}
}


//===============================================us延时函数
    void delay_us(uint32_t us)//主频72M
{
    uint32_t delay = (HAL_RCC_GetHCLKFreq() / 4000000 * us);
    while (delay--)
	{
		;
	}
}

//===============================================中断回调函数
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)//
{
	
	if(TIM2 == htim->Instance)// 判断触发的中断的定时器为TIM2
	{
		switch(measure_Cnt){
			case 1:
				measure_Buf[0] = HAL_TIM_ReadCapturedValue(&htim2,TIM_CHANNEL_1);//获取当前的捕获值.
				__HAL_TIM_SET_CAPTUREPOLARITY(&htim2,TIM_CHANNEL_1,TIM_ICPOLARITY_FALLING);  //设置为下降沿捕获
				measure_Cnt++;                                            
				break;              
			case 2:
				measure_Buf[1] = HAL_TIM_ReadCapturedValue(&htim2,TIM_CHANNEL_1);//获取当前的捕获值.
				HAL_TIM_IC_Stop_IT(&htim2,TIM_CHANNEL_1); //停止捕获   或者: __HAL_TIM_DISABLE(&htim5);
				measure_Cnt++;  
                         
		}
	
	}
	
}

(5)usrat.c代码添加

/* USER CODE BEGIN 0 */
#include "stdio.h"
/* USER CODE END 0 */
 
 
 
/* USER CODE BEGIN 1 */
/*********************************************************
*
*重定义 fputc 函数
*
*********************************************************/
int fputc(int ch,FILE *f)
{
	HAL_UART_Transmit (&huart1 ,(uint8_t *)&ch,1,HAL_MAX_DELAY );
	return ch;
}
/* USER CODE END 1 */

(6)main函数

#include "SR04.h"


int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM2_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
      
      SR04_GetData(  );
      HAL_Delay(1500);
      
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */

6.接线图及效果

stm32f1 hal 超声波测距,STM32(HAL库)外设实战,嵌入式硬件,单片机,stm32

 

stm32f1 hal 超声波测距,STM32(HAL库)外设实战,嵌入式硬件,单片机,stm32

 10cm测距

stm32f1 hal 超声波测距,STM32(HAL库)外设实战,嵌入式硬件,单片机,stm32

stm32f1 hal 超声波测距,STM32(HAL库)外设实战,嵌入式硬件,单片机,stm32文章来源地址https://www.toymoban.com/news/detail-785711.html

本例程源码下载:点击跳转 

到了这里,关于STM32系列(HAL库)——F103C8T6通过HC-SR04超声波模块实现测距的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • stm32(F103c8t6)自学笔记@阿布君

    1.注意头文件和C文件的包含关系,C文件自身应包含自身的H头文件以及用到的外部头文件,而自身头文件只需包含头文件需要用到的资源文件即可。 参考文献:http://t.csdn.cn/o2GmL 注释: 红色 表示:与电源相关 蓝色 是最小系统相关的引脚 绿色 是IO口、功能口 S代表电源、I代表

    2024年02月03日
    浏览(22)
  • STM32 F103C8T6学习笔记7:双机无线串口通信

    今日尝试配通俩个C8T6单片机之间的无线串口通信,文章提供原理,源码,测试效果图,测试工程下载: 目录 传输不规范问题: 串口通信资源: 单个串口资源理解: 单片机串口资源: 测试目标与测试硬件连接: 串口初始化与串口中断接收逻辑: 串口初始化: 初步测试能否

    2024年02月09日
    浏览(20)
  • STM32 F103C8T6学习笔记12:红外遥控—红外解码-位带操作

    今日学习一下红外遥控的解码使用,红外遥控在日常生活必不可少,它的解码与使用也是学习单片机的一个小过程,我们将通过实践来实现它。 文章提供源码、测试工程下载、测试效果图。 目录 红外遥控原理:  红外遥控特点: 红外发射装置:  红外接收示意图:  NEC协议

    2024年02月11日
    浏览(15)
  • STM32CubeIDE + HAL + STM32f103C8T6 系列教程1 ---板载PC13LED闪烁

    之前的系列教程都是基于Arduino的,但是公司招聘51和stm32的开发还是多些,所以特别开了一个stm32的系列。 这个系列特点是注重了 Arduino 编程思维和习惯下向STM32开发的过渡 。前期没有涉及到太多寄存器相关的知识,利用HAL库和STM32CubeIDE快速入手STM32的数字输入/输出、模拟输

    2024年02月16日
    浏览(15)
  • STM32 F103C8T6学习笔记1:开发环境与原理图的熟悉

    作为一名大学生,学习单片机有一段时间了,也接触过嵌入式ARM的开发,但从未使用以及接触过STM32C8T6大开发使用,于是从今日开始,将学习使用它~ 本文介绍STM32C8T6最小系统开发环境搭建注意问题,STM32C8T6单片机资源介绍, 目录 开发环境与下载问题: 1.电脑上需要安装相应

    2024年02月14日
    浏览(15)
  • STM32 F103C8T6学习笔记3:串口配置—串口收发—自定义Printf函数

    今日学习使用STM32 C8T6的串口,我们在经过学习笔记2的总结归纳可知,STM32 C8T6最小系统板上有三路串口,如下图:  今日我们就着手学习如何配置开通这些串口进行收发,这里不讲串口通信概念与基础,可以自行网上查找,本文直接开始介绍库函数与编程实现:          

    2024年02月10日
    浏览(16)
  • STM32F103C8T6(HAL库)驱动舵机

    常见的舵机分为360°和180°两种,本次对180°舵机进行驱动,舵机驱动需要通过PWM信号进行驱动。本文通过定时器中的PWM信号设定使得SG90舵机进行不同角度的转动。 对于舵机的驱动,需要20ms的脉冲,高电平时间在0.5ms-2.5ms区间即可控制舵机在0-180°角度进行转动。常见角度对应

    2024年02月05日
    浏览(20)
  • STM32 F103C8T6学习笔记4:时钟树、滴答计时器、定时器定时中断

    今日理解一下STM32F103 C8T6的时钟与时钟系统、滴答计时器、定时器计时中断的配置,文章提供原理,代码,测试工程下载。 目录 时钟树与时钟系统: 滴答计时器: 定时器计时中断: 测试结果: 测试工程下载: 该系统介绍在 STM32F10x-中文参考手册 P56页开始 微控制器的时钟系

    2024年02月13日
    浏览(16)
  • STM32 F103C8T6学习笔记8:0.96寸单色OLED显示屏显示字符

    使用STM32F103 C8T6 驱动0.96寸单色OLED显示屏: OLED显示屏的驱动,在设计开发中OLED显示屏十分常见,因此今日学习一下。一篇文章从程序到显示都讲通。 文章提供源码、原理解释、测试工程下载,测试效果图展示。   目录 OLED驱动原理—IIC通信: SSD1306 单色 0.96 OLED 显示屏特性

    2024年02月12日
    浏览(18)
  • STM32F103C8T6(HAL库函数 - 内部Flash操作)

    STM32F103C8T6 内部Flash 为 64KB,本次将对他多余空间进行读写。 数据手册下载 STM32F103x8/STM32F103xB 数据手册 包含Flash Memory Page分布 STM32F设备命名 设备容量类型 中容量类型 内部空间介绍 Flash Memory 从 0x0800 0000 ~ 0x0801 FFFF 页分布1K每页, STM32F103C8T6 只有64KByte, 那就是64页 使用 controll

    2024年01月21日
    浏览(24)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包