[创新制造展示]

【21ic第三届设计大赛】+STM32冗余执行系统

[复制链接]
3324|9
手机看帖
扫描二维码
随时随地手机跟帖
ddllxxrr|  楼主 | 2019-6-2 15:26 | 显示全部楼层 |阅读模式
本帖最后由 ddllxxrr 于 2019-6-2 18:16 编辑

一,构思
       根据大赛的要求:


      

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秒或更短。



加上配图,明显得两个MCU一起工作。
   img2.gif
于是,我就按如下设计接线,主板是STM32F103VET6,其上有可调的ADC源,并且引脚引出,我就把这个引脚接到STM32L053的ADC引脚上。

ADCADC.jpg
二,搭建环境

       大赛么,就得拿出东西,就用我的两块开发板加上五根连线就搞定了。他们分别是

       主板的PC0,PC1,PC2为LED输出,而副板的D3,D4,D5(nucleo板)分别为输入。而再有两板线分别连到主板的ADC2,而主板上有一个
可调电阻,可以调出0.1到3.1的电压来。另一板线自然接地。

       IMG_20190602_144938.jpg

三,编程

       由于用了两块板,自然用两种开发环境,有的看官说你显摆什么,用一种开发环境怎么不行了。我想说的是,nucelco那块板我用Mbed开发环境更简单啥!!!!
程序很简单的根据ADC转换结果输出到LED,而LED又接到副板。

      主板程序 :


#include "system.h"
#include "SysTick.h"
#include "led.h"
#include "usart.h"
#include "adc.h"


/*******************************************************************************
* º¯ Êý Ãû         : main
* º¯Êý¹¦ÄÜ                   : Ö÷º¯Êý
* Êä    Èë         : ÎÞ
* Êä    ³ö         : ÎÞ
*******************************************************************************/
int main()
{
        u8 i=0;
        u16 value=0;
        float vol;
        
        SysTick_Init(72);
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //ÖжÏÓÅÏȼ¶·Ö×é ·Ö2×é
        LED_Init();
        USART1_Init(9600);
        ADCx_Init();
        
        while(1)
        {
                i++;
//                if(i%20==0)
//                {
//                        led2=!led2;
//                }
               
                if(i%50==0)
                {
                        value=Get_ADC_Value(ADC_Channel_1,20);
                        printf("¼ì²âADֵΪ£º%d\r\n",value);
                        vol=(float)value*(3.3/4096);
                        printf("¼ì²âµçѹֵΪ£º%.2fV\r\n",vol);
                        if((vol>=0)&&(vol<1))
                        {
                        led1 = 0;
                        led2 = 1;
      led3 = 1;                                
                        }        
      else if((vol>=1)&&(vol<=2))
      {
                        led1 = 1;
                        led2 = !led2;
                        led3 = 1;
                        }
      else if(vol > 2)
      {                                 
      led3 = 0;
      led1 = 1;
      led2 = 1;
      }                                
                                
                }
                delay_ms(10);        
        }
}

副板程序:用网上的mbed方便快捷。

#include "mbed.h"

AnalogIn in(A0);

#if !DEVICE_ANA**UT
#error You cannot use this example as the Ana**ut is not supported on this device.
#else
Ana**ut out(PA_4);
#endif
Serial pc(USBTX, USBRX, "debug", 9600); //TX, RX
unsigned int i,j;
DigitalOut led(LED1);
DigitalIn in1(PB_3);
DigitalIn in2(PB_5);
DigitalIn in3(PB_4);

int main()
{
    printf("\nAnalog loop example\n");
    printf("*** Connect A0 and PA_4 pins together ***\n");
    while(1) {
      
           
wait(1);
            // Read ADC input
            float in_value = in.read();
            
             if((in_value>=0)&&(in_value <= 0.3))
            {
                wait(1);
                if(in1 == 0)
                printf("in1 run good\n");
                else
                printf("in1 run bad\n");
            }
            else if((in_value>0.3)&&(in_value <= 0.6))
            {
                wait(1);
                for(i=0;i<1000;i++)
                {
                if(in2 == !in2)
                j++;
                if(j>5)
                {
                     break;
                }
                }
                if(j>5)
                printf("in2 run good\n");
                else
                printf("in2 run bad\n");
                j = 0;  
               
            }
            else if(in_value > 0.6)
            {
               wait(1);
               if(in3 == 0)
               printf("in3 run good\n");
               else
               printf("in3 run bad\n");   
            }      
      
    }
}



四,调试

我从早晨一直调到下午3点多,话谎不是人。调试最累,主要是各个系统配合,互相不听话,十分不方便。

以下是运行截图:
DDDDDSSSS.jpg    

以下是主板视频:
https://v.youku.com/v_show/id_XN ... j.8428770.3416059.1



五,总结
我个人认为冗余系统,纯是在MCU极大丰富的前提下为了提高可靠性而设置的,如果放到以前我想都不敢想。


使用特权

评论回复

相关帖子

firegod01cn| | 2019-6-4 16:06 | 显示全部楼层
现在大赛的题目就这样的吗

使用特权

评论回复
ddllxxrr|  楼主 | 2019-6-5 08:38 | 显示全部楼层
firegod01cn 发表于 2019-6-4 16:06
现在大赛的题目就这样的吗

YES

使用特权

评论回复
ningling_21| | 2019-7-5 09:10 | 显示全部楼层
在哪体现出主MCU失效时从MCU接管LED控制呢?

使用特权

评论回复
ddllxxrr|  楼主 | 2019-7-5 10:07 | 显示全部楼层
ningling_21 发表于 2019-7-5 09:10
在哪体现出主MCU失效时从MCU接管LED控制呢?

谁让从MCU接管LED控制了呢????

使用特权

评论回复
评论
ningling_21 2019-7-5 10:24 回复TA
加分项要求 
zhanzr21| | 2019-7-5 10:18 | 显示全部楼层
ddllxxrr 发表于 2019-7-5 10:07
谁让从MCU接管LED控制了呢????

加分项目你可能没有看到

@奋斗小范  的提交贴 他实现得比较完整

https://bbs.21ic.com/icview-2820058-1-1.html

使用特权

评论回复
springvirus| | 2019-7-5 11:14 | 显示全部楼层
偶的帖子,也实现了,从机升主后,一路摇杆的ADC受从机控制,从而控制一路LED的亮灭状态

使用特权

评论回复
j13450435245| | 2019-7-5 14:46 | 显示全部楼层
看不懂

使用特权

评论回复
评论
cen12345 2019-7-9 16:52 回复TA
我也看不懂 
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:http://shop34182318.taobao.com/ http://shop562064536.taobao.com

2392

主题

6936

帖子

66

粉丝