查看:
9158
|
回复:
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.用文字把该作品的实现原理、系统的工作过程大致讲解一下。 本作品由遥控部分和控制部分两部分组成。 遥控部分主要由MCU、433M无线模块、按键、LED指示及电池这几部分组成。电池负责为整个系统供电;3个按键分别控制电机正转、反转及停止,LED指示在发送报文时闪烁;当无按键按下时,约10秒后进入低功耗状态,有按键按键自动退出低功耗状态(通过外部中断唤醒MCU),通过433MHz无线模块发送按键码。
控制部分主要由MCU、433MHz无线模块、按键、电机驱动、过载检测、门运动方向检测、LED指示及电源这几部分组成。电源采用24V直流电源;MCU通过电机驱动电路控制直流电机正反转;433MHz无线模块负责与遥控部分通信;按键部分可以本地手动开、关和停;过载检测实时检测电机电流状态,当电流超过设定值时停止电机运行,保护电机及防止事故; 门运动检测可以检测手动门运动状态,将手动状态转换成自动状态;LED指示显示运行状态及报错。
四、材料清单(BOM列表) 列出您这个作品所用到的主要器件(关键器件即可),比如单片机&ARM芯片、专用集成芯片(ASIC)、传感器、功能模块等。 如果所列出的芯片是来自我们立创商城上的,最好能写出该器件的商品编号或附上对应购买链接。
MCU STM32F103C8T6 商品编号;C8734
五、软件部分的描述(选填) 如果您的作品涉及到软件,请列出作品对应的软件工作流程图,及关键部分的例程、源码(如果您想开源的话请上传全部源码)。
控制部分关键程序代码 滴答定时器中断 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,这样齿轮就容易脱出链条而打滑,门就走不了了。可见直接连接不是最好的方案,是否有比这个方案更方便可靠,还需要继续研究。 虽然本作品没有完全成功,但是通过对本作品制作及调试,提升了我软件编程的水平,在此感谢立创商城举办的这次活动,能够参与到这次活动感到很荣幸。
|
立创商城工程部
【官方工作人员】
113
主题
1325
回复 |
发表于2017-06-02 10:21:26
|
显示全部楼层
2#
欢迎参与!您已经报名成功!
您现在就可以开始进行设计工作了,后期相关内容请在一楼编辑进行完善。 |
|