stm32学习记录——舵机与超声波测距的感应垃圾桶(附工程码)

2024-02-12 08:18

本文主要是介绍stm32学习记录——舵机与超声波测距的感应垃圾桶(附工程码),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

首先是超声波测距的代码,原理就是定时器产生PWM波控制舵机旋转到指定角度。

void HC_SR04Gpio1Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0; //ECHOGPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;GPIO_Init(GPIOB,&GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;	//接TRIG 触发控制信号输入GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	         GPIO_Init(GPIOB, &GPIO_InitStructure);
}void Timer3_Init(uint16 psc,uint16 arr)
{RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);TIM_DeInit(TIM3);TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_TimeBaseInitStructure.TIM_Prescaler=psc;TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;TIM_TimeBaseInitStructure.TIM_Period=arr;TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);TIM_ICInitTypeDef TIM_ICInitStructure;TIM_ICInitStructure.TIM_Channel=TIM_Channel_3;TIM_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising;TIM_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI;TIM_ICInitStructure.TIM_ICPrescaler=TIM_ICPSC_DIV1;TIM_ICInitStructure.TIM_ICFilter=0;TIM_ICInit(TIM3,&TIM_ICInitStructure);TIM_ClearITPendingBit(TIM3,TIM_IT_Update|TIM_IT_CC3);TIM_ITConfig(TIM3,TIM_IT_Update|TIM_IT_CC3,ENABLE);NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(&NVIC_InitStructure);TIM_Cmd(TIM3,ENABLE);}
InputCapture icCapture={RESET,0,0,0,0};
uint32 Distance=0;
void TIM3_IRQHandler(void)
{if(icCapture.icFinishFlag==0){if(TIM_GetITStatus(TIM3,TIM_IT_CC3)!= RESET){if(icCapture.Edge==RESET){icCapture.Edge=SET;TIM_SetCounter(TIM3,0);TIM_OC3PolarityConfig(TIM3,TIM_OCPolarity_Low);}else{icCapture.icFinishFlag=1;icCapture.icCaptureVal=TIM_GetCapture3(TIM3);Distance=(icCapture.icUpdateCnt*65535+icCapture.icCaptureVal)*340/20000;  icCapture.icUpdateCnt=0;icCapture.Edge=RESET;TIM_OC3PolarityConfig(TIM3,TIM_OCPolarity_High);icCapture.icFinishFlag=0;}}if(TIM_GetITStatus(TIM3,TIM_IT_Update)!= RESET){if(icCapture.Edge==SET){icCapture.icUpdateCnt++;printf("The icUpdateCnt is:%d\r\n",icCapture.icUpdateCnt);}}}TIM_ClearITPendingBit(TIM3,TIM_IT_Update|TIM_IT_CC3);	
}

再来就是舵机。

void Duoji_Tim4_Init(u16 arr,u16 psc)
{GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;TIM_OCInitTypeDef  TIM_OCInitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);	                     //使能定时器4时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);  //使能GPIO外设和AFIO复用功能模块时钟	326389//设置该引脚为复用输出功能,输出TIM4 CH2的PWM脉冲波形	GPIOB.6GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 ;                  //TIM_CH1-4GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;             //复用推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);                      //初始化GPIO//**************初始化TIM4*****************//TIM_TimeBaseStructure.TIM_Period = arr;                     //设置在下一个更新事件装入活动的自动重装载寄存器周期的值TIM_TimeBaseStructure.TIM_Prescaler =psc;                   //设置用来作为TIMx时钟频率除数的预分频值 TIM_TimeBaseStructure.TIM_ClockDivision = 0;                //设置时钟分割:TDTS = Tck_timTIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);             //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位//*******初始化TIM4 Channel2 PWM模式********//	 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;                //选择定时器模式:TIM脉冲宽度调制模式2TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;    //比较输出使能TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;        //输出极性:TIM输出比较极性高TIM_OC1Init(TIM4, &TIM_OCInitStructure);                         //根据T指定的参数初始化外设TIM4 OC1TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);                //使能TIM4在CCR2上的预装载寄存器TIM_Cmd(TIM4, ENABLE);                                           //使能TIM4
}

最后附上可以使用的工程代码

链接:https://pan.baidu.com/s/1ADlwZHGD430xtg6XPdg8VQ 
提取码:9438

这篇关于stm32学习记录——舵机与超声波测距的感应垃圾桶(附工程码)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/702129

相关文章

SpringBoot3应用中集成和使用Spring Retry的实践记录

《SpringBoot3应用中集成和使用SpringRetry的实践记录》SpringRetry为SpringBoot3提供重试机制,支持注解和编程式两种方式,可配置重试策略与监听器,适用于临时性故... 目录1. 简介2. 环境准备3. 使用方式3.1 注解方式 基础使用自定义重试策略失败恢复机制注意事项

Python UV安装、升级、卸载详细步骤记录

《PythonUV安装、升级、卸载详细步骤记录》:本文主要介绍PythonUV安装、升级、卸载的详细步骤,uv是Astral推出的下一代Python包与项目管理器,主打单一可执行文件、极致性能... 目录安装检查升级设置自动补全卸载UV 命令总结 官方文档详见:https://docs.astral.sh/

统一返回JsonResult踩坑的记录

《统一返回JsonResult踩坑的记录》:本文主要介绍统一返回JsonResult踩坑的记录,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录统一返回jsonResult踩坑定义了一个统一返回类在使用时,JsonResult没有get/set方法时响应总结统一返回

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

java对接海康摄像头的完整步骤记录

《java对接海康摄像头的完整步骤记录》在Java中调用海康威视摄像头通常需要使用海康威视提供的SDK,下面这篇文章主要给大家介绍了关于java对接海康摄像头的完整步骤,文中通过代码介绍的非常详细,需... 目录一、开发环境准备二、实现Java调用设备接口(一)加载动态链接库(二)结构体、接口重定义1.类型

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

apache的commons-pool2原理与使用实践记录

《apache的commons-pool2原理与使用实践记录》ApacheCommonsPool2是一个高效的对象池化框架,通过复用昂贵资源(如数据库连接、线程、网络连接)优化系统性能,这篇文章主... 目录一、核心原理与组件二、使用步骤详解(以数据库连接池为例)三、高级配置与优化四、典型应用场景五、注意事

SpringBoot实现文件记录日志及日志文件自动归档和压缩

《SpringBoot实现文件记录日志及日志文件自动归档和压缩》Logback是Java日志框架,通过Logger收集日志并经Appender输出至控制台、文件等,SpringBoot配置logbac... 目录1、什么是Logback2、SpringBoot实现文件记录日志,日志文件自动归档和压缩2.1、

qtcreater配置opencv遇到的坑及实践记录

《qtcreater配置opencv遇到的坑及实践记录》我配置opencv不管是按照网上的教程还是deepseek发现都有些问题,下面是我的配置方法以及实践成功的心得,感兴趣的朋友跟随小编一起看看吧... 目录电脑环境下载环境变量配置qmake加入外部库测试配置我配置opencv不管是按照网上的教程还是de

使用nohup和--remove-source-files在后台运行rsync并记录日志方式

《使用nohup和--remove-source-files在后台运行rsync并记录日志方式》:本文主要介绍使用nohup和--remove-source-files在后台运行rsync并记录日... 目录一、什么是 --remove-source-files?二、示例命令三、命令详解1. nohup2.