目录

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次表1usreturn (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);elseHAL_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次表1usreturn (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);}

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

  1. 基于51单片机超声波测距液位检测-温度检测

    [毕设课设]基于51单片机超声波测距液位检测-温度检测 ​效果图 Proteus仿真: 功能简介: 文件内容: 程序框架: 网盘链接: ​效果图 更多内容请关注@WENJIE电子科技 ​ 基于51单片 ...

  2. stm32蓝牙模块和超声波测距模块

    蓝牙 蓝牙概念 蓝牙技术是一种无线数据和语音通信开放的全球规范,它是基于低成本的近距离无线连接,为固定和移动设备建立通信环境的一种特殊的近距离无线技术连接. [1] 蓝牙使当前的一些便携移动设备和计算 ...

  3. 【STM32】详解超声波测距模块工作原理

    一.产品介绍 超声波测距模块可提供2cm-400cm的非接触距离感测功能,测距精度3mm,模块包括超声波发射器,接收器与控制电路. 二.基本工作原理 (1)采用IO口trig出发测距,给Echo最少1 ...

  4. 基于STM32和超声波测距传感器的测距功能设计

    基于STM32和超声波测距传感器的测距功能设计(使用陌生传感器的流程介绍) 引言 项目设计 项目简介 开发工具 硬件设计 软件设计 开发流程 阅读手册 配置并测试传感器相关设置 软件开发 总结 后续 ...

  5. 使用超声波测距模块控制LED灯

    本文章为你介绍如何使用Arduino开发板和超声波测距模块来控制LED灯的明灭. 所需硬件 -Arduino开发板 -LED -超声波测距模块 下面主要为大家说明一下超声波模块. 超声波传感器通过采用 ...

  6. STM32蓝牙控制循迹避障小车源代码——3.舵机、超声波测距模块

    STM32蓝牙控制循迹避障小车源代码--3.舵机.超声波测距模块 注意-所需模块: US-015超声波模块 SG90舵机云台 接线:舵机超声波: A1–P2.7 B8–Trig B9–Echo 代码 ...

  7. STM32单片机基于HAL库开发HC-SR04 超声波测距模块(终极版)

    参考: 某宝HC-SR04 超声波测距模块商品详情页 STM32L051C8T6 HAL库 输入捕获进行超声波测距 案例 STM32CubeMX学习笔记3--TIM2输入捕获(SR-04测距) cub ...

  8. stm32之蓝牙无线超声波测距

    将以前做过的蓝牙和超声波结合就得到蓝牙无线超声波测距 通过hc05蓝牙模块使手机和stm32开发板能互相发送字符串--DMA&空闲中断 stm32f103之HC_SR04超声波测距 在正点原子 ...

  9. HC-SR04超声波测距模块使用方法和例程(STM32)

    基于STM32和HC-SR04模块实现超声波测距功能 最近在学STM32做个简单的应用实践一下,顺便水一篇文章. 本文用的单片机是STM32F103C8T6,超声波测距模块是HC-SR04,显示测距结 ...

  10. STM32—驱动HC-SR04超声波测距模块

    文章目录 超声波测距原理 HC-SR04工作原理 STM32实现驱动 1.引脚的配置 2.时序控制 3.时间差测量 4.如何将距离测出来 超声波测距原理 利用HC-SR04超声波测距模块可以实现比较精 ...

最新文章

  1. 如何看懂一个深度学习的项目代码
  2. Sql 中取小数点后面两位小数.
  3. 不吹不黑,赞一下应用运维管理的cassacdra
  4. OpenCASCADE绘制测试线束:拓扑命令之拓扑和曲面创建
  5. 《3D Math Primer for Graphics and Game Development》读书笔记1
  6. 安卓获取imei权限闪退_Android10 下获取序列号和IMEI号的权限
  7. Android studio之提示Failed to resolve: com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.46
  8. HDU5187 zhx#39;s contest(计数问题)
  9. 重读经典:《Deep Residual Learning for Image Recognition》
  10. 实验2-4-2 生成3的乘方表 (C语言)
  11. Linux日志管理工具 journalctl
  12. 摄影场景拍摄方法笔记
  13. 解释外显子,内含子,CDS、cDNA、EST、mRNA、ORF间的区别
  14. 7-zip比较丑的图标修改
  15. 用平均的方法去除噪声
  16. 如何在Ubuntu 20.04上设置和配置证书颁发机构(CA)
  17. lisp注册注册机源码_[求助]请教在lisp中加入注册码
  18. wav,flac,mp3,ogg等的区别
  19. Datawhale 图神经网络task4
  20. 4 海康视觉平台VisionMaster 上手系列:常用工具(一)

热门文章

  1. [No00007E]2016-面经[中]
  2. Unity Cloth组件 布料系统 属性详解
  3. 华为招聘机试整理5:简单四则运算
  4. Android R 新特性变化,2021Android笔试真题
  5. 校验字符串长度中文不能超过100,英文不能超过200
  6. 2018蓝桥杯决赛赛后总结(游记)
  7. 2018年90所计算机高校排名,2019年90所自主招生高校分档分类排行榜
  8. python threading同一进程下线程共享全局变量
  9. springcloud 基于Finchley.SR2版本 Hystrix容错断路器配置
  10. python opencv --cv2.absdiff比较两图片差异