STM32超声波模块测距串口输出/通用定时器中断并输出PWM控制舵机/系统定时器延时

参考:stm32 超声波模块 原理 实现测距 +舵机使用
作者:点灯小哥
发布时间: 2021-03-10 19:37:16
网址:https://blog.csdn.net/weixin_46016743/article/details/114643703

目录

  • 效果展示
  • 超声波传感器原理
  • 超声波测距编程步骤
  • 代码编写

效果展示

在这里插入图片描述

超声波传感器原理

在这里插入图片描述
在这里插入图片描述

超声波测距编程步骤

要配置三个结构体
在这里插入图片描述

接线

  • Trig:PB11
  • Echo:PB10
  • PB5:连接舵机

代码编写

HC_SR04.h

#ifndef _HC_SR04_H //#ifndef #define #endif  条件编译   为了防止重复编译 
#define _HC_SR04_H
#include "stm32f10x.h"     // Device headervoid HC_SR04(void);
void Open_tim4(void);
void Close_tim4(void);
int  GetEcho_time(void);
float GetLength(void);//ECHO读取
#define ECHO_Reci    	GPIO_ReadInputDataBit( GPIOB, GPIO_Pin_10)
//Trig发送
#define TRIG_Send(a)    if(a) \//与下一行连接起来GPIO_SetBits(GPIOB, GPIO_Pin_11); \else \GPIO_ResetBits(GPIOB, GPIO_Pin_11) 
#endif

超声波HC_SR04.c

#include "stm32f10x.h"                  // Device header
#include "HC_SR04.h"
#include "SysTick.h"extern uint16_t mscount = 0;   //extern 让main函数也能使用这里这个void HC_SR04(void)
{GPIO_InitTypeDef GPIO_HC_SR04init;       //1.配置GPIO引脚结构体 Trig PB11 Echo PB10TIM_TimeBaseInitTypeDef TIM_HC_SR04init; //2.配置定时器结构体NVIC_InitTypeDef NVIC_HC_SR04init;       //3.配置NVIC中断控制器结构体(TIM4定时器)NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//中断组1//rcc.hRCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//4.开启GPIOB时钟(在APB2总线上)RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);//定时器的时钟//Trig PB11  发送GPIO_HC_SR04init.GPIO_Mode  = GPIO_Mode_Out_PP; //推挽输出GPIO_HC_SR04init.GPIO_Pin   = GPIO_Pin_11;	GPIO_HC_SR04init.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init( GPIOB, &GPIO_HC_SR04init );//Echo PB10  接收GPIO_HC_SR04init.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入  只要求高电平 高低电平直接检测GPIO_HC_SR04init.GPIO_Pin  = GPIO_Pin_10;GPIO_Init( GPIOB, &GPIO_HC_SR04init );//定时器4的配置TIM_HC_SR04init.TIM_ClockDivision  = TIM_CKD_DIV1;//分频系数1 不分频 还是72MHzTIM_HC_SR04init.TIM_CounterMode    = TIM_CounterMode_Up;//向上计数TIM_HC_SR04init.TIM_Period         = 100 - 1 ; //1usTIM_HC_SR04init.TIM_Prescaler      = 72 - 1 ;  //72M   这两个相乘7200/72 000 000 = 1usTIM_TimeBaseInit( TIM4, &TIM_HC_SR04init);TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);//IT就是中断 定时器中断配置  中断标志:TIM_IT_Update是允许溢出/更新标志位TIM_Cmd( TIM4, DISABLE );  //定时器先关闭  等测量距离时再打开  下面给出打开定时器函数//NVIC中断控制器(TIM4定时器)NVIC_HC_SR04init.NVIC_IRQChannel = TIM4_IRQn;// 通道 中断源是定时器4NVIC_HC_SR04init.NVIC_IRQChannelPreemptionPriority = 0;//抢占优先级 给的最高的NVIC_HC_SR04init.NVIC_IRQChannelSubPriority = 0;//子优先级NVIC_HC_SR04init.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_HC_SR04init); 	
}
//打开定时器4
void Open_tim4(void)	
{TIM_SetCounter( TIM4,  0);//开启计数器计数  计数值从0开始mscount = 0;             //需要计算高电平5次数值 取平均值  防止一次算的距离不精准TIM_Cmd( TIM4, ENABLE );  //定时器使能 打开了 
}//关闭定时器4
void Close_tim4(void)
{TIM_Cmd( TIM4, DISABLE );  //关闭
}//定时器TIM4中断服务函数  函数名不能改动
void TIM4_IRQHandler(void)
{if ( TIM_GetITStatus(TIM4,  TIM_IT_Update) != RESET)     //判断是否发生中断{TIM_ClearITPendingBit(TIM4, TIM_IT_Update);   //清除中断的标记位mscount++; //记录发生的中断次数 为了取5次测量计算提高精度//定时器中断一次就是1us	 } 
}//获取定时器计数器的值   得到Echo高电平的时间
int GetEcho_time(void)
{uint32_t t = 0;t = mscount * 1000;   //发生了多少次中断 *1000  得到时间ms(一次中断就是1us)t += TIM_GetCounter(TIM4);//获取定时器计数值     {这两行没看懂 感觉重复了?}TIM4->CNT = 0;//代表向上增的寄存器(向上向下计数 前面章节有讲) 要置零 重装载ms_delay(50);//系统定时器延时return t; 
}//获取超声波测距距离
float GetLength(void)
{int i = 0;uint16_t t = 0;float length = 0;float sum = 0;while(i != 5)//算5次 提高计算精度{TRIG_Send(1);us_delay(20);//硬件模块要求发送高电平时间大于10usTRIG_Send(0);//此时超声波开始工作了while(ECHO_Reci == 0);Open_tim4();i=i+1;while(ECHO_Reci == 1);Close_tim4();t = GetEcho_time();//计算ECHO高电平持续时间就能换算出距离length =((float) t / 58.0);sum = sum +length;		}length = sum / 5.0;return length; 
}

main.c

#include "stm32f10x.h"                  // Device header
#include "usart.h"
#include "led.h"
#include "tim.h"
#include "motor.h"
#include "SysTick.h"
#include "HC_SR04.h"//记得添加路径void delay(uint16_t time)
{uint16_t i = 0;while(time--){i=12000;while(i--);}
}int main(void)
{int pwmval = 195;float Length = 0;HC_SR04();Usart_Init();motor_config();while(1){int pwmval = 155;Length = GetLength();printf("%.3f\r\n",Length);//之前重定向print函数  串口打印输出距离 串口小助手就能看到打印的距离了ms_delay(500);//再加一个距离判断  将之前写的舵机部分加进来即可控制舵机if(Length < 5){for(pwmval = 195; pwmval >= 155;pwmval -=15 )//逐步转到位置{TIM_SetCompare2( TIM3,  pwmval);  //5. 配置PWM比较值 配合重装载值生成占空比delay(1000)}}else if (Length > 5){TIM_SetCompare2( TIM3,  pwmval-20);  //让舵机回去}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/265578.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32F103五分钟入门系列(二)GPIO的七大寄存器+GPIOx_LCKR作用和配置

摘自&#xff1a;STM32F103五分钟入门系列&#xff08;二&#xff09;GPIO的七大寄存器GPIOx_LCKR作用和配置 作者&#xff1a;自信且爱笑‘ 发布时间&#xff1a; 2021-05-01 12:08:32 网址&#xff1a;https://blog.csdn.net/Curnane0_0/article/details/116276876?spm1001.…

STM32使用IIC总线通讯协议在OLED屏幕上显示字符串、汉字、图像(硬件IIC)

参考&#xff1a;基于STM32-Oled&#xff08;IIC&#xff09;的使用 作者&#xff1a;奋斗的小殷 发布时间&#xff1a; 2021-05-07 13:09:26 网址&#xff1a;https://blog.csdn.net/boybs/article/details/116465668 目录IIC总线简介IIC协议简介IIC总线系统结构IIC总线物理层…

推送公司今日菜单内容到手机

此文已由作者张耕源授权网易云社区发布。欢迎访问网易云社区&#xff0c;了解更多网易技术产品运营经验。自从公司的易信公众服务号有了查询今日菜单的功能&#xff0c;自己慢慢养成了每次去吃饭前查一 下各个窗口的菜谱&#xff0c;再决定去哪吃饭的习惯。不过这个功能使用的越…

Android开发中如何创建自定义对话框

背景&#xff1a; 无论是Android&#xff0c;还是其他什么平台&#xff0c;对话框的主要形式都是弹出&#xff0c;或者我们可以说是一个在当前活动中打开的提示&#xff0c;来执行一些操作或实现一些功能。 你可以用一个对话框来问用户以确认一个行动&#xff0c;向用户通告一个…

树莓派接入公网(花生壳)

参考&#xff1a;树莓派接入公网 作者&#xff1a;图触靓 发布时间&#xff1a; 2020-12-22 17:28:19 网址&#xff1a;https://blog.csdn.net/bhbhhyg/article/details/107994829 目录为什么要接入公网接入公网的方法&#xff08;花生壳&#xff09;1、下载工具huashenke2、安…

cant find module express

安装express成功&#xff0c;测试一个应用如下&#xff1a;但是&#xff0c;运行却报错&#xff0c;如下图&#xff1a;说是express找不到&#xff0c;不应该啊&#xff01;命令都能用啊&#xff01;表面的原因是因为我install express用的是-g。参考链接如下&#xff1a;http:…

Linux虚拟机sqlite数据库安装教程、命令实现sqlite

参考&#xff1a;Linux虚拟机sqlite数据库安装教程 作者&#xff1a;图触靓 发布时间&#xff1a; 2021-04-08 19:07:56 网址&#xff1a;https://blog.csdn.net/bhbhhyg/article/details/115528254 一、在官网下载压缩包到window里面 SQLite官网下载地址 如图我们下载sqlite-a…

SecureCRT 使用 rz命令提示waiting to receive.**B0100000023be50

SecureCRT 远程连接Linux服务器&#xff0c;使用 rz命令提示waiting to receive.**B0100000023be50&#xff0c;或者使用sz命令提示&#xff1a; **B0100000023be50 解决方法设置如下&#xff1a; 转载于:https://www.cnblogs.com/pandaly/p/9898173.html

Python时间复杂度计算题答案

评论 题目链接 https://blog.csdn.net/qq_33254766/article/details/132255078 答案 时间复杂度&#xff1a;O(n)。 分析&#xff1a;这段代码遍历了n次&#xff0c;所以时间复杂度是线性的&#xff0c;即O(n)。 时间复杂度&#xff1a;O(n^2)。 分析&#xff1a;两个嵌套的…

wxpython使用方法_python图形界面开发之wxPython树控件使用方法详解

wxPython树控件介绍树(tree)是一种通过层次结构展示信息的控件&#xff0c;如下图所示是树控件示例&#xff0c;左窗口中是树控件&#xff0c;在wxPython中树控件类是wx.TreeCtrl。wx.TreeCtrl常用的方法有AddRoot(text, image-1, selImage-1, dataNone)。添加根节点&#xff0…

DSP_SCI

F2833x Serial Communication Interface 簡介 串行通信接口&#xff08;SCI&#xff09;模塊是一個串行I / O端口&#xff0c;允許F2833x與其他外圍設備之間的異步通信。 它通常被稱為UART&#xff08;通用異步接收器發送器&#xff09;&#xff0c;通常根據RS232標準使用。 SC…

如何让自己的写的程序在阿里云一直运行

参考&#xff1a;如何让自己的写的程序在阿里云一直运行 作者&#xff1a;图触靓 发布时间&#xff1a; 2020-08-02 11:53:28 网址&#xff1a;https://blog.csdn.net/bhbhhyg/article/details/107742311 目录1、下载screen&#xff1a;2、运行screen&#xff0c;创建一个scree…

C程序设计语言--第五章:指针与数组

为什么80%的码农都做不了架构师&#xff1f;>>> 指针是一种保存变量地址的变量. 5.1 指针与地址 通常的机器都有一系列连续编号或编址的存储单元,这些存储单元可以单个进行操纵,也可以连续成组的方式操纵.指针是能够存放一个地址的一组存储单元(通常是两个或四个…

java list 自定义类型转换_使用Java Stream API将List按自定义分组规则转换成Map的一个例子...

本文完整测试代码见文末。测试数据是List里的4个员工对象实例&#xff1a;根据员工所在的城市进行分组&#xff1a;结果分成了三组&#xff1a;第一组的员工在上海&#xff1a;第二组的员工在成都&#xff1a;统计每组员工个数&#xff1a;把员工进行分组&#xff0c;得分大于1…

安卓app与阿里云服务器的无线通信(非局域网)

参考&#xff1a;安卓app与阿里云服务器的无线通信&#xff08;非局域网&#xff09; 作者&#xff1a;图触靓 发布时间&#xff1a; 2020-08-01 16:13:14 网址&#xff1a;https://blog.csdn.net/bhbhhyg/article/details/107732156 目录写在阿里云里面的服务器代码&#xff1…

10.继承和派生

2019独角兽企业重金招聘Python工程师标准>>> 类成员访问权限&#xff1a; 成员访问权限&#xff1a;私有成员&#xff1a;只能被类自身的成员和友元访问&#xff1b; 公有成员&#xff1a;可以被任何普通函数和任何类的成员函数或子类访问&#xff1b; 保护成员&a…

树莓派与阿里云服务器之间的无线通信(非局域网)

参考&#xff1a;Linux虚拟机sqlite数据库安装教程 作者&#xff1a;图触靓 发布时间&#xff1a; 2020-08-01 15:45:026 网址&#xff1a;https://blog.csdn.net/bhbhhyg/article/details/107731166 购买服务器后。我们可以点击控制台&#xff0c;找到实例列表&#xff0c;点击…

业余剪辑——从拍摄到剪辑到加字幕

工作需要帮公司做一个公司的宣传片&#xff0c;要求不是很高所以就让我这个半吊子“设计”来做视频了。。。 以下设备和软件的使用只是我个人本次的使用的记录&#xff0c;大家按需使用即可 一、拍摄 设备&#xff1a;手机 软件&#xff1a;剪辑大师app&#xff08;应用商店下载…

树莓派作为客户端与WemosD1作为服务器的无线通信(局域网通信)

参考&#xff1a;树莓派作为客户端与WemosD1作为服务器的无线通信&#xff08;局域网通信&#xff09; 作者&#xff1a;图触靓 发布时间&#xff1a; 2020-07-26 21:50:39 网址&#xff1a;https://blog.csdn.net/bhbhhyg/article/details/107599915 目录wemos版作为服务端代码…