stm32感应开盖垃圾桶

1.应用模块

  • 超声波模块

在这里插入图片描述

1.介绍:超声波传感器模块上面通常有两个超声波元器件,一个用于发射,一个用于接收。电路板上有四个引脚:VCC GND Trig(触发)
主要参数:
工作电压与电流:5V,15mA
感应距离: 2~400cm
感测角度: 不小于15°
被测物的面积不要小于50cm² 并且尽量平整

2.测距原理:
具备温度补偿电路
超声波模块的触发脚(Trig)输入10us 以上的高电位,即可发射超声波,发射超声波后,与接收到传回的超声波之前,”响应”脚(Echo)位呈现高电平。因此,程序可以从”响应”脚位(Echo)的高电平脉冲持续时间,换算出被测物的距离。
在这里插入图片描述
3.距离计算公式: 高电平持续时间 * 声速(340/秒) / 2

4.配置步骤
//1.中断组配置
//2.打开gpio和定时器时钟
//3.配置发送高电平trig引脚gpio PB11口和初始化
//4.配置EchoGPIO PB10和初始化
//5.定时器结构体的配置
//6.定时器中断结构体配置
//7.打开定时器4
//8.关闭定时器4

//定时器中断服务函数
//获取定时器计数器的值函数
//获取超声波测距距离函数
高电平维持时间
6.等待Echo引脚输入高电平开始,定时器打开—>开启计数器计数
7.等待Echo引脚输入高电平结束,定时器关闭—>停止计数器计数

8.通过计数器的值计算得出超声波测量距离

  • SG9O电机
    在这里插入图片描述

1.介绍:(略)

2.硬件接线:
红线 : 3.3v/ 5v
黑线 : GND
黄线 : 信号线

3.配置步骤
//1.打开gpio时钟//打开定时器时钟//打开引脚复用AFIO时钟
//2.选择重映射模式
//3.配置gpio结构体与初始化
//4.配置通用定时器结构体与初始化
//5.配置输出pwm波结构体与初始化
//6.自动加载预加载寄存器配置
//7.开启定时器

附上代码

超声波.c文件

#include "stm32f10x.h"                  // Device header
#include "SysTick.h"
#include "HC_SR04.h"


 uint16_t mscount = 0;   //extern 让main函数也能使用这里这个

void HC_SR04(void)
{
		GPIO_InitTypeDef GPIO_HC_SR04init;//1.配置GPIO引脚结构体 Trig PB11 Echo PB10
		TIM_TimeBaseInitTypeDef TIM_HC_SR04init;//2.配置定时器结构体
	  NVIC_InitTypeDef NVIC_HC_SR04init;//3.配置定时器中断结构体
	
	//中断组配置
		NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
	
	//1.打开gpio和定时器时钟
	  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//4.开启时钟(定时器,GPIO)
		RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);

	//配置发送高电平trig引脚gpio  PB11口和初始化
		GPIO_HC_SR04init.GPIO_Mode  = GPIO_Mode_Out_PP; 
		GPIO_HC_SR04init.GPIO_Pin   =	GPIO_Pin_11;	
		GPIO_HC_SR04init.GPIO_Speed = GPIO_Speed_50MHz;
	  GPIO_Init( GPIOB, &GPIO_HC_SR04init );
	
	//配置EchoGPIO PB10和初始化
		GPIO_HC_SR04init.GPIO_Mode = GPIO_Mode_IN_FLOATING;
		GPIO_HC_SR04init.GPIO_Pin  = GPIO_Pin_10;
		GPIO_Init( GPIOB, &GPIO_HC_SR04init );
	
	
	//定时器结构体的配置
	
		TIM_HC_SR04init.TIM_ClockDivision  = TIM_CKD_DIV1;
		TIM_HC_SR04init.TIM_CounterMode    = TIM_CounterMode_Up;
		TIM_HC_SR04init.TIM_Period         = 100 - 1 ; //1ms
		TIM_HC_SR04init.TIM_Prescaler      = 72 - 1 ;  //72M
		TIM_TimeBaseInit( TIM4, &TIM_HC_SR04init);
	  TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);
		TIM_Cmd( TIM4, DISABLE );  //先关闭tim4
	
	
	//定时器中断结构体配置
		NVIC_HC_SR04init.NVIC_IRQChannel = TIM4_IRQn;
		NVIC_HC_SR04init.NVIC_IRQChannelPreemptionPriority = 0;
		NVIC_HC_SR04init.NVIC_IRQChannelSubPriority = 0;
		NVIC_HC_SR04init.NVIC_IRQChannelCmd = ENABLE;
		NVIC_Init(&NVIC_HC_SR04init);

	
}

//打开定时器4
void Open_tim4(void)	
{
		TIM_SetCounter( TIM4,  0);
		mscount = 0;
		TIM_Cmd( TIM4, ENABLE );  

	
}
//关闭定时器4
void Close_tim4(void)
{
				TIM_Cmd( TIM4, DISABLE );  //关闭


}
//定时器中断服务函数
void TIM4_IRQHandler(void)
{
	 if ( TIM_GetITStatus(TIM4,  TIM_IT_Update) != RESET)     //判断是否发生中断
	 {
				TIM_ClearITPendingBit(TIM4, TIM_IT_Update);   //清楚标记位
				mscount++; //记录发生的中断次数

	 
	 }


}
//获取定时器计数器的值
int GetEcho_time(void)
{
		uint32_t t = 0;
		t = mscount * 1000;   //发生了多少个中断 *1000 
		t += TIM_GetCounter(TIM4);
		TIM4->CNT = 0;
		ms_delay(50);
	
		return t;

}
//获取超声波测距距离
float GetLength(void)
{
	int i = 0;
	uint16_t t = 0;
	float length = 0;
	float sum = 0;
	
	while(i != 5)
	{
		TRIG_Send(1);
		us_delay(20);
		TRIG_Send(0);
		
		while(ECHO_Reci == 0);
				Open_tim4();
				i=i+1;
		while(ECHO_Reci == 1);
				t = GetEcho_time();
				length =((float) t / 58.0);
				sum = sum +length;
		
	}
		length = sum / 5.0;
		return length;

}

超声波.h文件

#ifndef _HC_SR04_H
#define _HC_SR04_H

#include "stm32f10x.h"                  // Device header
void HC_SR04(void);

void Open_tim4(void);
void Close_tim4(void);
int GetEcho_time(void);
float GetLength(void);

#define ECHO_Reci    	GPIO_ReadInputDataBit( GPIOB, GPIO_Pin_10)
 
#define TRIG_Send(a)  if(a) \
											GPIO_SetBits(GPIOB, GPIO_Pin_11); \
											else \
											GPIO_ResetBits(GPIOB, GPIO_Pin_11)

#endif
		

舵机.c文件

#include "stm32f10x.h"                  // Device header

#include "motor.h"

void motor_config(void)
{
		GPIO_InitTypeDef GPIO_MotorInit;  //1.GPIO结构体
		TIM_TimeBaseInitTypeDef TIM_MotorInit; //2.配置通用定时器结构体
		TIM_OCInitTypeDef TIMPWN_MotorInit;    //3.配置定时去输出PWM结构体   +下边的 TIM_OC2Init  TIM_OC2PreloadConfig  TIM_Cmd
	
		//1.打开gpio时钟//打开定时器时钟//打开引脚复用AFIO时钟
		RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB,  ENABLE); //4.1 打开GPIO时钟
		RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM3,  ENABLE);	//4.2 打开定时器时钟
		RCC_APB2PeriphClockCmd( RCC_APB2Periph_AFIO,  ENABLE);	//复用使能时钟
		
		//2.选择重映射模式
		GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3 , ENABLE );	//4.3 部分重映射时钟

		//3.配置gpio结构体与初始化
		GPIO_MotorInit.GPIO_Mode  =  GPIO_Mode_AF_PP;//复用推挽输出
		GPIO_MotorInit.GPIO_Pin   =	 GPIO_Pin_5;
		GPIO_MotorInit.GPIO_Speed =  GPIO_Speed_50MHz;
		
	  GPIO_Init( GPIOB, &GPIO_MotorInit );
	
		//4.配置通用定时器结构体与初始化
		TIM_MotorInit.TIM_ClockDivision =  TIM_CKD_DIV1;					//设置时钟分割
		TIM_MotorInit.TIM_CounterMode 	=	 TIM_CounterMode_Up;		//计数模式 TIM向上计数
		TIM_MotorInit.TIM_Period 				=  200 - 1 ;              //重装载值 设置在下一个更新事件装入活动的重装载值
		TIM_MotorInit.TIM_Prescaler 		=  7200 - 1 ;							//预分频 TIMx时钟频率预分频值

		TIM_TimeBaseInit( TIM3, &TIM_MotorInit);
		//5.配置输出pwm波结构体与初始化
		TIMPWN_MotorInit.TIM_OCIdleState = TIM_OCMode_PWM1;					//选择定时器模式1
		TIMPWN_MotorInit.TIM_OutputState = TIM_OutputState_Enable;	//比较输出使能
		TIMPWN_MotorInit.TIM_OCPolarity  = TIM_OCPolarity_Low;			//选择有效输出极性
	
		TIM_OC2Init( TIM3,	&TIMPWN_MotorInit ); //选择的是定时器3的通道2 所以用OC2
		//6.自动加载预加载寄存器配置
		TIM_OC2PreloadConfig( TIM3,  TIM_OCPreload_Enable);
		
		TIM_Cmd( TIM3,  ENABLE);



}
  • 5
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

打酱油的;

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值