目录

  • 成果演示
  • 材料
  • 主要代码
  • 总结

成果演示


材料

STM323f103开发板,最小系统均可。
超声波模块(HC-SR04模块)
舵机一个
垃圾桶模型

主要代码

超声波模块

#include "ultrasonsic.h"
#include "delay.h"u8 msHcCount = 0;//ms计数static void NVIC_Config()
{NVIC_InitTypeDef NVIC_InitStruct;//设置中断组为2NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断来源NVIC_InitStruct.NVIC_IRQChannel                                       = BASIC_TIM_IRQ;NVIC_InitStruct.NVIC_IRQChannelCmd                             = ENABLE;//设置主优先级NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;//设置次优先级NVIC_InitStruct.NVIC_IRQChannelSubPriority             = 1;//初始化NVIC_Init(&NVIC_InitStruct);}void Hcsr04Init()
{  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;     //生成用于定时器设置的结构体GPIO_InitTypeDef GPIO_InitStructure;/*开启GPIOB时钟*/RCC_APB2PeriphClockCmd(RCC_GPIOx,ENABLE);//IO初始化GPIO_InitStructure.GPIO_Pin =GPIOB_ULTR_Tx_PIN;   //发送电平引脚TXGPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//设置推挽输出GPIO_Init(GPIOB_ULTR_PORT, &GPIO_InitStructure);GPIO_ResetBits(GPIOB_ULTR_PORT,GPIOB_ULTR_Tx_PIN);//一开始低电平GPIO_InitStructure.GPIO_Pin =   GPIOB_ULTR_Rx_PIN;     //返回电平引脚GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入GPIO_Init(GPIOB_ULTR_PORT, &GPIO_InitStructure);  GPIO_ResetBits(GPIOB_ULTR_PORT,GPIOB_ULTR_Rx_PIN); //默认低电平   //定时器初始化 使用基本定时器TIM2RCC_APB1PeriphClockCmd(BASIC_TIM_CLK, ENABLE);   //使能对应RCC时钟//配置定时器基础结构体TIM_DeInit(BASIC_TIM);//自动重装载值寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断TIM_TimeBaseStructure.TIM_Period            = BASIC_TIM_Period;//设置周期为1000us//时钟预分频数TIM_TimeBaseStructure.TIM_Prescaler        = BASIC_TIM_Prescaler;//分频数72//时钟分频因子TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;//计数器计数模式,设置向上计数,TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//重复计数器的值//    TIM_TimeBaseStructure.TIM_RepetitionCounter=0 ;TIM_TimeBaseInit(BASIC_TIM, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位         // TIM_ClearFlag(BASIC_TIM, TIM_FLAG_Update);   //清除更新中断,免得一打开中断立即产生中断TIM_ClearITPendingBit(BASIC_TIM, TIM_FLAG_Update); //清除更新中断,免得一打开中断立即产生中断TIM_ITConfig(BASIC_TIM,TIM_IT_Update,ENABLE);    //打开定时器更新中断NVIC_Config();TIM_Cmd(BASIC_TIM,DISABLE);
}void initHcsr04()
{Hcsr04Init();//BASIC_TIM_NVIC_Config();
}static void OpenTimer()        //打开定时器
{// /*清除计数器*/TIM_SetCounter(BASIC_TIM,0);msHcCount = 0;TIM_Cmd(BASIC_TIM,ENABLE);//使能定时器
}static void CloseTimer()        //关闭定时器
{// /*关闭计数器使能*/TIM_Cmd(BASIC_TIM,DISABLE);
}//定时器2中断服务程序
void TIM2_IRQHandler(void)   //TIM3中断
{// /*判断中断手否真的产生*/if(TIM_GetITStatus(BASIC_TIM,TIM_IT_Update) != RESET){/*清除更新中断标志位*/TIM_ClearITPendingBit(BASIC_TIM,TIM_IT_Update);msHcCount++;}}//获取定时器时间
u32 GetEchoTimer(void)
{u32 time = 0;/*//当回响信号很长是,计数值溢出后重复计数,overCount用中断来保存溢出次数*/time = msHcCount*1000;//overCount每++一次,代表overCount毫秒,time微妙time += TIM_GetCounter(BASIC_TIM);//获取计TIM2数寄存器中的计数值,一边计算回响信号时间TIM6->CNT = 0;  //将TIM2计数寄存器的计数值清零delay_ms(50);return time;}
float Hcsr04GetLength(void )
{/*测5次数据计算一次平均值*/float length = 0;float t = 0;float sum = 0;u16      i = 0;while(i != 5){GPIO_SetBits(GPIOB_ULTR_PORT,GPIOB_ULTR_Tx_PIN);//trig拉高信号,发出高电平delay_us(20);//持续时间超过10usGPIO_ResetBits(GPIOB_ULTR_PORT,GPIOB_ULTR_Tx_PIN);/*Echo发出信号 等待回响信号*//*输入方波后,模块会自动发射8个40KHz的声波,与此同时回波引脚(echo)端的电平会由0变为1;(此时应该启动定时器计时);当超声波返回被模块接收到时,回波引 脚端的电平会由1变为0;(此时应该停止定时器计数),定时器记下的这个时间即为超声波由发射到返回的总时长;*/while(GPIO_ReadInputDataBit(GPIOB_ULTR_PORT,GPIOB_ULTR_Rx_PIN) == 0);//echo等待回响/*开启定时器*/OpenTimer();i = i+1; //每收到一次回响信号+1,收到5次就计算均值while(GPIO_ReadInputDataBit(GPIOB_ULTR_PORT,GPIOB_ULTR_Rx_PIN) == 1);/*关闭定时器*/CloseTimer();/*获取Echo高电平时间时间*/t = GetEchoTimer();length = (float)t/58;//单位时cmsum += length;       }length = sum/5;//五次平均值return length;
}

舵机模块

#include "servo.h"/*我这里采用通用计时器3*/
static void Servo_GPIO_Config()
{GPIO_InitTypeDef GPIO_InitStructure;/*开启GPIO时钟*/RCC_APB2PeriphClockCmd(BASIC_GPIOA_CLK,ENABLE);/*配置GPIO*/GPIO_InitStructure.GPIO_Pin           = GPIOA_CH1_PIN;//TIM_CH1 GPIO_InitStructure.GPIO_Mode     = GPIO_Mode_AF_PP;//复用推挽输出GPIO_InitStructure.GPIO_Speed        = GPIO_Speed_50MHz;/*初始化*/GPIO_Init(GPIOA_CH1_PORT,&GPIO_InitStructure);}
static void Servo_TIM2_Config()
{TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_OCInitTypeDef TIM_OCInitStructure;/*开启定时器时钟*/RCC_APB1PeriphClockCmd(BASIC_TIM_CLK,ENABLE);/*TIM2时基单元配置重要配置:TIM_Prescaler(预分频值)TIM_Period(定时周期)将TIM_Period设置成999,则计数器会数1000个(TIM_Period+1)节拍为一个定时器的周期。这个和后面需要配置的TIM_Pulse共同控制着定时器输出波形的占空比。TIM_Prescaler用来指定TIM时钟的分频值。也就是说它是进一步来分频TIM clock的。 简单来说也就是定时器每一次数数的时间间隔是多少。*//*配置TIM3,一般的驱动PWM信号都是周期20毫秒,频率为50HZ。所以我们设定周期为20ms*//*时基结构体成员配置*///自动重装载值寄存器的值TIM_TimeBaseInitStructure.TIM_Period                   = BASIC_TIM_Period;//时钟预分频数TIM_TimeBaseInitStructure.TIM_Prescaler             =  BASIC_TIM_Prescaler;//时钟分频因子TIM_TimeBaseInitStructure.TIM_ClockDivision     = TIM_CKD_DIV1;//计数器计数模式,设置向上计数,TIM_TimeBaseInitStructure.TIM_CounterMode            = TIM_CounterMode_Up;/*初始化结构体*/TIM_TimeBaseInit(BASIC_TIM,&TIM_TimeBaseInitStructure);/*定时器输出比较结构体成员初始化*/TIM_OCInitStructure.TIM_OCMode                = TIM_OCMode_PWM2;// 输出使能TIM_OCInitStructure.TIM_OutputState       = TIM_OutputState_Enable;//TIM_OCInitStructure.TIM_OutputNState    = TIM_OutputNState_Enable;// 设置占空比大小,主要取主函数里设置占空比这边先设置成0TIM_OCInitStructure.TIM_Pulse                  = 0;// 输出通道电平极性配置TIM_OCInitStructure.TIM_OCPolarity        = TIM_OCPolarity_High;//TIM_OCInitStructure.TIM_OCNPolarity        =  TIM_OCNPolarity_High;// 输出通道空闲电平极性配置TIM_OCInitStructure.TIM_OCIdleState     = TIM_OCIdleState_Set;//TIM_OCInitStructure.TIM_OCNIdleState  = TIM_OCNIdleState_Reset;/*初始化结构体*/TIM_OC1Init(BASIC_TIM,&TIM_OCInitStructure);//使能TIMx在CCR2上的预装载寄存器TIM_OC1PreloadConfig(BASIC_TIM,TIM_OCPreload_Enable);// 使能计数器TIM_Cmd(BASIC_TIM, ENABLE);    // 主输出使能,当使用的是通用定时器时,这句不需要TIM_CtrlPWMOutputs(BASIC_TIM, ENABLE);}void initServo(void)
{Servo_GPIO_Config();Servo_TIM2_Config();}

总结

这只是一个锻炼自己的小玩意,超声波模块代码让自己学习到了定时器相关的知识,舵机模板让我学习到了PWM输出的知识。只有做点小玩意才能激发学习下去的动力,加油吧!
整个工程文件链接

基于STM32的超声波感应垃圾桶相关推荐

  1. 基于STM32的超声波雷达项目【可拟合构建平面地图】(代码开源)

            前言:本文为手把手教学基于STM32的超声波雷达项目--HC-SR04雷达.本次项目采用的是STM32作为MCU,搭配常用的HC-SR04超声波模块与舵机SG90实现模拟雷达检测的效果 ...

  2. 基于stm32的超声波HC-SR04测距仪含距离报警(温度补偿)

         前言:本文主要是紧跟前一篇文章中有关超声波HC-SR04模块进行的扩展实验,主要涉及超声波测距的温度补偿(DHT11),并搭配蜂鸣器的距离报警.整体实验较为简单,为常用的几个传感器模块相互配 ...

  3. 基于STM32的超声波倒车检测装置

    基于STM32的超声波倒车检测装置 一.前言 这里是为了完成学校嵌入式系统及应用实验而做的一个作业,硬件资源使用的是STM32F103VBT6开发板.HC-SR04超声波模块,蜂鸣器和数码管开发板上以 ...

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

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

  5. stm32超声波扫频_基于STM32的超声波发生器扫频信号源的实现

    基于 STM32 的超声波发生器扫频信号源的实现 张加岭,李善波,侯颖钊,赵 杰 [摘 要] 摘要:扫频信号源采用以 STM32F103 单片机为核心,实现高精度锯 齿波扫频.由于超声波电源换能器串联 ...

  6. 基于STM32三路超声波避障小车

    基于STM32的避障小车 最近几天的学习了STM32输入捕获输入捕获的相关知识,为了巩固自己学习的知识特意制作一辆有三个超声波组成的4轮避障小车来加深对输入捕获的理解. 1.输入捕获简介 输入捕获模式 ...

  7. 基于STM32的超声波测距

    一.HC-SR04模块介绍 HC-SR04超声波测距模块可提供2cm-400cm的非接触式距离感测功能,测距精度可高达3mm:模块包括超声波发射器.接收器.与控制电路. 模块的基本工作原理为: (1) ...

  8. 经验分享帖 基于STM32的超声波测距HC-SR04(附程序)

    CSDN上其实有很多超声波测距的博客,但我还是想写一篇,主要是附上可用的程序,伸手党最爱.其实我也是个伸手党,不过还是希望大家能自己动手自己多练自己能实现. 同时写下我的心得与看法: 1,程序是用ST ...

  9. 基于STM32和超声波模块的超声波测距,使用OLED显示距离和温度(附详细源代码)

    1. HC-SR04模块介绍 HC-SR04模块优势 此模块性能稳定,测度距离精确,模块高精度,盲区小. 产品应用领域: 1.机器人避障 2.物体测距 3.液位检测 4.公共安防 5.停车场检测 超声 ...

最新文章

  1. 倒排列表求交集算法汇总
  2. 需求与范围驾驭深刻反省总结
  3. Halcon算子翻译——dev_close_inspect_ctrl
  4. 指出Linux内核中boot,uBoot和Linux内核中涉及到的几个地址参数的理解
  5. lt;转载自刘佳ID:freedom0203和waretgt; C++中成员初始化列表的使用
  6. 【转】史上最简单的软件破解——5行脚本代码完美破解99%的过期软件
  7. 计算机毕业设计Java宠物医院管理系统(源码+系统+mysql数据库+lw文档)
  8. Windows 下载安装 SonarQube和使用
  9. Android半透明提示效果的实现
  10. 用计算机绘制三维设计图步骤,三维计算机图形
  11. Java学生档案管理系统的设计与实现
  12. python泰勒公式_泰勒展开式利用python数值方法证明
  13. html源码(html+css)
  14. IPv6- Haproxy1.5.8 支持IPv6测试详情
  15. 联想2015年冲进全球PC服务器前三甲
  16. .ps1 is not digitally signed. The script will not execute on the system.
  17. 主题 12:实践案例集锦之兜底方案设计
  18. Leetcode|MySQL|数据库刷题记录(601~627)
  19. android 计算图片大小
  20. Android fastboot 基本操作命令(Android 刷机)

热门文章

  1. 长短信PDU编码说明
  2. css 更改text样式,JavaScript 中用 cssText 设置 CSS 样式
  3. 网站内部链接优化大解析
  4. 智能设计-阿里巴巴Banner设计
  5. 类 Pascal语言词法分析实验(简易版)
  6. HTML之marquee(文字滚动)详解
  7. TCP TimeWait状态详解(比较全)
  8. SAP EPIC 银企直连 余额查询(建设银行)
  9. 静态图片如何制作成gif动图?图片在线合成gif的方法
  10. 日本东北大学最新机器人研究:面对物理损伤,机器人可「立即」适应