基于STM32与红外感应开关的自动门设计与实现

采用STM32作为主控,设计了自动和手动开门装置,MLX90614作为设计测温装置。

前言说明

元器件清单说明

  1. STM32F103C8T6系统板
  2. 微型滑台,步进电机
  3. TMC2208步进电机驱动器
  4. 红外接近开关
  5. MLX90614测温模块
  6. 四线0.96寸OLED屏幕
  7. 按键
  8. 限位触碰开关

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与红外感应开关的自动门设计与实现(结构+设计)相关推荐

  1. 基于stm32、Android和Html的温湿度监控系统的设计

    系列文章目录 第一章ESP8266的java软件仿真测试 第二章ESP8266硬件与软件测试 第三章ESP8266客户端与Java后台服务器联调 第四章ESP8266客户端与JavaWeb服务器联调 ...

  2. 基于51单片机红外遥控人体感应自动车库门控制设计(程序+Proteus仿真+原理图+PCB图+参考论文+开题报告+任务书等)

    一.硬件方案 单片机的红外遥控人体感应自动门控制系统设计的实现主要有电源5V供电.单片机最小系统.红外感应遥控模块,红外一体接收头,按键电路,步进电机驱动电路,指示灯电路组成.. 二.设计功能 1.如 ...

  3. 基于STM32的红外人体感应器控制LED灯的状态

    文章目录 一.红外人体感应器的介绍 二.利用红外人体感应器实现控制LED灯 三.总结 一.红外人体感应器的介绍 产品参数 产品特点 ①全自动感应 当人进入其感应范围则输出高电平,人离开感应范围则自动延 ...

  4. 毕设-基于STM32刷卡、指纹的门禁系统的设计与实现(进阶版)

    简介 上面一篇文章已经将指纹模块的驱动原理讲解明白,本文就详细介绍以下整个系统是如何实现的. 实现功能 系统要求如下: 1)使用RC522与指纹模块控制门的打开 2)添加IC卡和指纹数据 3)语音播报 ...

  5. 基于stm32的红外遥控

    内容分三个部分: (1)红外遥控协议 (2)硬件连接 (3)代码 1.红外遥控协议 红外遥控是一种无线.非接触控制技术,具有抗干扰能力强,信息传输可靠,功耗低,成本低,易实现等显著优点,被诸多电子设备 ...

  6. 基于STM32单片机智能手表GSM短信GPS定位设计(毕业设计资料)

    本设计由STM32单片机+LCD1602液晶显示电路+GPS模块+GSM模块+按键电路+LED灯电路+电源电路组成.  1.液晶1602显示时钟,带日期,且可以显示经纬度信息,两个信息通过一个按键切换 ...

  7. 基于STM32的STM8脱机编程器 烧录器

    基于STM32的STM8脱机编程器 烧录器 下载器 设计资料 编程器源码id=589289608092&

  8. 【毕业设计】基于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 ...

  9. 基于stm32单片机的四种波形发生器正弦波、方波、三角波、锯齿波

    基于stm32单片机的四种波形发生器(源程序+仿真+设计报告)全套资料 资料编号:010 具体功能: (1) 可以实现四种波形:正弦波.方波.三角波.锯齿波: (2) 通过按键进行选择,频率可以调整: ...

最新文章

  1. R语言使用ggplot2包使用geom_boxplot函数绘制基础分组箱图(不同分组配置不同的箱体填充色+灰度尺度图)实战
  2. benchmark mysql_程序员的MySQL手册(二): 监控与benchmark
  3. python处理xml中非法字符的一种思路
  4. Geography爱好者 QGIS WGS84转其它坐标系并计算坐标
  5. access集团和abm_abm年度盛典,12月份,中国、澳大利亚、新西兰三地同时举办,abm各渠道运营商从全球各地赶来参会!...
  6. 是什么让南浔银行动了心?“高端存储+双活”
  7. 初学者,你应当如何学习C++以及编程-转
  8. 【Oracle】添加注释(COMMENT ON)
  9. SSM框架之Spring MVC(二)常用注解说明
  10. 4种字符串匹配算法:有限自动机(中)
  11. 小程序cms系统服务器选择,如何三分钟为小程序打造管理后台
  12. 微信支付宝小程序复制内容到剪贴板功能
  13. 服务器 dell 重装 win7系统,戴尔笔记本重装系统
  14. php怎么启动服务,如何打开php服务
  15. 西电2019计算机等级考试,西安电子科技大学2019《计算方法》期末考试试题
  16. 超越极限——2009年度DDR3内存横向测试(图)
  17. Ubuntu系统打不开windows磁盘文件
  18. Tcache Attack
  19. Tomcat部署多个Sring Boot项目时Unable To Register MBean Exception的一种解决方法
  20. 如何取消坚果云的分享链接

热门文章

  1. H3C服务器查看raid
  2. javascript将table的td变为可编辑的input,实现表格动态编辑(带示例版)
  3. 强化学习(RLAI)读书笔记第六章差分学习(TD-learning)
  4. 更换matlab版本需要注意事项,AMD 篇四:更换Matlab调用MKL库版本
  5. 利用ArcMap将CAD数据转为shp
  6. appinventor飞机大战案例_APPInventor实例及讲解
  7. 接口隔离原则-快速理解
  8. 6617: Finite Encyclopedia of Integer Sequences
  9. Docker 存储卷
  10. stm32的内存分布