打印

【21ic第三届设计大赛】+ 新唐冗执二人组

[复制链接]
3126|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
此次采用M058S作为上电默认主机,执行采集4路ADC数值,并通过UART发到从机NUC472,每路ADC数值分别对应各自LED的3级状态,熄灭,闪烁,常亮。
并读取本地的拨动开关状态,若常开触点闭合,则切换至从机,置LED的相关IO为输入高阻态,不再发送数据到NUC472,NUC472接收数据超时后,自动升主,采集4路ADC数值,并置LED相关IO为推挽输出,控制实现LED的3种状态,若M058S的常开触点断开,恢复主机身份,正常发送数据,NUC472接收到数据,再次恢复从机身份。

整个过程的信息,可通过M058S端的12864屏和NUC472端的串口调试助手,实现查看监控。

先实现M058S的简单地读取2个摇杆电位器的4路ADC数值(未做滤波和中点校正),显示到12864上,并且500ms周期性测试根据自定的协议发送数据到UART0。






使用特权

评论回复

相关帖子

沙发
springvirus|  楼主 | 2019-6-1 16:50 | 只看该作者
本帖最后由 springvirus 于 2019-6-9 14:31 编辑

发送数据的协议,包括了帧头,源设备,目的设备,指令,4路ADC数值,4路LED的状态,校验,帧尾

使用特权

评论回复
板凳
springvirus|  楼主 | 2019-6-9 14:41 | 只看该作者
本帖最后由 springvirus 于 2019-6-10 10:38 编辑

已完成NUC472端的ADC0采样,UART0打印调试信息,UART1与M058S的自定协议通讯,一路IO控制LED板最右端的LED

来几张系统图



从机NUC472和4路 LED


LED板子的背面


NUC472 UART0打印的主机端M058S的相关信息
rbuf->打印的是收到的控制数据缓冲区数据
adc_0 到 adc_3是采样的4路值
led_1 到 led_4是4路LED的状态,0表示熄灭,1表示闪烁,2表示常亮


操作摇杆,值发生变化,LED的相关状态也发生变化了,可以看到adc_1  adc_3发生变化了,led_2  led_4也发生变化了


adc_1  adc_3  向相反方向发生变化了,led_2  led_4也随之变化

使用特权

评论回复
地板
springvirus|  楼主 | 2019-6-9 14:43 | 只看该作者
本帖最后由 springvirus 于 2019-6-9 14:45 编辑

视频在这

https://v.youku.com/v_show/id_XNDIyMTA1OTI0OA==.html?spm=a2hzp.8253869.0.0

使用特权

评论回复
5
springvirus|  楼主 | 2019-6-9 14:53 | 只看该作者
本帖最后由 springvirus 于 2019-6-9 14:57 编辑

整个系统用到了M058S的UART0(用于与NUC472通讯),ADC0-ADC3 和4路IO控制LED,一路IO使用状态机识别拨动开关,定时器设置为1ms溢出,用于状态机和LED IO定时取反的闪烁效果,多路IO驱动12864屏
NUC472的UART0(用于打印)   UART1(用于与M058S通讯)   ADC0  一路IO控制LED   定时器设置为1ms溢出,用于接收超时的计数器和LED IO定时取反的闪烁效果
上传主流程代码

M058S端的main.c
main_21ic_3rd_DIY.zip (9.19 KB)


NUC472端的主流程函数

void vM058SMonitorTask(void)
//实时监控M058S的运行状态
{

        uint8_t uret8;

        uint8_t rbuf[30];
        uint32_t rlen = 0;


        u32 temp[4] = {0x00};
        

        union sv_32 temp_union_32;
        union sv_16 temp_union_16;

        u32 led_timer[4] = 0;


        u32 master_trace_timer = 0;
        u32 slave_trace_timer = 0;


        

        #if 1
        while(1)
        {
               
               
                process_uart1_recv_packet_from_M058S(rbuf, &rlen);
               

                //M058S 500ms 发送1包
                //若收不到数据包,超时2s后,就升主
                if(checktimer(&m058s_local_no_pack_timer, 2000))
                {
                        m058s_local_clear_no_pack_timer();
                        
                        //超时升主
                        nuc472_master_flag = 1;        


                        trace("&&&&&&&&&&&&&&&&&&& \r\n");
                        trace("no M058S data, timeout  !!! \r\n");
                                       
                }

                        
                #if 1

                if(nuc472_master_flag == 1)
                //是主机,就采集4路ADC,并发送显示
                {
                        //adc check();

                        led_output();


                        
                        //简化,从机升主后只采集一路ADC
        
                        temp[0] = (i32ConversionData[0]*5000)/4096;
                        //temp[1] = (i32ConversionData[1]*5000)/4096;
                        //temp[2] = (i32ConversionData[2]*5000)/4096;
                        //temp[3] = (i32ConversionData[3]*5000)/4096;


                        if(checktimer(&master_trace_timer, 1000))
                        {
                                trace("################################# \r\n");
                                trace("no m058s data !! is master now !! \r\n");        
                        
                                trace("adc_0 = %d \r\n", temp[0]);
                                //trace("adc_1 = %d \r\n", temp[1]);
                                //trace("adc_2 = %d \r\n", temp[2]);
                                //trace("adc_3 = %d \r\n", temp[3]);
                        }
                        

                        if((temp[0] >= 0) && (temp[0] <= 1500))
                        {
                                //led off
                                led_1_off();
                        }
                        else if((temp[0] >= 1511) && (temp[0] <= 3500))
                        {
                                //led toggle
                                if(checktimer(&led_timer[0], 333))
                                {
                                        led_1_toggle();
                                }
                        }
                        else if((temp[0] >= 3511) && (temp[0] <= 5000))
                        {
                                //led on
                                led_1_on();
                        }

                        //----------------
                        
                        
                }
                else if(nuc472_master_flag == 0)
                //是备机,就显示接收到的
                {

                        led_high_impedance();


                        if(checktimer(&slave_trace_timer, 1000))
                        {
                                trace("#################################  \r\n");
                                trace("recv m058s data !! is slave now !! \r\n");

                                temp_union_16.c[0] = rbuf[DATA];
                                temp_union_16.c[1] = rbuf[DATA+1];
                                trace("adc_0 = %d \r\n", temp_union_16.Val);

                                temp_union_16.c[0] = rbuf[DATA+2];
                                temp_union_16.c[1] = rbuf[DATA+3];
                                trace("adc_1 = %d \r\n", temp_union_16.Val);

                                temp_union_16.c[0] = rbuf[DATA+4];
                                temp_union_16.c[1] = rbuf[DATA+5];
                                trace("adc_2 = %d \r\n", temp_union_16.Val);

                                temp_union_16.c[0] = rbuf[DATA+6];
                                temp_union_16.c[1] = rbuf[DATA+7];
                                trace("adc_3 = %d \r\n", temp_union_16.Val);
                        
                        
                                trace("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& \r\n");
                                trace("led status, 0:off, 1:toggle, 2:on \r\n");
                                trace("led_1 = %d \r\n", rbuf[DATA+8]);
                                trace("led_2 = %d \r\n", rbuf[DATA+9]);
                                trace("led_3 = %d \r\n", rbuf[DATA+10]);
                                trace("led_4 = %d \r\n", rbuf[DATA+11]);
                        
                        }
                        
                }

                #endif

               
        }

        #endif



}



使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

127

主题

4557

帖子

14

粉丝