[创新制造展示] 【21ic第三届设计大赛】+STM32冗余执行系统

[复制链接]
1533|2
 楼主 | 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又接到副板。

      主板程序 :


  1. #include "system.h"
  2. #include "SysTick.h"
  3. #include "led.h"
  4. #include "usart.h"
  5. #include "adc.h"


  6. /*******************************************************************************
  7. * º¯ Êý Ãû         : main
  8. * º¯Êý¹¦ÄÜ                   : Ö÷º¯Êý
  9. * Êä    Èë         : ÎÞ
  10. * Êä    ³ö         : ÎÞ
  11. *******************************************************************************/
  12. int main()
  13. {
  14.         u8 i=0;
  15.         u16 value=0;
  16.         float vol;
  17.         
  18.         SysTick_Init(72);
  19.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //ÖжÏÓÅÏȼ¶·Ö×é ·Ö2×é
  20.         LED_Init();
  21.         USART1_Init(9600);
  22.         ADCx_Init();
  23.         
  24.         while(1)
  25.         {
  26.                 i++;
  27. //                if(i%20==0)
  28. //                {
  29. //                        led2=!led2;
  30. //                }
  31.                
  32.                 if(i%50==0)
  33.                 {
  34.                         value=Get_ADC_Value(ADC_Channel_1,20);
  35.                         printf("¼ì²âADֵΪ£º%d\r\n",value);
  36.                         vol=(float)value*(3.3/4096);
  37.                         printf("¼ì²âµçѹֵΪ£º%.2fV\r\n",vol);
  38.                         if((vol>=0)&&(vol<1))
  39.                         {
  40.                         led1 = 0;
  41.                         led2 = 1;
  42.       led3 = 1;                                
  43.                         }        
  44.       else if((vol>=1)&&(vol<=2))
  45.       {
  46.                         led1 = 1;
  47.                         led2 = !led2;
  48.                         led3 = 1;
  49.                         }
  50.       else if(vol > 2)
  51.       {                                 
  52.       led3 = 0;
  53.       led1 = 1;
  54.       led2 = 1;
  55.       }                                
  56.                                 
  57.                 }
  58.                 delay_ms(10);        
  59.         }
  60. }
复制代码

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

  1. #include "mbed.h"

  2. AnalogIn in(A0);

  3. #if !DEVICE_ANALOGOUT
  4. #error You cannot use this example as the AnalogOut is not supported on this device.
  5. #else
  6. AnalogOut out(PA_4);
  7. #endif
  8. Serial pc(USBTX, USBRX, "debug", 9600); //TX, RX
  9. unsigned int i,j;
  10. DigitalOut led(LED1);
  11. DigitalIn in1(PB_3);
  12. DigitalIn in2(PB_5);
  13. DigitalIn in3(PB_4);

  14. int main()
  15. {
  16.     printf("\nAnalog loop example\n");
  17.     printf("*** Connect A0 and PA_4 pins together ***\n");
  18.     while(1) {
  19.       
  20.            
  21. wait(1);
  22.             // Read ADC input
  23.             float in_value = in.read();
  24.             
  25.              if((in_value>=0)&&(in_value <= 0.3))
  26.             {
  27.                 wait(1);
  28.                 if(in1 == 0)
  29.                 printf("in1 run good\n");
  30.                 else
  31.                 printf("in1 run bad\n");
  32.             }
  33.             else if((in_value>0.3)&&(in_value <= 0.6))
  34.             {
  35.                 wait(1);
  36.                 for(i=0;i<1000;i++)
  37.                 {
  38.                 if(in2 == !in2)
  39.                 j++;
  40.                 if(j>5)
  41.                 {
  42.                      break;
  43.                 }
  44.                 }
  45.                 if(j>5)
  46.                 printf("in2 run good\n");
  47.                 else
  48.                 printf("in2 run bad\n");
  49.                 j = 0;  
  50.                
  51.             }
  52.             else if(in_value > 0.6)
  53.             {
  54.                wait(1);
  55.                if(in3 == 0)
  56.                printf("in3 run good\n");
  57.                else
  58.                printf("in3 run bad\n");   
  59.             }      
  60.       
  61.     }
  62. }

复制代码


四,调试

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

以下是运行截图:
DDDDDSSSS.jpg    

以下是主板视频:
https://v.youku.com/v_show/id_XN ... j.8428770.3416059.1
https://v.youku.com/v_show/id_XNDIxMjE1MjcyNA==.html?spm=a2h3j.8428770.3416059.1


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


使用特权

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

使用特权

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

YES

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

快速回复

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

论坛热帖

关闭

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

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