STM32开发——感应垃圾桶(舵机、超声波测距、振动检测)

news2024/11/24 12:28:55

目录

1.项目需求

2.sg90舵机介绍及实战

3.声波测距

4.感应垃圾桶

4.1GPIO口设置

4.2代码实现


1.项目需求

  • 检测靠近时,垃圾桶自动开盖并伴随滴一声,2秒后关盖
  • 发生震动时,垃圾桶自动开盖并伴随滴一声,2秒后关盖
  • 按下按键时,垃圾桶自动开盖并伴随滴一声,2秒后关盖

2.sg90舵机介绍及实战

PWM波的频率不能太高,大约50HZ,即周期=1/频率=1/50=0.02s,20ms左右。

确定  定时时间=1/频率


其中:
Tclk:定时器的输入时钟频率(单位MHZ)
Tout:定时器溢出时间(单位为us)
.TIM_Period = arr; eg;4999
.TIM_Prescaler = psc; eg:7199
Tout = ((4999+1)×(7199+1))/72000000 = 0.5s = 500ms

如果周期为20ms,则 PSC=7199,ARR=199

角度控制

  • 0.5ms-------------0度; 2.5% 对应函数中CCRx为5
  • 1.0ms------------45度; 5.0% 对应函数中CCRx为10
  • 1.5ms------------90度; 7.5% 对应函数中CCRx为15
  • 2.0ms-----------135度; 10.0% 对应函数中CCRx为20
  • 2.5ms-----------180度; 12.5% 对应函数中CCRx为25

需求:
每隔1s,转动一个角度:0度 --> 45度 --> 90度 --> 135度 --> 180度 --> 0度

main函数代码

  while (1)
  {
    /* USER CODE END WHILE */
		__HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_3, 5);
		HAL_Delay(1000);
		__HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_3, 10);
		HAL_Delay(1000);
		__HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_3, 15);
		HAL_Delay(1000);
		__HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_3, 20);
		HAL_Delay(1000);
		__HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_3, 25);
		HAL_Delay(1000);
    /* USER CODE BEGIN 3 */
  }

记得在定时器初始化后产生PWM波

HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_3);  //放在在定时器初始化后

3.声波测距

  • 怎么让它发送波

Trig ,给Trig端口至少10us的高电平

  • 怎么知道它开始发了

Echo信号,由低电平跳转到高电平,表示开始发送波

  • 怎么知道接收了返回波

Echo,由高电平跳转回低电平,表示波回来了

  • 怎么算时间

Echo引脚维持高电平的时间!
波发出去的那一下,开始启动定时器
波回来的拿一下,我们开始停止定时器,计算出中间经过多少时间

  • 怎么算距离

距离 = 速度 (340m/s)* 时间/2

 需求:
使用超声波测距,当手离传感器距离小于5cm时,LED1点亮,否则保持不亮状态。

STM32中HAL库没有定时10us的函数,用定时器封装一个us的延时函数。

定时器配置:
使用 TIM2 ,只用作计数功能,不用作定时。
将 PSC 配置为71,则计数 1 次代表 1us 。

 编写微秒级函数:

//使用TIM2来做us级延时函数
void TIM2_Delay_us(uint16_t n_us)
{
/* 使能定时器2计数 */
__HAL_TIM_ENABLE(&htim2);
__HAL_TIM_SetCounter(&htim2, 0);
while(__HAL_TIM_GetCounter(&htim2) < ((1 * n_us)-1) );
/* 关闭定时器2计数 */
__HAL_TIM_DISABLE(&htim2);
}

编程思路

//1. Trig ,给Trig端口至少10us的高电平
//2. echo由低电平跳转到高电平,表示开始发送波
//波发出去的那一下,开始启动定时器
//3. 由高电平跳转回低电平,表示波回来了 //波回来的那一下,我们开始停止定时器
//4. 计算出中间经过多少时间
//5. 距离 = 速度 (340m/s)* 时间/2(计数1次表示1us)
//每500毫秒测试一次距离

计算距离的子函数

float sound_range(void)   //返回个距离?
{
	uint16_t cnt;
	//1. Trig ,给Trig端口至少10us的高电平
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_SET);
	delay_us(15);
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_RESET);
	//2. echo由低电平跳转到高电平,表示开始发送波
	//波发出去的那一下,开始启动定时器
	while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_7) == GPIO_PIN_RESET);	
	__HAL_TIM_SetCounter(&htim2,0);  //定时器计数记得复位  运行了,感觉要不要都可以
	HAL_TIM_Base_Start(&htim2);    //也可以用启动定时器函数__HAL_TIM_ENABLE(&htim2) 后面用disable
	
	//3. 由高电平跳转回低电平,表示波回来 //波回来的那一下,我们始停止定时器
	while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_7) == GPIO_PIN_SET);
	HAL_TIM_Base_Stop(&htim2);
	//4. 计算出中间经过多少时
	cnt=__HAL_TIM_GetCounter(&htim2);
	//5. 距离 = 速度 340m/s* 时间/2(计1次表1us
	return (340*cnt*0.000001/2*100);  //返回的是cm
	
}	

主函数的代码

float distance;

while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		distance=sound_range();      //获得距离
		if(distance<5)               //根据距离进行不同操作
			HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET);
		else
			HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);
		
		HAL_Delay(500);
  }

4.感应垃圾桶

项目需求:

  • 超声波感应到物体靠近,打开垃圾桶(蜂鸣器响一下)(舵机到一定角度)物体移开1s后关闭(蜂鸣器响一下)
  • 按键后打开垃圾桶(蜂鸣器响一下)(舵机到一定角度)2s后关闭(蜂鸣器响一下)
  • 震动后打开垃圾桶(蜂鸣器响一下)(舵机到一定角度)2s后关闭(蜂鸣器响一下)

超声波模块:  用定时器2
Trig      --    PB6    (发出10us低)
Echo    -- PB7    (低到高到低)
PA4用于超声波模块中断(低电平触发中断)
无限遥控按键(433M):(变为高电平)
D0(A按键)-- PA1(中断)
震动传感器:(发出低电平)
D0 -- PB5(中断)
VCC -- 5V


sg90舵机:  用定时器4
PWM -- PB9     (有效电平为高)
LED灯:(需要低电平)
LED1 -- PB8
蜂鸣器:(低电平响)
IO -- PB4
VCC -- 3V3

4.1GPIO口设置

4.2代码实现

 中断中使用延时函数(放在定时器初始化后)

HAL_NVIC_SetPriority(SysTick_IRQn,0,0);

定时器4初始化后产生PWM波(放在定时器初始化后)

HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_4); 

中断服务函数

void TIM2_Delay_us(uint16_t n_us)
{
/* 使能定时器2计数 */
__HAL_TIM_ENABLE(&htim2);
__HAL_TIM_SetCounter(&htim2, 0);
while(__HAL_TIM_GetCounter(&htim2) < ((1 * n_us)-1) );
/* 关闭定时器2计数 */
__HAL_TIM_DISABLE(&htim2);
}

float sound_range(void)   //返回个距离?
{
	uint16_t cnt;
	//1. Trig ,给Trig端口至少10us的高电平
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_SET);
	TIM2_Delay_us(15);
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_RESET);
	//2. echo由低电平跳转到高电平,表示开始发送波
	//波发出去的那一下,开始启动定时器
	while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_7) == GPIO_PIN_RESET);	
	__HAL_TIM_SetCounter(&htim2,0);  //定时器计数记得复位  运行了,感觉要不要都可以
	HAL_TIM_Base_Start(&htim2);    //也可以用启动定时器函数__HAL_TIM_ENABLE(&htim2) 后面用disable
	
	//3. 由高电平跳转回低电平,表示波回来 //波回来的那一下,我们始停止定时器
	while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_7) == GPIO_PIN_SET);
	HAL_TIM_Base_Stop(&htim2);
	//4. 计算出中间经过多少时
	cnt=__HAL_TIM_GetCounter(&htim2);
	//5. 距离 = 速度 340m/s* 时间/2(计1次表1us
	return (340*cnt*0.000001/2*100);  //返回的是cm
	
}	

//重写外部中断服务函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	switch(GPIO_Pin){
			
		case (GPIO_PIN_4): 
			HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET);
			HAL_Delay(500);
			HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);

			HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_RESET); //蜂鸣器响一声
			HAL_Delay(500);
			HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_SET); //蜂鸣器关
			__HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_4, 25);   //打开舵机90度
			HAL_Delay(2000);
			__HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_4, 5);   //关闭舵机0度
			break;
		case (GPIO_PIN_1): 
			HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET);
			HAL_Delay(500);
			HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);
			HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_RESET); //蜂鸣器响一声
			HAL_Delay(500);
			HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_SET); //蜂鸣器关
			__HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_4, 25);   //打开舵机90度
			HAL_Delay(2000);
			__HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_4, 5);   //关闭舵机0度
			break;	
		case (GPIO_PIN_5):   
			HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET);
			HAL_Delay(500);
			HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);
			HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_RESET); //蜂鸣器响一声
			HAL_Delay(500);
			HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_SET); //蜂鸣器关
			__HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_4, 25);   //打开舵机90度
			HAL_Delay(2000);
			__HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_4, 5);   //关闭舵机0度
			break;	
	}
}

main函数

float distance;

HAL_NVIC_SetPriority(SysTick_IRQn,0,0);

HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_4); 

while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		//1.距离小于5cm进入中断
		distance=sound_range();      //获得距离
		if(distance<5){               //如果距离小于5cm,拉低PA4进入中断
			HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);
			HAL_Delay(5);
			HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET);	
		}
		//2.无限遥控按键(433M):D0(A按键)-(PA1变为高电平)//- 进入中断
		//3.震动传感器:(发出低电平)---PB5变为低电平----进入中断

		//__HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_4, 25);   //关闭舵机0度
		HAL_Delay(500);
  }

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

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

相关文章

ChatGPT 使用 拓展资料:吴恩达大咖 Building Systems with the ChatGPT API 输出检查

ChatGPT 使用 拓展资料:吴恩达大咖 Building Systems with the ChatGPT API 输出检查 在本视频中,将重点检查系统生成的输出。在向用户展示输出之前检查输出对于确保质量非常重要,提供给他们的响应的相关性和安全性,或者使用自动化或学习如何使用Moderation API。 Moderati…

labview 多位组合成1个字、1个字拆成多位

如果你需要将多位组合成1个字&#xff0c;以及将1个字拆成多位&#xff0c;本文能给你帮助。 在文章最后有下载链接&#xff08;labview 2018平台写的&#xff09; 1.多个布尔量和数字的转换 1.1多个布尔量转换为数字 图1-前面板(多个布尔量转换为数字) …

阿里巴巴内网开源的SpringCloudAlibaba笔记,把微服务玩的出神入化

SpringCloud Alibaba 为什么会出现&#xff1f; Spring Cloud Netflix 项目进入维护模式&#xff0c;Spring Cloud Netflix 将不再开发新的组件&#xff0c;我们知道 Spring Cloud 版本迭代算是比较快的&#xff0c;因而出现了很多中岛的 ISSUE 都来不及 Fix 就又推另一个 Rel…

做开发5年,这8个高效开发好习惯我悟了

优秀的Web开发人员工作效率更高&#xff0c;因为他们拥有丰富的经验和良好的习惯。工作多年&#xff0c;我有一些自己了解的习惯分享给大家&#xff0c;都曾让我受益&#xff0c;做开发5年了&#xff0c;今天来跟大家分享一下我的感想。✍&#x1f3fb; 首先&#xff0c;很多人…

CTFHub | php://input

0x00 前言 CTFHub 专注网络安全、信息安全、白帽子技术的在线学习&#xff0c;实训平台。提供优质的赛事及学习服务&#xff0c;拥有完善的题目环境及配套 writeup &#xff0c;降低 CTF 学习入门门槛&#xff0c;快速帮助选手成长&#xff0c;跟随主流比赛潮流。 0x01 题目描述…

Goby 漏洞更新|用友GRP-U8 软件 U8AppProxy 任意文件上传漏洞

漏洞名称&#xff1a;用友GRP-U8 软件 U8AppProxy 任意文件上传漏洞 English Name&#xff1a;yongyou GRP-U8 U8AppProxy Arbitrary file upload vulnerability CVSS core: 9.0 影响资产数&#xff1a;1308 漏洞描述&#xff1a; 用友GRP-U8管理软件是用友公司专注于国家…

上海性能测试平均年薪30W+,5分钟看明白你和30W的差距在哪?

性能测试是测试行业中颇具技术含量的工作&#xff0c;不仅要求工程师对系统进行一系列复杂的需求分析&#xff0c;制定完善的测试计划&#xff0c;设计出贴近实际用户使用场景的测试用例&#xff0c;还要把握系统性能变化趋势&#xff0c;给出专业的优化建议&#xff0c;帮助开…

Linux防火墙学习笔记4

iptables表的概念&#xff1a; 每个规则链上都设置了一串规则&#xff0c;我们就可以把不同的规则链组合成能够完成某一个特定功集合分类&#xff0c;而这个集合分类我们就称为表&#xff0c;iptables中共有5张表&#xff0c;学习iptables就是要搞明白每种表的作用。 filter&…

【C++初阶】初识模板

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前学习C和算法 ✈️专栏&#xff1a;C航路 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac; 点赞&#x1…

vue-router的实现原理hash/history、导航守卫、导航解析流程

文章目录 一、SPA与前端路由二、vue-router实现原理&#xff08;模式&#xff09;hash模式history模式 三、vue-router中的route和router四、vue-router有哪几种导航守卫全局守卫路由独享的守卫路由组件内的守卫 vue-router完整的导航解析流程 一、SPA与前端路由 前端路由本质是…

3年经验面试20K+测试岗,看到这样的面试题我懵了....

我要跳槽&#xff01;我是着急忙慌的准备简历——3年软件测试经验&#xff0c;可独立测试大型产品项目&#xff0c;熟悉项目测试流程...薪资要求&#xff1f;3年测试经验起码能要个20K吧 我加班肝了一页半简历&#xff0c;投出去一周&#xff0c;面试电话倒是不少&#xff0c;…

【Web服务应用】Tomcat部署与优化

Tomcat部署 一、Tomcat简介二、tomcat组件2.1核心组件2.2Tomcat功能组件2.3Tomcat 请求过程 三、部署Tomcat服务3.1Tomcat虚拟主机配置 四、Tomcat多实例部署五、tomcat优化5.1tomcat服务优化5.2JVM的优化5.3内核的优化 一、Tomcat简介 一款 java 开发的开源的 Web 应用服务程序…

8.面向对象编程(中级部分)|Java学习笔记

文章目录 IDEA介绍包注意事项和使用细节包的三大作用包的本质分析&#xff08;原理&#xff09; 访问修饰符面向对象编程三大特征封装封装的理解和好处封装的实现步骤&#xff08;三步&#xff09; 继承继承的深入讨论/细节问题继承的本质分析super关键字super 给编程带来的便利…

是德E3648A 双路输出电源技术参数

是德基础直流电源具备所需的各种基本特性&#xff0c;适用于预算紧张的用户。E3640系列30-100W GPIB单路和双路输出电源外形小巧&#xff0c;适合作为台式和系统电源使用。它的输出纹波和噪声较低&#xff0c;并内置测量和基本可编程功能。Keysight E3648A 90W多路输出电源是一…

和鲸社区数据分析每周挑战【第九十二期:学生成绩影响因素分析】

和鲸社区数据分析每周挑战【第九十二期&#xff1a;学生成绩影响因素分析】 文章目录 和鲸社区数据分析每周挑战【第九十二期&#xff1a;学生成绩影响因素分析】一、前言二、数据读取和初步探索三、数据预处理1、处理缺失值2、类别变量转换 四、学业表现可视化1、绘制数学成绩…

探究Vue源码:mustache模板引擎(1) 什么是模板引擎

之前在讲虚拟dom和diff算法时说过后续会讲模板引擎 啊 那这边 说到做到哈 对这个问题 有个比较官方的回答 模板引擎是将数据变为视图的最优雅的解决方案 比如 将左侧数据变为右侧视图 大家应该最先想到的就是 v-for 其实 v-for 就是一种模板引擎语法 从图中看出 模板引擎处理…

Linux文件理解和系统调用

本文已收录至《Linux知识与编程》专栏&#xff01; 作者&#xff1a;ARMCSKGT 演示环境&#xff1a;CentOS 7 文件理解和系统调用 前言正文文件概念文件描述符文件描述符概念文件管理关于 files_struct文件描述符的分配一切皆文件思想 C语言文件操作文件的打开与关闭文件读写 文…

IMX6ULL裸机篇之SPI原理图

一. IMX6ULL的 SPI 实验 I.MX6ULL 有4 个 SPI 接口&#xff0c;可以通过这 4 个 SPI 接口来连接一些 SPI 外设。 I.MX6U-ALPHA 使用 SPI3 接口 连接了一个六轴传感器 ICM-20608 &#xff0c;本章我们就来学习如何使用 I.MX6U 的 SPI 接口来驱动 ICM-20608…

【vue3】09-vue组件化额外知识补充(上)-生命周期-ref引用

组件化-额外知识补充&#xff08;上&#xff09; 生命周期认识生命周期生命周期函数的演练 refs引用 生命周期 认识生命周期 什么是生命周期呢? 生物学上&#xff0c;生物生命周期指得是一个生物体在生命开始到结束周而复始所历经的一系列变化过程;每个组件都可能会经历从创…

适应新时代的FTP已经出现?这种产品有何过人之处?

大家都知道&#xff0c;FTP是用于在网络上进行文件传输的一套标准协议&#xff0c;它作为互联网最经典的协议之一&#xff0c;至今已经存在了50年。而随着时代发展&#xff0c;越来越多的用户与企业开始觉得FTP不够满足大家的需求&#xff0c;出现的问题与漏洞越来越多&#xf…