查看: 8401  |  回复: 7
基于STM32的电动门控制器
MartinYU
2
主题
7
回复
发表于2017-06-01 21:37:23 | 显示全部楼层
1# 电梯直达

【报名阶段需要填写的内容】


1. 参赛者姓名(必填项):俞丹华


2. 单位或学校名称(必填项):浙江威奇电气


3. 当前职务或职称(必填项):工程师


4. 参赛作品的名字(必填项):基于STM32的电动门控制器


5. 简要陈述您的idea和作品(必填项):这款控制器可以用于辅助庭院不锈钢移门的开关,改造不带电动的不锈钢移门。通过在移门上增加链轮及链条,用直流电机驱动链轮,链轮带动链条驱动不锈钢移门运动,用霍尔传感器定位移门的位置,电机过流检测防止移门堵住烧坏电机,继电器控制直流电机正反转,遥控器实现门远程开关,以上所有的控制都由STM32芯片负责。


6. 拟用到的立创商城在售物料(必填项):STM32F103C8T6、IRF3205、JQC3FF、LM358、AMS1117-3.3、MP2451等


7. 拟用到的非立创商城物料或其它补充(必填项):RFM22B、24V开关电源、直流电机、链条、钣金、弹簧等


【作品正式发表(报名成功后进入设计阶段)需要填写的内容】


一、作品简介

例如,可以包括但不局限于以下内容:

1.作品的整机外观图片或焊接组装好的PCBA图片;

  

遥控

   

控制


钣金图

链条延伸钣金

   


直流减速电机固定板

 


加固板


直流减速电机
 

 

2.作品的研究背景、目的和功能、市场应用前景;

    本作品是针对家庭的庭院不锈钢移门改电动而开发的,能够以较少的成本改手动移门为电动移门。


3.作品在创新性、趣味性、实用性甚至公益性方面,有哪些亮点可体现?

        创新的运用链条传动的原理,将电机的圆周运动变成移门的直线运动,且通过检测电机过载保护实现门的自动停止,防止门没有运行到限位点而造成事故。控制系统还具备手动推拉启动功能,即在门停止时,通过推门或者拉门,能自动实现开、关门。远程遥控器能实现远程开、关、停移门的功能。


二、系统构架图

用流程图或思维导图等形式,描述您的作品的组成构架,即方案图。

       

 


三、硬件部分的描述

1.附上原理图&PCB实物图的图片或者源文件(官方建议大家尽量用源文件上传),如果是图片,请确保图片是清晰可辨的;

遥控部分原理图PCB:遥控.rar 

控制驱动部分原理图PCB:控制驱动.rar 


2.用文字把该作品的实现原理、系统的工作过程大致讲解一下。

    本作品由遥控部分和控制部分两部分组成。

遥控部分主要由MCU433M无线模块、按键、LED指示及电池这几部分组成。电池负责为整个系统供电;3个按键分别控制电机正转、反转及停止,LED指示在发送报文时闪烁;当无按键按下时,约10秒后进入低功耗状态,有按键按键自动退出低功耗状态(通过外部中断唤醒MCU),通过433MHz无线模块发送按键码。

控制部分主要由MCU433MHz无线模块、按键、电机驱动、过载检测、门运动方向检测、LED指示及电源这几部分组成。电源采用24V直流电源;MCU通过电机驱动电路控制直流电机正反转;433MHz无线模块负责与遥控部分通信;按键部分可以本地手动开、关和停;过载检测实时检测电机电流状态,当电流超过设定值时停止电机运行,保护电机及防止事故; 门运动检测可以检测手动门运动状态,将手动状态转换成自动状态;LED指示显示运行状态及报错。



四、材料清单(BOM列表)

列出您这个作品所用到的主要器件(关键器件即可),比如单片机&ARM芯片、专用集成芯片(ASIC)、传感器、功能模块等。

如果所列出的芯片是来自我们立创商城上的,最好能写出该器件的商品编号或附上对应购买链接。

MCU       STM32F103C8T6      商品编号;C8734
DCDC芯片  MP2451             商品编号;C14123
运放      LM258              商品编号;C7928
MOS       IRF3710            商品编号;C2562
无线模块  RFM22B
继电器    G5Q-14
直流减速电机



五、软件部分的描述(选填)

如果您的作品涉及到软件,请列出作品对应的软件工作流程图,及关键部分的例程、源码(如果您想开源的话请上传全部源码)。

   

控制部分关键程序代码

滴答定时器中断     1mS

ADC1_value[Adc_CNT] = ADC_GetConversionValue(ADC1);   //ADC采样 1mS 一次

  Adc_CNT++;

  if(Adc_CNT == 16)

  {

    Adc_CNT = 0;

  }

  LED_Flash_CNT++;

  if(LED_Flash_CNT == 500)

  {

    SET_LED_RUN;

  }

  else if(LED_Flash_CNT == 1000)

  {

    CLR_LED_RUN;

    LED_Flash_CNT = 0;

  }  

 

  if(Door_Running == 1)

  { 

    if(Door_Run_CNT == 200)

    {

      Door_Running = 0;

      Soft_CTR_Step = 0;

    }    

  }

  else

  {

    if(Soft_CTR_Flag == 1)      //缓启动

    {

      Soft_CTR_Step++;

      if(Soft_CTR_Step == Step1)

      {

        TIM_Configuration_1(Pwm1);

      }

      else if(Soft_CTR_Step == Step2)

        {

            Soft_Start_Flag = 0;

            TIM_Configuration_1(Pwm2);

        }

        else if(Soft_CTR_Step == Step3)

            {

                TIM_Configuration_1(Pwm3);

            }

            else if(Soft_CTR_Step == Step4)

                    {

                        TIM_Configuration_1(Pwm4);  

                    }

                 else if(Soft_CTR_Step == Step5)

                        {

                            TIM_Configuration_1(Pwm5);

                            Soft_CTR_Flag = 0;

                        } 

    }

  }

 

  if(Stop_Flag == 1)        //卡停后,回退100mS

  {

    Stop_CNT++;

    TIM_Configuration_1(Pwm2);

    if(Stop_CNT == 100)

    {

      TIM_Configuration_1(0);

      Stop_Flag = 0; 

      Stop_CNT = 0;

    }

  }

 

  Door_Run_CNT++;

  if(Door_Run_CNT == CLR_ERROR_LED_CNT)

  {

    CLR_LED_ERROR;

  }

  if(Door_Run_CNT == Door_Run_Limit_T)      //关门超时停机保护

  {

    TIM_Configuration_1(0);

    Door_Stop = 1;  

  }

 

定时器2中断                             10mS

    if(Door_L_Flag == 1)

    {

      Door_L++;

    }

    if((Door_Open_Flag == 1) && (Door_L_Flag == 0))

    {

      if(Door_Dir == 1)     //门打开

      {

        if(Door_RUN_Time < Door_T_max)

        {

          Door_RUN_Time++ ;

        }

        else

        { 

          TIM_Configuration_1(0);

        }

      }

      else if(Door_Dir == 2)    //门关闭

            {  

                if(Door_RUN_Time > 0)

                Door_RUN_Time-- ;

                else

                {

                  TIM_Configuration_1(0);

                }

            }

    }

    else

    {

       

    }

    Adc1_Sum = 0;

    for(i = 0; i < 16; i++)

    {

        Adc1_Sum += ADC1_value[i];

    }

    Adc1_Ave = Adc1_Sum / 16;   //过载AD计数

    if((Adc1_Ave > Over_Load_ad) && (Soft_Start_Flag == 0) && (Over_Load_Flag == 0))    //过载检测处理

    {

      Over_Load_Flag = 1;

      SET_LED_ERROR; 

      Soft_CTR_Flag = 0; 

      Stop_Flag = 1;

      Door_Run_CNT = 0;

      TIM_Configuration_1(0);

      Door_Stop = 1;

      ClrRelay1;

      ClrRelay2;

      if(Door_Dir == 1)

      {

        Door_Dir = 2;

        SetRelay2;

        ClrRelay1;

      }

      else if(Door_Dir == 2)

            {

              Door_Dir = 1;

              SetRelay1;

              ClrRelay2;

            }

      if(Door_Open_Flag == 1)

      {

         Door_Open_Flag = 0;

         if(Door_Dir == 1)

         {

           Door_Dir = 2;

           if(Door_RUN_Time > Door_T_max)

           {

              Door_RUN_Time = Door_T_max;

           }

         }

         else if(Door_Dir == 2)

                {

                   Door_Dir = 1;           

                }

      }

       

      if(Door_L_Flag == 1)

      {

        Door_L_Flag = 0;

        Door_T_max = Door_L;

        Door_RUN_Time = Door_T_max;

        Door_L = 0;

      }

    }

 

    if((Door_Open_state == 0) && (Door_Stop == 1))  //手动开门检测

    {

      Door_Open_CNT++;

      if(Door_Open_CNT > 10)

      {

        Door_Stop = 0;

        Door_Open_CNT = 0;

        Door_Open_Flag = 1;

        SetRelay1;

        ClrRelay2;

        Door_Dir = 1;

        Soft_CTR_Flag = 1;

        Soft_CTR_Step = 0;

        Door_Run_CNT = 0; 

      }

    }

    else

    {

       Door_Open_CNT = 0;

    }

       

    if((Door_Close_state == 0) && (Door_Stop == 1)) //手动关门检测

    {

      Door_Close_CNT++;

      if(Door_Close_CNT > 10)

      {

        Door_Dir = 2;

        Door_Stop = 0;

        Door_Open_CNT = 0;

        Door_Open_Flag = 1;

        SetRelay2;

        ClrRelay1;

        Soft_CTR_Flag = 1;

        Soft_CTR_Step = 0;

        Door_Run_CNT = 0; 

      }

    }

    else

    {

      Door_Close_CNT = 0;

    }




六、作品演示

请上传您的作品的功能演示到腾讯视频,并编辑到本楼(或附上视频链接)。按要求上传视频可获得5分,具体详见活动规则。

基于STM32的电动门控制器


七、总结

例如您在完成该作品过程中的一些体会、碰到的技术问题或调试经验、作品的未来规划,及对我们主办方的建议和意见等。


   通过本作品的制作,了解了电机启动过程的浪涌冲击电流是运行电流的好多倍,借助示波器可以清晰的看到浪涌的波形,对浪涌保护的处理刚开始采用实时监测报警,发现启动时的电流远远比工作时堵转的电流大,无法两者兼得,后运用示波器观察启动电流,采取启动时,暂停保护约200多毫秒,避开启动瞬间大电流,后启动和过载保护都正常。在试样过程中PCB板子的打样及器件的采购比较方便,嘉立创PCB及立创商城的时效非常好,5天时间就能拿到板子及器件,就能焊接线路板调试。

外围的钣金加工就不是很顺利,最先找一个朋友帮忙做,对方太忙拖了好久,一直都没有做好,最后在临近结束时终于做好了。激光切割的钣金,尺寸刚刚好。如果做钣金的厂家也能有一家像嘉立创一样能够DIY的就非常好。

通过程序的编写调试,发现由于开始程序没有考虑的很多,后面的变量定义了一大堆,有点杂乱。这就使程序编写前将想法写成流程图,然后再按照流程图编程程序尤为重要,本人一直从硬件开发工作,软件好久没有写了,突然要写些程序,发现BUG非常多,程序移植过来的时候,调试了好久才调通的,实属不易。由于本身硬件的原因,手动开关门目前只支持一个方向,但可以通过切换继电器来换方向。硬件电路的继电器默认状态具有刹车功能,所以当停电时,电机被锁开门非常费劲,所以后面又在电机输出线上串接了一个开关,可以手动关闭控制。硬件电路调试还算顺利,但机械结构安装到位后,出现了新的问题,齿轮和链条咬合的松紧不一样,原来门的轨道有高低,门从关到开的整个行程中,门上端离齿轮的距离最大的大概有5mm,这样齿轮就容易脱出链条而打滑,门就走不了了。可见直接连接不是最好的方案,是否有比这个方案更方便可靠,还需要继续研究。

        虽然本作品没有完全成功,但是通过对本作品制作及调试,提升了我软件编程的水平,在此感谢立创商城举办的这次活动,能够参与到这次活动感到很荣幸。



立创小程
【官方工作人员】
7
主题
204
回复
发表于2017-08-26 13:06:49   |  显示全部楼层
7#
恭喜楼主获得了第二届立创商城电子制作节入围奖,虽然距离30强还有些小差距,30强&入围奖名单:http://club.szlcsc.com/article/details_8910_1.html
但到明年的第三届电子制作节,带上您更成熟的作品参赛时,也许就能一举夺冠了呢,现在,有众多优秀作品让你参考,投票:http://club.szlcsc.com/article/details_8913_1.html
不断前行

主题

回复
  • 温馨提示: 标题不合格、重复发帖、发布广告贴,将会被删除帖子或禁止发言。 详情请参考: 社区发帖规则
  • 您当前输入了 0 个文字。还可以输入 8000 个文字。 已添加复制上传图片功能,该功能目前仅支持chrome和火狐

禁言/删除

X
请选择禁言时长:
是否清除头像:
禁言/删除备注:
昵 称:
 
温馨提示:昵称只能设置一次,设置后无法修改。
只支持中文、英文和数字。

举报

X
请选择举报类型:
请输入详细内容:

顶部