本帖最后由 卑鄙的小黄人 于 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:冗余执行系统。
下面附上手绘图一张,我的设计想法初稿(主要是懒得敲,后期再补上,嘻嘻嘻)
PS:原先打算使用电流传感器来判断主MCU输出状态是否正常的,后来想想打算直接采用ADC进行判断。(未完待续~)
继续更新~
趁着今天有空,便抱着电脑待实验室了,准备把着东西做出来~~
问题也是一个一个冒出来~
不过既然发现了问题,那我们就解决问题。
原计划使用赛元003学习开发板的,由于活动时间快结束了,对于赛元开发板的板上资源不太熟悉,时间不足,所以将主控板和从控板都改成使用STC12C5A60S2做为主控芯片。emmmm好像STC12C5A60S2没有两片,我明天在接着找找,不然就尴尬了。
本次计划使用国产MCU,诸如STC,赛元系列的,所以显示模块便选择了LCD12864等分辨率较低的点阵屏,因为TFT这些显示屏对选用的MCU的负担太大了,故不采用。尴尬的是,掏出之前买好的LCD12864,嗯,没错,用不了。是坏的,我要投诉!生气!我的40大洋 哭~~~
好吧,采用B计划,没错,就是备胎计划,使用LCD1602进行输出显示。
OK,已经写好部分程序,等明天调试,看看效果,嗯,还有再找多一块STC12C5A60S2出来,祝我好运。
说一下设计思路,主控板就很简单了,正如上面的手绘纸画的那般,ADC检测,输出显示,控制LED,增加按键功能备用。
从控板就稍稍有点绕,在硬件上,打算采用继电器来控制主控板对LED的输出控制,当主控板异常时,主控板连接LED的线路被断开,从控板到LED的线路接通。
软件上,使用两个ADC检测通道,一个检测电压的输入,一个检测主控板IO的输出,即对LED的状态的检测(检测IO的高低电平,对应LED的亮灭,本次使用负逻辑控制,即高电平对应LED灭,低电平对应LED亮);值得一提的是,如何实现对闪烁状态的判断,采用了定时器,进行定时检测判断。(其实我觉得可以不用定时器,也可以使用多次检测为同一个值时,判定为不闪烁,即满足N次以内,IO的输出电平必须要变化,否则为不闪烁状态)
emmm,大体是这样,详细回头我会把程序放上来。
(PS:支持国产,未完待续~)
我回来了~
现在将设计内容介绍完善。。
**没出错,翻箱底让我把以前买的STC12C560S2芯片翻了出来,不需要再次更改设计方案了,顺利进行冗余系统地开发~
OK!上文已经阐述了本设计的设计思路,于是便根据设计思路,进行程序开发,本设计的重点便是利用单片机的AD资源和定时器的使用,在这两个问题顺利解决后,便完成一大半了,进行根据逻辑分析,完成其余的功能要求。完成程序设计后,嗯~~~~焊接电路板!(一开始用跳线链接开发板和模块,测试好程序后,再焊在一起)。
在设计过程中,我都尽量争取使用常见模块,和运用简单易懂的程序语句(也加了许多注释),旨在帮助刚入门的花朵,但大佬是我学习的对象,不是我帮助的对象,哈哈哈。
成品效果图
我还拍了几张焊接过程的图片,贴一下
视频明天补,宿友睡觉了,关灯了,拍的效果不好。
源程序整理后发出。
总结:
所使用的硬件:
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等,本次由于时间原因,很遗憾没有搞)
|