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,一经查实,立即删除!

相关文章

js json转xml(可自定义属性,区分大小写)

直接上代码~ 在网上找了很多例子&#xff0c;大多数不适用&#xff0c;而且麻烦&#xff0c;自己进行了一些调整&#xff0c;完成了一个可以区分大小写的json转xml的小功能~ 功能实现js&#xff1a; function CreatXmlDoc(obj){this.tagNameobj.tagName;this.properties obj.p…

mysql安装主从配置_MySQL安装与主从配置

我是ssh远程 配置的&#xff1b;略微有些不同&#xff0c;大家自己斟酌。1.安装MySQLsudo yum install mysql mysql-server sudo chgrp -R mysql /var/我是ssh远程 配置的&#xff1b;略微有些不同&#xff0c;大家自己斟酌。1.安装MySQLsudo yum install mysql mysql-serversu…

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.…

CTR点击率简介

点击率 简介 在搜索引擎(百度、谷歌)中输入关键词后进行搜索&#xff0c;然后按竞价等因素把相关的网页按顺序进行排列出来&#xff0c;然后用户会选择自己感兴趣的网站点击进去&#xff1b;把一个网站所有搜索出来的次数作为总次数&#xff0c;把用户点击并进入网站的次数占总…

算法第三章作业

算法第三章作业 1.对动态规划算法的理解 求解的方式有两种&#xff1a;①自顶向下的备忘录法 ②自底向上。 动态规划是运筹学中用于求解决策过程中的最优化数学方法。 动态规划最重要的是子问题的求解&#xff0c;在求解任一子问题时&#xff0c;列出各种可能的局部解&#xf…

python中的命名空间指什么_13.Python中的命名空间是什么

Python中的命名空间是什么&#xff1f;In Python&#xff0c;every name introduced has a place where it lives and can be hooked for.This is known as namespace. It is like a box where a variable name is mapped to the object placed.Whenever the variable is searc…

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总线物理层…

mysql语句笔记

1、mysql多重查询select * from a_table ORDER BY b,c asc limit 1, 10;(对表a_table中的字段b降序排列&#xff0c;得到的结果再按字段c降序排列&#xff0c;最后取前10条数据)转载于:https://blog.51cto.com/jemary/1303093

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

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

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

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

mysql创建新表失败_麻烦给我看一下为什么MySQL创建表格失败嘛

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼改为$conmysql_connect(localhost,root,);if(!$con)die(连接数据库失败);mysql_select_db(comment_db,$con);$mysql_sql"create table comment_tab(id mediumint unsigned NOT NULL auto_increment,nickname char(16) NOT NUL…

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

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

洛谷 题解 P2312 【解方程】

Problem P2312 【解方程】 >>> record 用时&#xff1a; 1166ms空间&#xff1a; 780KB(0.76MB)代码长度&#xff1a; 2.95KB提交记录&#xff1a; R9909587 >>>注&#xff1a; 使用了 o1 优化o2 优化o3 优化快读快输 >>>Solution 30 pts 枚举&…

python列表遍历 空列表_Python list列表执行reversed()后执行pop()返回迭代对象遍历为空问题...

1、示例代码1)一般情况s [1,2,3]t reversed(s)for i in t:print(i)# 输出: 3,2,12) 执行pop()s [1,2,3]t reversed(s)s.pop()for i in t:print(i)# 期望输出 : 2, 1# 实际什么都没输出:2、问题原因及示例代码返回的迭代器本质上需要知道最后一个索引的位置和列表的长度。如…

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

C语言面试高频问题:自己代码实现字符串相关的常用API

参考&#xff1a;C语言面试高频问题&#xff1a;自己代码实现字符串相关的常用API 作者&#xff1a;图触靓 发布时间&#xff1a; 2020-08-08 13:31:33 网址&#xff1a;https://blog.csdn.net/bhbhhyg/article/details/107878102 目录1、实现get(char *)&#xff1b;从键盘获取…

Python时间复杂度计算题答案

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

【性能优化】优化笔记之一:图像RGB与YUV转换优化

本文主要介绍如何优化您自己的CODE&#xff0c;实现软件的加速。我们一个图象模式识别的项目&#xff0c;需要将RGB格式的彩色图像先转换成黑白图像。图像转换的公式如下&#xff1a; Y 0.299 * R 0.587 * G 0.114 * B 图像尺寸640*480*24bit&#xff0c;RGB图像已经按照RGB…