[创新制造展示] 【21ic第三届设计大赛】+使用国产MCU制作冗余执行系统

[复制链接]
2007|8
 楼主 | 2019-6-25 12:49 | 显示全部楼层 |阅读模式
本帖最后由 卑鄙的小黄人 于 2019-7-4 00:02 编辑

   21ic第三届设计大赛又双叒叕来啦!~~~
   一直想参加, 趁着活动还没结束,赶紧参加一波~

  这次设计大赛有两个题目,分别是竞赛主题A:数字函数发生器  和  竞赛主题B:冗余执行系统。考虑了一下,感觉竞赛主题B更有意思一些,所以选做竞赛主题B:冗余执行系统。最近又因为老美的封锁事件搞得沸沸扬扬,故本次设计大赛,打算使用国产MCU来实现冗余执行系统的设计要求与功能。
   
  一、问题分析
竞赛主题B:冗余执行系统        
            
                            

            基础项目:            

                1. 两个MCU分别作为主控制器与从控制器, 接了同一个ADC输入, 同一个LED输出. 正常情况下主控器完成如下控制模式:    ADC读值分为三个档位[adc_val < LIMIT_A,  (adc_val >= LIMIT_A) && (adc_val <= LIMIT_B), adc_val > LIMIT_B], 分别对应LED的三种状态[灭, 3Hz闪烁, 常亮]    ADC的输入建议使用电位器进行控制, LED输出控制建议使用负逻辑控制(输出低LED亮)。            

            

                2. 从控制器同时读取ADC的读数并监视LED输出情况, 监视的状态可以查看, 如接有小屏幕或者通过串口输出当前状态[ADC读数, LED输出状态], 刷新间隔2秒或更短。            

            加分项目:            

                1. 破坏主控制器的控制功能, 使之不能完成控制功能, 如通过外部调试器擦除主控制器固件, 或者按键输入,或者直接断开主控制器与LED的电路连接使之不对LED进行输出, 而输出高阻状态. 此时从控制器能检测出主控制器没有完成控制功能。            

            

                2. 上述故障发生时, 从控制器能够接管控制功能, 从主控制器发生故障不能完成控制功能到从控制器接管间隔为2秒或更短。            

            

                3. 通过外部调试器或者按键输入使得主控制器能完成控制功能, 但与预先设定的不一样, 比如对应三种ADC读数档位全部输出LED亮. 此时从控制器能检测到该状况, 能够断开主控制器(通过控制主控器的复位引脚或者总电源开关)并接管控制功能。




通过上述要求和示意图可知,本系统需要最少两个MCU配合工作,本着支持国产的小心思,打算尝试使用宏晶科技和赛元科技的MCU来在制作本次设计大赛的 竞赛主题B:冗余执行系统。


下面附上手绘图一张,我的设计想法初稿(主要是懒得敲,后期再补上,嘻嘻嘻)
11.jpg

PS:原先打算使用电流传感器来判断主MCU输出状态是否正常的,后来想想打算直接采用ADC进行判断。(未完待续~)




继续更新~
趁着今天有空,便抱着电脑待实验室了,准备把着东西做出来~~

问题也是一个一个冒出来~

不过既然发现了问题,那我们就解决问题。

原计划使用赛元003学习开发板的,由于活动时间快结束了,对于赛元开发板的板上资源不太熟悉,时间不足,所以将主控板和从控板都改成使用STC12C5A60S2做为主控芯片。emmmm好像STC12C5A60S2没有两片,我明天在接着找找,不然就尴尬了。

1.jpg




本次计划使用国产MCU,诸如STC,赛元系列的,所以显示模块便选择了LCD12864等分辨率较低的点阵屏,因为TFT这些显示屏对选用的MCU的负担太大了,故不采用。尴尬的是,掏出之前买好的LCD12864,嗯,没错,用不了。是坏的,我要投诉!生气!我的40大洋  哭~~~

2.jpg

好吧,采用B计划,没错,就是备胎计划,使用LCD1602进行输出显示。


4.jpg

OK,已经写好部分程序,等明天调试,看看效果,嗯,还有再找多一块STC12C5A60S2出来,祝我好运。

说一下设计思路,主控板就很简单了,正如上面的手绘纸画的那般,ADC检测,输出显示,控制LED,增加按键功能备用。
从控板就稍稍有点绕,在硬件上,打算采用继电器来控制主控板对LED的输出控制,当主控板异常时,主控板连接LED的线路被断开,从控板到LED的线路接通。
软件上,使用两个ADC检测通道,一个检测电压的输入,一个检测主控板IO的输出,即对LED的状态的检测(检测IO的高低电平,对应LED的亮灭,本次使用负逻辑控制,即高电平对应LED灭,低电平对应LED亮);值得一提的是,如何实现对闪烁状态的判断,采用了定时器,进行定时检测判断。(其实我觉得可以不用定时器,也可以使用多次检测为同一个值时,判定为不闪烁,即满足N次以内,IO的输出电平必须要变化,否则为不闪烁状态)
emmm,大体是这样,详细回头我会把程序放上来。  
(PS:支持国产,未完待续~)

我回来了~
现在将设计内容介绍完善。。

记忆没出错,翻箱底让我把以前买的STC12C560S2芯片翻了出来,不需要再次更改设计方案了,顺利进行冗余系统地开发~

OK!上文已经阐述了本设计的设计思路,于是便根据设计思路,进行程序开发,本设计的重点便是利用单片机的AD资源和定时器的使用,在这两个问题顺利解决后,便完成一大半了,进行根据逻辑分析,完成其余的功能要求。完成程序设计后,嗯~~~~焊接电路板!(一开始用跳线链接开发板和模块,测试好程序后,再焊在一起)。

在设计过程中,我都尽量争取使用常见模块,和运用简单易懂的程序语句(也加了许多注释),旨在帮助刚入门的花朵,但大佬是我学习的对象,不是我帮助的对象,哈哈哈。

成品效果图
IMG_20190630_234145.jpg

1.jpg

IMG_20190630_230252.jpg

IMG_20190630_230239.jpg



我还拍了几张焊接过程的图片,贴一下
37959dc78c3376abde01032a85cb12b.jpg


6137add6b54b563802c67b087c4c09e.jpg


4713cbd15e38eb8b599125f437cd161.jpg

dbc4599c1ac7d893d8c0895d7865b19.jpg


3d1a478dd2a4dedbe25ddd420596c21.jpg



视频明天补,宿友睡觉了,关灯了,拍的效果不好。
源程序整理后发出。


总结:
所使用的硬件:

stc12C5A60S2   *2
LCD1602          *1
白发红LED        *1
5V继电器模块    *1
11.0592晶振      *2
瓷片电容30PF    *4
40DIP底座         *2
10uf电容           *2
103滑阻            *2
15cm*20cm洞洞板 *1
16P排母            *1
跳线                 若干
排针                 若干

制作心得

本着使用国产MCU,进行了此次的开发。总体来说,这是较为简单的开发方案,适合大多数入门新手进行学习。
就题目来讨论,该冗余执行系统的基础功能简单来说便是:

1、实现AD转换
2、根据AD转换的值分等级,并控制LED的状态
3、实现人机交互,用LCD或者上位机

可以看出这一块还是挺简单的,相信大多数人都能一步一步从而开发出来。

那么冗余执行系统的加分功能是:
1、实现“冗余”,便是实现热备用这一功能
2、用2秒以内甚至更短时间实现“1”功能


那么这一块主要涉及到逻辑状态分析,并以此编写程序

那么这一块便需要一个传感器来检测主MCU的输出状态,判断其工作状态是否正常。
在这里,我用的是ADC,实时检测主MCU的输出状态,并且根据电压的输入来判断主MCU的工作状态是否正常。也就是,主MCU的输出和电压的输入需要一一对应,否则便是错误的工作状态。

那么当主MCU出现错误的工作状态时,便需要切断其输出,在这里可以使用继电器,简单粗暴。

主MCU的输出有三种状态:
1、常亮
2、闪烁
3、常灭
要判断其输出状态,可以用伏安特性与同电位等逻辑分析方法,去分析其输出电压,这样就能解决这道题加分功能最麻烦的一点了,并用ADC检测,从而得到其输出状态。为防止误判,可多次检测,再进行判断。

展望:
类似于此类项目,可增加一些人性化的功能,满足用户的多样性需求(如:微信小程序,云服务,APP等,本次由于时间原因,很遗憾没有搞)




使用特权

评论回复
| 2019-6-26 21:07 | 显示全部楼层
新活动?限定MCU类型了?

使用特权

评论回复

评论

卑鄙的小黄人 2019-6-30 12:06 回复TA
没,不限。个人想用国产MCU做 
 楼主 | 2019-7-2 10:18 | 显示全部楼层
源程序
冗余执行系统.rar (79.94 KB, 下载次数: 2)

使用特权

评论回复
 楼主 | 2019-7-2 17:22 | 显示全部楼层
演示视频


使用特权

评论回复
 楼主 | 2019-7-4 00:01 | 显示全部楼层
总结
我谈一下我所做的这套冗余执行系统的工作机制。主MCU通过片上的10ADC检测电压输入,判断并控制LED的工作状态。从MCU负责实现热备用,所以不仅需要通过片上的10ADC检测电压输入,还通过片上的10ADC检测主MCU的输出,即负载的工作状态,并以此进行对电路是否出现异常的判断,若出现异常通过继电器切断主MCU的输出,从MCU与负载的回路闭合,最终实现自动接管主MCU的工作,实现冗余。


关于
大佬所提到的下面几个问题,我也做一下回答。



失效的原因有很多种: 工程现场EMI干扰, 软件设计的bug, 硬件本身的bug, 操作者的失误, 其他系统的破坏性输入……关于这点,在设计时便有所考虑,所以设计时,避免中间环节的小意外,致使冗余功能无法实现,采用起点----终点的无敌检测判断,从物理上直接检测最开始的信号输入,到最终的负载工作状态,如此避免了中间环节出现问题,缺检测的不到的情况。


关于第二套冗余系统能够做到这几点:
1.        平时不能干扰原系统的正常运行,
在设计时,第二套冗余系统是独立运行的。第二套冗余系统与负载的连接以及对主回路的控制是通过继电器进行隔离与控制的。


2.        能最大限度精确的判断主系统的失效, 比如主系统仅仅部分失效的情况下, 从系统能否监测到. 从系统能否在监测到主系统失效的时候给予主系统恢复的机会, 如给予主系统复位信号, 对主系统失效次数进行计数,超过一定限度才认为主系统无可救药.
前面说到,有许许多多的因素可能致使主系统工作异常,如系统宕机,电压不稳,等等,所以在设计时,便加入了一个防误判的检测机制,也便是对主系统失效次数进行计数。(常灭和常亮检测是100次,闪烁是50次)。尝试拯救主系统这个功能没加,个人认为亦可通过继电器对主系统的电源或主MCU的复位引脚实现重启系统的功能。


3.        从系统能否隔离主系统, 如在主系统无法恢复的情况下直接关断主系统的电源
设计时,是直接切断主系统的输出,隔离主系统与负载的连接。(我觉得这个可以根据实际情况设定把,不该设定要求,或许检修人员需要现场查看,记录主系统的错误信息,或者其他情况等等)

4.        主从能不能对调, 比如主从系统使用一套代码.
我所设计的冗余执行系统,从系统是在主系统的基础上进行开发设计的,增加了继电器控制,与对主系统工作状态的判断,所以主从对调是可行的。(不过表现出来外在区别就是,从系统的显示器上有“Y”或“N”,用于告诉用于用户主系统的工作状态是否异常)

使用特权

评论回复
| 2019-7-6 22:12 | 显示全部楼层
学习了

使用特权

评论回复
| 2019-7-8 13:10 | 显示全部楼层
看到洞洞板后面的焊接,想起当年大学时光....

使用特权

评论回复

评论

卑鄙的小黄人 2019-7-8 13:16 回复TA
哈,都是回忆 
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

关闭

热门推荐上一条 /7 下一条

在线客服 快速回复 返回顶部 返回列表