找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2623|回复: 0
收起左侧

单片机软保护电机的自动抽水系统原理图与程序设计

[复制链接]
ID:341842 发表于 2020-12-15 18:02 | 显示全部楼层 |阅读模式
分享一个小项目与大家一起学习交流,因为个人工作等原此还是为初稿,未做进一步的升级完善优化。如后期有时间增加一些功能往智能型,显示,水位等。

设计初终:发现市面卖的一些产品,要么价格高,要么保护电机方案采用硬件,硬件探头容易引起失效,还在电极被污化后没有很好起到保护,所以造成一些如电机线路损坏,水漫金山。这些现象都在设备后期使用久后的根问题。为此下面采用软件逻辑及检测判断的思路来有效的设计一个保护,把保护级别为最高,这样就算有故障也保护财产的安全,降成不必要损失。


设计核心:
1.采用新唐N76e003单片机方案:性价比高,芯片功能强大,足够满足些系统的设计;
2.水位检测方案:采用电极检测(ps:初稿只做适用性开发,未做水位显示);
3.供电方案:采用5V系统 及电极检测,安全性及利用(ps:好多闲置的手机充电器);
4.控制方案:采用小功率继电器+接触器方案;
5.程序方案:带保护电机方案,电极故障判断;

设计思路原理:
1.电路板电源部份:只需更换对应参数的转换LDO芯片等相关器参数,电源可以改9V、12V。
2.继电器部分:没有选择用大功率30A的设计,而选用小功能率的原因是电机一般都启动电流大,理论上30A继电器也是够的,但大功率的继电触点还是不及于小型接触来得稳定可靠(ps:这个用久你就知道)所以选择小功率继电器,继电器-->接触器-->电机。
3.电极检测部份:采用三极管利用极管原理,做为电极检测(ps:这个部份可以加处光耦效会更好)。
4.指示部份:采用LED指示,状态:运行,停止,故障,模式。
5.按键部分:手动/自动模式,电极故障时可启用手动模式,手动模式状态下,开启后在预定或电极检测一定后自动停止运行。

附件:
设计的原理图
设计程序源码
Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)
51hei.png 51hei.png

单片机源程序如下:
  1. /********************************************************************************
  2. * @                            水塔自动抽水控制器
  3. * @项目: shuita
  4. * @描述:  1.通过检测高低水位信号  
  5.                                          2.实现继电器的开关,控制电机的开启关闭
  6. * @版本:V2.0
  7. * @备注:开机默认为内部高速HIRC(16M)
  8. ********************************************************************************/
  9. #include "N76E003.h"
  10. #include "Common.h"
  11. //#include "Delay.h"
  12. #include "timer.h"
  13. #include "SFR_Macro.h"
  14. #include "Function_Define.h"

  15. #include "relay.h"
  16. #include "led.h"
  17. #include "key.h"
  18. #include "waterlevel.h"
  19. #include "watchdog.h"

  20. /******************************************************************************
  21. *@  状态/标记/变量定义
  22. *@
  23. ******************************************************************************/

  24. ////高水位时间必须大于低水位时间 20200625  增加高低水故障判断时间分开
  25. #define H_OVERTIME 60 //单位:分  max=255/60=4h15分
  26. #define L_OVERTIME 30 //单位:分  max=255/60=4h15分

  27. //debug
  28. //#define H_OVERTIME   3        //单位:分  max=255/60=4h15分
  29. //#define L_OVERTIME   1                //单位:分  max=255/60=4h15分

  30. //全局变量
  31. uint8_t timerCountBuff; //高/低水位定时器计数
  32. bit openWorkFlag = 0;
  33. bit stopWorkFlag = 0;
  34. bit autoModeLock = 1; //1为自动

  35. uint8_t workStep = 0;

  36. /*****************************************************************************
  37. *@  函数声明
  38. *@
  39. ******************************************************************************/
  40. void allGPIOConfig(void);
  41. void motorAutoWork(void);
  42. void motorManualWork(void);

  43. /*****************************************************************************
  44. *@  main 函数
  45. *@
  46. ******************************************************************************/
  47. void main(void)
  48. {
  49.         openWorkFlag = 0;
  50.         timerCountBuff = 0;

  51.         allGPIOConfig();
  52.         allTimerInit();
  53.         keyInit();
  54.         watchdogInit();

  55.         while (1)
  56.         {

  57.                 keyProceWork();
  58.                 if (autoModeLock)
  59.                 {
  60.                         feedDog();
  61.                         ioLedAutoON;
  62.                         motorAutoWork();
  63.                 }
  64.                 else //if(autoModeLock == 0)
  65.                 {
  66.                         feedDog();
  67.                         ioLedAutoOFF;
  68.                         motorManualWork();
  69.                 }
  70.                 feedDog();
  71.         }
  72. }

  73. /*******************************************************************************************************************
  74. *@  名称:void allGPIOConfig(void)
  75. *@        功能:实现所需io初始化
  76. *@        描述:
  77. *@        输入:none
  78. *@        输出:none
  79. ******************************************************************************************************************/
  80. void allGPIOConfig(void)
  81. {
  82.         //Set_All_GPIO_Quasi_Mode;
  83.         relayInit(); //继电器初始化
  84.         ledInit();         //指示灯初始化
  85.         waterLevelInit();
  86. }

  87. /************************************************************************************
  88.   @函数:void motorAutoWork(void)
  89.   @输入:times  高水位计时时间
  90.         @返回:none
  91.         @描述:
  92.                                  1.缺水: 低水位电极检测到无水,后启运抽水
  93.                                  2.有水:低水位电极检测到有水,则不进行抽水
  94.                                  3.上水:过程中在设定时同检测,高低电极如果异常则停止自动抽水显示故障
  95.                                  4.上水-停水:正常过程中判断高水位电极是否电平,如有则停止抽水

  96.         @设计:byJin
  97.         @日期:2020/04/10
  98. **********************************************************************************/
  99. void motorAutoWork(void)
  100. {
  101.         bit waterLevelFlag = 0;

  102.         switch (workStep)
  103.         {
  104.         case 0:
  105.         {
  106.                 //缺水判断
  107.                 waterLevelFlag = lowLevelCheck();
  108.                 if (waterLevelFlag == 0)
  109.                 {
  110.                         workStep = 1;
  111.                 }
  112.                 else if (waterLevelFlag == 1)
  113.                 {
  114.                         workStep = 0;
  115.                 }
  116.                 break;
  117.         }
  118.         case 1: //水满 -停水
  119.         {
  120.                 waterLevelFlag = highLevelCheck();
  121.                 if (waterLevelFlag == 0) //未到高水位继续运行
  122.                 {
  123.                         TR0 = 1;
  124.                         relayWork(1);
  125.                         runWorkLedFlash();
  126.                         workStep = 1;

  127.                         //低水位电极异常,指定时间检测无效则停机保护
  128.                         if (timerCountBuff == L_OVERTIME && lowLevelCheck() == 0)
  129.                         {
  130.                                 TR0 = 0;
  131.                                 timerCountBuff = 0;
  132.                                 workStep = 2;
  133.                         }

  134.                         //高水位电极异常,指定时间检测无效则停机保护
  135.                         if (timerCountBuff == H_OVERTIME && highLevelCheck() == 0)
  136.                         {
  137.                                 TR0 = 0;
  138.                                 timerCountBuff = 0;
  139.                                 workStep = 2;
  140.                         }
  141.                 }
  142.                 //电极探到高水位
  143.                 else if (waterLevelFlag == 1)
  144.                 {
  145.                         TR0 = 0;
  146.                         relayWork(0);
  147.                         ioLedStopON;
  148.                         ioLedRunOFF;
  149.                         workStep = 0;
  150.                 }
  151.                 break;
  152.         }
  153.         case 2:
  154.         { //电极探头异常,存在故障 自动模式无法使用
  155.                 TR0 = 0;
  156.                 relayWork(0);
  157.                 ioLedStopON;
  158.                 ioLedRunOFF;
  159.                 ioLedHitchON; //故障灯亮
  160.                 workStep = 2; //切换回自动后故障未解除也不能工作,此值未改变
  161.         }
  162.         break;
  163.         default:
  164.                 relayWork(0);
  165.                 break;
  166.         }
  167. }

  168. /************************************************************************************
  169.         @函数:void motorManualWork(void)
  170.   @输入:times  高水位计时时间
  171.         @返回:none
  172.         @描述:
  173.                                  1.手启自停 -->停采用高电极或延时判断
  174.                                  2.高水位电极有效,则按开无效不进行启动
  175.         @设计:byJin
  176.         @日期:2020/04/10
  177. **********************************************************************************/
  178. void motorManualWork(void)
  179. {
  180.         if (openWorkFlag && highLevelCheck() == 0 && timerCountBuff < H_OVERTIME && stopWorkFlag == 0) //高水位电极未检测到满且手动开启,则启动

  181.         { //启动进中,按开无效,只能按关才有效
  182.                 TR0 = 1;
  183.                 relayWork(1);
  184.                 runWorkLedFlash();
  185.         }

  186.         else

  187.         {
  188.                 //                 if(timerCountBuff == H_OVERTIME || highLevelCheck() == 1 ||stopWorkFlag == 1) //高水位电极检测满则-- 停止
  189.                 //                        {                                                                                                                                                                                                                                                        //采用3种方法停止:定时停止、高水位电极检测停止和手动按关停止
  190.                 TR0 = 0;
  191.                 relayWork(0);
  192.                 ioLedStopON;
  193.                 ioLedRunOFF;
  194.                 ioLedHitchOFF;
  195.                 timerCountBuff = 0;
  196.                 openWorkFlag = 0;
  197.                 stopWorkFlag = 0;
  198.                 return;
  199.                 //                        }
  200.         }
  201. }
复制代码
51hei.png

全部资料51hei下载地址:
shuita.rar (1.48 MB, 下载次数: 15)

评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表