基于freeRTOS的垃圾桶(cubeMX)

news2025/2/27 1:57:22

前言:最近学习了freertos的任务、队列、互斥量、任务标志位等理论知识,看着都会就怕一练就废,于是打算做些项目巩固一下,加深一下对freertos知识的理解。

一、项目介绍

项目简单需求:

检测靠近时,垃圾桶自动开盖,2秒后关盖

发生震动时,垃圾桶自动开盖,2秒后关盖

这里可加入蜂鸣器、按键等简单gpio口的运用,大家可以根据需求自行加入。

二、工程配置

时钟配置(我这里选择的72M时钟频率,如果选择其他频率可能会导致PWM波不一致,从而出不来效果)

 

1、在freertos创建任务

2、配置引脚

超声波引脚 Echo----PA4                  Trig-----PA5

震动传感器 D0-------PA6

舵机数据线-------------PB8(定时器4第三通道PWM)可自行修改其他通道,支持PWM即可。 

 

3、定时器的设置

定时器3(用做计数器,主要用于超声波测距的来回定时) 

定时器4(主要用于舵机的PWM占空比的控制,PB8为定时器4的第三通道,具体可以查看stm32F103C8T6的数据手册)

 

PSC为分频系数,ARR为自动重装值。TCLK为时钟频率,上面设置为72M(注意,这里设置其他频率可能效果出现不了,本人在这里踩坑了。) 

4、串口(主要用于调试)

 三、代码实现

freertos.c

void StartHcsrTask(void const * argument)
{
  /* USER CODE BEGIN StartHcsrTask */
	int cnt;
	float distance;//超声波距离
	GPIO_PinState sw180State;//震动传感器状态
	
  /* Infinite loop */
	
  for(;;)
  {
		
		//初始化超声波模块
		initHcsr();
		//计算出中间经过多少时间
	  cnt = __HAL_TIM_GetCounter(&htim3);
		// 距离 = 速度 (340m/s)* 时间/2(计数1次表示1us)
		distance = cnt/58; //单位:cm
		//振动传感器的引脚状态
		sw180State = readVibrationSensor();
		//串口打印测距距离
		printf("%f",distance);
		printf("cm\r\n");
		
		//如何检测的距离低于5cm,或者发生震动,进行开盖,否则关盖。
		
		if((distance < 8) || (sw180State == GPIO_PIN_RESET)){
				openLid();//开盖
			}else{
				closeLid();//关盖
		}
			
		osDelay(100);
  }
  /* USER CODE END StartHcsrTask */
}

超声波

//使用TIM3来做us级延时函数

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

//初始化超声波模块
void initHcsr(void )
{
	
	//1. Trig ,给Trig端口至少10us的高电平
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);//拉高
	TIM3_Delay_us(20);
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);//拉低
	//2. echo由低电平跳转到高电平,表示开始发送波
	//波发出去的那一下,开始启动定时器
	while(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_5) == GPIO_PIN_RESET);//等待输入电平拉高
	HAL_TIM_Base_Start(&htim3);
	__HAL_TIM_SetCounter(&htim3,0);
	//3. 由高电平跳转回低电平,表示波回来了
	while(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_5) == GPIO_PIN_SET);//等待输入电平变低
	//波回来的那一下,我们开始停止定时器
	HAL_TIM_Base_Stop(&htim3);
	
}

舵机部分

void openLid(void )//开盖
{
	if(flag == CLOSE){
		flag = OPEN;
		__HAL_TIM_SetCompare(&htim4,TIM_CHANNEL_3,15);//90度
		osDelay(2000);	
	}
}
void closeLid(void )//关盖
{
	__HAL_TIM_SetCompare(&htim4,TIM_CHANNEL_3,5);//0度
	flag = CLOSE;//标志位设置为关闭
	osDelay(150);
}

震动传感器

//读取震动传感器的状态
GPIO_PinState readVibrationSensor() {
    return HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_6);
}

 

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

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

相关文章

APUE学习62章终端(二): stty命令特殊字符终端标志

1. stty命令 stty命令的英文解释: 很明显stty有一个-F参数 所以准确的说: stty命令是设置当前终端驱动程序(也有可能直接配置了硬件&#xff0c;这点目前不清楚)的属性&#xff0c;使当前终端的驱动程序能够使能/去使能一些特殊字符的识别与处理等等 2. stty命令的结构 3. 终端…

Python web实战之 Django 的 ORM 框架详解

本文关键词&#xff1a;Python、Django、ORM。 概要 在 Python Web 开发中&#xff0c;ORM&#xff08;Object-Relational Mapping&#xff0c;对象关系映射&#xff09;是一个非常重要的概念。ORM 框架可以让我们不用编写 SQL 语句&#xff0c;就能够使用对象的方式来操作数据…

总结946

6:40起床 7&#xff1a;15~8:00早读&#xff0c;07年tex1,2 8:10~10:12 880第二章选填&#xff0c;题目有些综合&#xff0c;错的有些多呀&#xff0c;不要紧&#xff0c;拿下它&#xff0c;就有进步了。 10:28~11:27重做强化18讲6道题 12&#xff1a;10~2:15吃饭睡觉&…

MySQL 三大日志日志:undo log、redo log、binlog

目录 一条SQL的执行流程 为什么需要 undo log&#xff1f; undo log 是如何刷盘&#xff08;持久化到磁盘&#xff09;的&#xff1f; 为什么需要 Buffer Pool&#xff1f; Buffer Pool 缓存什么&#xff1f; Undo 页是记录什么&#xff1f; 查询一条记录&#xff0c;就只需…

代码随想录算法训练营第三十二天 | Leetcode随机抽题检测

Leetcode随机抽题检测 46 全排列未看解答自己编写的青春版重点题解的代码日后复习重新编写 78 子集未看解答自己编写的青春版重点题解的代码日后复习重新编写 17 电话号码的字母组合未看解答自己编写的青春版重点题解的代码日后复习重新编写 39 组合总和未看解答自己编写的青春…

SpringBoot项目增加logback日志文件

一、简介 在开发和调试过程中&#xff0c;日志是一项非常重要的工具。它不仅可以帮助我们快速定位和解决问题&#xff0c;还可以记录和监控系统的运行状态。Spring Boot默认提供了一套简单易用且功能强大的日志框架logback&#xff0c;本文将介绍如何在Spring Boot项目中配置和…

使用AIGC工具提升安全工作效率

新钛云服已累计为您分享760篇技术干货 在日常工作中&#xff0c;安全人员可能会涉及各种各样的安全任务&#xff0c;包括但不限于&#xff1a; 开发某些安全工具的插件&#xff0c;满足自己特定的安全需求&#xff1b;自定义github搜索工具&#xff0c;快速查找所需的安全资料、…

HTML基础介绍2

表单格式化 ctrld&#xff1a;复制选中行数的所有代码 ctrlx&#xff1a;删除代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>表单综合案例</title> </head> <body> <!--…

(AcWing)01背包问题

有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。 第 ii 件物品的体积是 vi&#xff0c;价值是 wi。 求解将哪些物品装入背包&#xff0c;可使这些物品的总体积不超过背包容量&#xff0c;且总价值最大。 输出最大价值。 输入格式 第一行两个整数N&#xff0c;V&…

0基础学习VR全景平台篇 第76篇:全景相机-圆周率全景相机如何直播推流

圆周率科技&#xff0c;成立于2012年&#xff0c;是中国最早投身嵌入式全景算法研发的团队之一&#xff0c;亦是全球市场占有率最大的全景算法供应商。相继推出一体化智能屏、支持一键高清全景直播的智慧全景相机--Pilot Era和Pilot One&#xff0c;为用户带来实时畅享8K的高清…

【AGI】世界首次实现室温超导LK-99

论文&#xff1a;The First Room-Temperature Ambient-Pressure Superconductor GPT论文总结&#xff1a; 根据所提供的信息&#xff0c;这篇论文报道了一种在室温和常压下工作的室温超导体LK-99。LK-99的超导性是通过微小的结构畸变引起的&#xff0c;而不是通过温度和压力等外…

快速部署外卖系统:利用现代工具简化开发流程

在竞争激烈的外卖市场中&#xff0c;快速部署高效稳定的外卖系统是餐饮企业成功的关键之一。本文将介绍如何利用现代工具简化外卖系统的开发流程&#xff0c;并附带代码示例&#xff0c;帮助开发者快速搭建功能完备、用户友好的外卖平台。 1. 简介 在外卖业务快速增长的背景…

c++编写坦克大战(同年回忆)全网最全的讲解

c编写坦克大战 项目前言 需要熟练的掌握c语言&#xff0c;c。熟练掌握各种数据类型和数据结构。拥有优秀的文档阅读能力&#xff08;设计EasyX图形库的使用&#xff09;&#xff0c;拥有一个漂亮温柔的女朋友。 环境准备 我这里使用的是VS2022,还需要安装EasX图形库。安装教程…

C算法——生成牌 洗牌算法

生成牌 // // Created by Lenovo on 2022-06-11-下午 3:15. // 作者&#xff1a;小象 // 版本&#xff1a;1.0 //#include <stdio.h> #include <time.h> #include <stdlib.h>#define M 1 // 基数 #define N 20 // 洗牌次数 #define TOTAL_NUMS (N - M 1) …

uniapp运行项目到iOS基座

2022年9月&#xff0c;因收到苹果公司警告&#xff0c;目前开发者已无法在iOS真机设备使用未签名的标准基座&#xff0c;所以现在要运行到 IOS &#xff0c;也需要进行签名。 Windows系统&#xff0c;HBuilderX 3.6.20以下版本&#xff0c;无法像MacOSX那样对标准基座进行签名…

c++基于游戏壳的飞机大战游戏----开发(第二部分)

c基于游戏壳的飞机大战游戏----开发&#xff08;第二部分&#xff09; 一.我们先将每个功能按文件夹进行分类&#xff08;这样便于管理&#xff09; 如下 每一个文件里都写出相应的头文件与源文件&#xff08;GameFrame文件夹中的内容是上一篇博客中写好的游戏壳代码&#xf…

【汇总】解决Ajax请求后端接口,返回ModelAndView页面不跳转

【汇总】解决Ajax请求后端接口&#xff0c;返回ModelAndView不跳转 问题发现问题解决方法一&#xff1a;直接跳转到指定URL&#xff08;推荐&#xff09;方法二&#xff1a;将返回的html内容&#xff0c;插入到页面某个元素中方法三&#xff1a;操作文档流方法四&#xff1a;使…

【雕爷学编程】MicroPython动手做(28)——物联网之Yeelight 2

知识点&#xff1a;什么是掌控板&#xff1f; 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片&#xff0c;支持WiFi和蓝牙双模通信&#xff0c;可作为物联网节点&#xff0c;实现物联网应用。同时掌控板上集成了OLED…

KubeSphere 3.4.0 发布:支持 K8s v1.26

2023 年 07 月 26 日&#xff0c;KubeSphere 开源社区激动地向大家宣布&#xff0c;KubeSphere 3.4.0 正式发布&#xff01; 让我们先简单回顾下之前三个大版本的主要变化&#xff1a; KubeSphere 3.1.0 新增了“边缘计算”、“计量计费” 等功能&#xff0c;将 Kubernetes 从…

【uniapp】【Vue3】 超简单全局自定义弹窗组件Modal

Element-Plus 自动引入&#xff0c;Icon图标不显示 //这样写是不会显示的 <el-icon size"20"><view /> </el-icon>// 应该这样写 <el-icon size"20"><i-ep-view/> </el-icon>// 或 <i-ep-view/>这个名字怎么去…