本帖最后由 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一起工作。
于是,我就按如下设计接线,主板是STM32F103VET6,其上有可调的ADC源,并且引脚引出,我就把这个引脚接到STM32L053的ADC引脚上。
二,搭建环境
大赛么,就得拿出东西,就用我的两块开发板加上五根连线就搞定了。他们分别是
主板的PC0,PC1,PC2为LED输出,而副板的D3,D4,D5(nucleo板)分别为输入。而再有两板线分别连到主板的ADC2,而主板上有一个
可调电阻,可以调出0.1到3.1的电压来。另一板线自然接地。
三,编程
由于用了两块板,自然用两种开发环境,有的看官说你显摆什么,用一种开发环境怎么不行了。我想说的是,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点多,话谎不是人。调试最累,主要是各个系统配合,互相不听话,十分不方便。
以下是运行截图:
以下是主板视频:
https://v.youku.com/v_show/id_XN ... j.8428770.3416059.1
五,总结
我个人认为冗余系统,纯是在MCU极大丰富的前提下为了提高可靠性而设置的,如果放到以前我想都不敢想。
|