基于STM32与红外感应开关的自动门设计与实现(结构+设计)
基于STM32与红外感应开关的自动门设计与实现
采用STM32作为主控,设计了自动和手动开门装置,MLX90614作为设计测温装置。
前言说明
元器件清单说明
- STM32F103C8T6系统板
- 微型滑台,步进电机
- TMC2208步进电机驱动器
- 红外接近开关
- MLX90614测温模块
- 四线0.96寸OLED屏幕
- 按键
- 限位触碰开关
Soildworks模型绘制
原理图绘制
TMC2208驱动介绍
TMC2208是一款超静音的两相步进电机驱动芯片,持续驱动电流1.4A,峰值电流2A,电压范围4.75V-36V,256细分;灵活的microPlyer插值单元,可提供高达256的细分,即使是在脉冲频率有限的系统中仍可完美地实现正弦控制;由于stealthChop2超静音技术在3D打印中被广泛应用,因此这些组件的设计也与现有3D打印机电子设备兼容,省去了重新设计所产生的昂贵费用。具有标准的step/dir接口,使用起来简单方便。可以替代原有的TMC2100,更低的发热量,特别适合3D打印市场。关键引脚说明
引脚 | 说明 |
---|---|
GND | 地 |
VM | 我给的是5V1A |
VIN | 逻辑电平输入3-5V |
1A | 相A+ |
2A | 相B+ |
1B | 相A- |
2B | 相B- |
DIR | 方向输入 |
EN | 使能,低电平有效 |
STEP | 输入脉冲数 |
MS1 | 细分 |
MS2 | 细分 |
步进电机介绍
采用SM15-80L微型滑台作为门的载体,该滑台属于步进电机控制直接给高低电平是驱动不了的。
关键代码
下面展示一些 内联代码片
。
void EXTI0_IRQHandler(void)
{delay_ms(10); //消抖if(KEY_Limit_Switch==0){ Limit_Switch_Finish=0;}EXTI_ClearITPendingBit(EXTI_Line0); //清除EXTI0线路挂起位
}void EXTI4_IRQHandler(void)
{ delay_ms(10); //消抖 u8 i,j;float Temperature = 0; //温度数据变量(浮点型)char TempValue[80] = {0}; //温度值(字符串) if(KEY_Infrared==0&&Opening==0) {Opening=1;Door_Open_Flag = 1;Locate_Rle3(5000,CCW,24000); //CCW往电机Temperature = SMBus_ReadTemp(); sprintf(TempValue,"%.1f", Temperature); //浮点型转换成字符串 //温度单位显示 (℃)for(i = 6;i < 7;i++){j = i - 6;OLED_ShowCHinese16x16(i*16,4,j,TempCompany); }OLED_ShowString(40,4,(uint8_t *)TempValue,16);//在在OLED上显示实际测量的温度}else if(KEY_Infrared==0&&Opened==1){Door_Opened_Flag = 1;}EXTI_ClearITPendingBit(EXTI_Line4); //清除LINE5上的中断标志位
}void EXTI15_10_IRQHandler(void)
{delay_ms(10); //消抖 u8 i,j; float Temperature = 0; //温度数据变量(浮点型)char TempValue[80] = {0}; //温度值(字符串) if(KEY==0&&Opening==0) {Opening=1;Door_Open_Flag = 1;Locate_Rle3(5000,CCW,24000); //CCW往电机Temperature = SMBus_ReadTemp(); sprintf(TempValue,"%.1f", Temperature); //浮点型转换成字符串 //温度单位显示 (℃)for(i = 6;i < 7;i++){j = i - 6;OLED_ShowCHinese16x16(i*16,4,j,TempCompany); }OLED_ShowString(40,4,(uint8_t *)TempValue,16);//在在OLED上显示实际测量的温度}else if(KEY==0&&Opened==1){Door_Opened_Flag = 1;}EXTI_ClearITPendingBit(EXTI_Line15); //清除LINE15线路挂起位
}
程序主要是通过外部引起中断执行的,一共用了三个中断,分别对应着手动开门,红外感应开门以及限位开关三个部分。
驱动代码块
#include "driver.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"long current_pos[2]={0,0}; //有符号方向
u16 Motor_Step;
DIR_Type motor_dir3=CW;
u16 count[3]={0,0,0};
extern u8 Door_Open_Flag;
extern u8 Limit_Switch_Finish;
u8 Time_Flag=0;
u8 Limit_Switch_Flag=0;
u8 Flag=0;
extern u8 Opening;
u8 Opened=0;
/************** 驱动器控制信号线初始化 ****************/
void Driver_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE); //使能PA端口时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //PC0.2 端口配置GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHzGPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化GPIOAGPIO_SetBits(GPIOA,GPIO_Pin_5); //PA8输出高 顺时针方向 DRIVER_DIRGPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_ResetBits(GPIOB,GPIO_Pin_1); //PA11输出低 使能输出 DRIVER_OELimit_Switch_Flag=1;Locate_Limit(5000,CCW); while(Flag==0);Flag=0;Locate_Limit(5000,CW);
}void TIM3_Init(u16 arr,u16 psc)
{ GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_OCInitTypeDef TIM_OCInitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);TIM_TimeBaseStructure.TIM_Period = arr; TIM_TimeBaseStructure.TIM_Prescaler =psc; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);TIM_ClearITPendingBit(TIM3,TIM_IT_Update);TIM_UpdateRequestConfig(TIM3,TIM_UpdateSource_Regular); TIM_SelectOnePulseMode(TIM3,TIM_OPMode_Single);TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;TIM_OCInitStructure.TIM_Pulse = arr>>1; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC2Init(TIM3, &TIM_OCInitStructure); TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); TIM_ARRPreloadConfig(TIM3, ENABLE); TIM_ITConfig(TIM3, TIM_IT_Update ,ENABLE); NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); TIM_ClearITPendingBit(TIM3, TIM_IT_Update); TIM_Cmd(TIM3, DISABLE);
}void TIM3_IRQHandler(void)
{if(TIM_GetITStatus(TIM3,TIM_FLAG_Update)!=RESET){TIM_ClearITPendingBit(TIM3,TIM_FLAG_Update); //清除中断if(motor_dir3==CW) //关门{TIM_GenerateEvent(TIM3,TIM_EventSource_Update);TIM_Cmd(TIM3, ENABLE);if(Limit_Switch_Finish==0){Limit_Switch_Finish=1;Opening = 0;TIM_Cmd(TIM3, DISABLE); }}else {if(Limit_Switch_Flag==1) //开始限位{count[0]++;TIM_GenerateEvent(TIM3,TIM_EventSource_Update);TIM_Cmd(TIM3, ENABLE);if(count[0]==1000){count[0]=0;Flag=1;TIM_Cmd(TIM3, DISABLE);LED0=0;Limit_Switch_Flag=0;}}else{count[1]++; TIM_GenerateEvent(TIM3,TIM_EventSource_Update);TIM_Cmd(TIM3, ENABLE); if(count[1]==Motor_Step) //24000{Opened = 1;count[1]=0;TIM_Cmd(TIM3, DISABLE); if(Door_Open_Flag==1){Time_Flag=1;} } }}}
}void TIM3_Startup(u32 frequency)
{u16 temp_arr=1000000/frequency-1; TIM_SetAutoreload(TIM3,temp_arr);TIM_SetCompare2(TIM3,temp_arr>>1); TIM_SetCounter(TIM3,0);TIM_Cmd(TIM3, ENABLE);
}
/********************************************
//相对定位函数
//num 0~2147483647
//frequency: 20Hz~100KHz
//dir: CW(顺时针方向) CCW(逆时针方向)
*********************************************/
void Locate_Rle3(u32 frequency,DIR_Type dir,u16 step) //相对定位函数
{if(TIM3->CR1&0x01){// printf("\r\nThe last time pulses is not send finished,wait please!\r\n");return;}if((frequency<20)||(frequency>100000)){// printf("\r\nThe frequency is out of range! please reset it!!(range:20Hz~100KHz)\r\n");return;}motor_dir3=dir;DRIVER_DIR3=motor_dir3;Motor_Step = step;TIM3_Startup(frequency);LED0=1;
}void Locate_Limit(u32 frequency,DIR_Type dir) //相对定位函数
{if(TIM3->CR1&0x01){// printf("\r\nThe last time pulses is not send finished,wait please!\r\n");return;}if((frequency<20)||(frequency>100000)){// printf("\r\nThe frequency is out of range! please reset it!!(range:20Hz~100KHz)\r\n");return;}motor_dir3=dir;DRIVER_DIR3=motor_dir3;TIM3_Startup(frequency);
}
基于STM32与红外感应开关的自动门设计与实现(结构+设计)相关推荐
- 基于stm32、Android和Html的温湿度监控系统的设计
系列文章目录 第一章ESP8266的java软件仿真测试 第二章ESP8266硬件与软件测试 第三章ESP8266客户端与Java后台服务器联调 第四章ESP8266客户端与JavaWeb服务器联调 ...
- 基于51单片机红外遥控人体感应自动车库门控制设计(程序+Proteus仿真+原理图+PCB图+参考论文+开题报告+任务书等)
一.硬件方案 单片机的红外遥控人体感应自动门控制系统设计的实现主要有电源5V供电.单片机最小系统.红外感应遥控模块,红外一体接收头,按键电路,步进电机驱动电路,指示灯电路组成.. 二.设计功能 1.如 ...
- 基于STM32的红外人体感应器控制LED灯的状态
文章目录 一.红外人体感应器的介绍 二.利用红外人体感应器实现控制LED灯 三.总结 一.红外人体感应器的介绍 产品参数 产品特点 ①全自动感应 当人进入其感应范围则输出高电平,人离开感应范围则自动延 ...
- 毕设-基于STM32刷卡、指纹的门禁系统的设计与实现(进阶版)
简介 上面一篇文章已经将指纹模块的驱动原理讲解明白,本文就详细介绍以下整个系统是如何实现的. 实现功能 系统要求如下: 1)使用RC522与指纹模块控制门的打开 2)添加IC卡和指纹数据 3)语音播报 ...
- 基于stm32的红外遥控
内容分三个部分: (1)红外遥控协议 (2)硬件连接 (3)代码 1.红外遥控协议 红外遥控是一种无线.非接触控制技术,具有抗干扰能力强,信息传输可靠,功耗低,成本低,易实现等显著优点,被诸多电子设备 ...
- 基于STM32单片机智能手表GSM短信GPS定位设计(毕业设计资料)
本设计由STM32单片机+LCD1602液晶显示电路+GPS模块+GSM模块+按键电路+LED灯电路+电源电路组成. 1.液晶1602显示时钟,带日期,且可以显示经纬度信息,两个信息通过一个按键切换 ...
- 基于STM32的STM8脱机编程器 烧录器
基于STM32的STM8脱机编程器 烧录器 下载器 设计资料 编程器源码id=589289608092&
- 【毕业设计】基于stm32的智能水杯 - 恒温控制 饮水杯 单片机 物联网 嵌入式
文章目录 0 简介 1 项目介绍 2 系统设计 3 恒温控制实现 3.1 功能描述 3.2 PID算法原理 3.2.1 P:比例 3.2.2 I:积分 3.2.3 D:微分 3.3 温控代码实现 4 ...
- 基于stm32单片机的四种波形发生器正弦波、方波、三角波、锯齿波
基于stm32单片机的四种波形发生器(源程序+仿真+设计报告)全套资料 资料编号:010 具体功能: (1) 可以实现四种波形:正弦波.方波.三角波.锯齿波: (2) 通过按键进行选择,频率可以调整: ...
最新文章
- R语言使用ggplot2包使用geom_boxplot函数绘制基础分组箱图(不同分组配置不同的箱体填充色+灰度尺度图)实战
- benchmark mysql_程序员的MySQL手册(二): 监控与benchmark
- python处理xml中非法字符的一种思路
- Geography爱好者 QGIS WGS84转其它坐标系并计算坐标
- access集团和abm_abm年度盛典,12月份,中国、澳大利亚、新西兰三地同时举办,abm各渠道运营商从全球各地赶来参会!...
- 是什么让南浔银行动了心?“高端存储+双活”
- 初学者,你应当如何学习C++以及编程-转
- 【Oracle】添加注释(COMMENT ON)
- SSM框架之Spring MVC(二)常用注解说明
- 4种字符串匹配算法:有限自动机(中)
- 小程序cms系统服务器选择,如何三分钟为小程序打造管理后台
- 微信支付宝小程序复制内容到剪贴板功能
- 服务器 dell 重装 win7系统,戴尔笔记本重装系统
- php怎么启动服务,如何打开php服务
- 西电2019计算机等级考试,西安电子科技大学2019《计算方法》期末考试试题
- 超越极限——2009年度DDR3内存横向测试(图)
- Ubuntu系统打不开windows磁盘文件
- Tcache Attack
- Tomcat部署多个Sring Boot项目时Unable To Register MBean Exception的一种解决方法
- 如何取消坚果云的分享链接