开发者 nbfei 通过调用串口与测量板通信,接收测量板的测量数据,并对其测量范围进行控制。另外控制W800连接IOT studio,将数据上传并接收控制指令,完成便携仪器云端数据系统。
关于便携仪器云端数据系统的实现过程,请见本文详细介绍。
01 项目背景
本人参加2021年电赛并取得A题THD测量装置的国家二等奖,正在对该装置进行全方面的升级,包括测量范围,精度,带宽,测量参数等方面,目的实现硬件便携(口袋仪器与数据采集卡的结合),手机+PC上位机显示,系统不限于特定测量仪器功能,后续可通过便捷的方式更换具有示波,信号发生,万用表等功能的测量板扩展相应功能。申请本开发板想要用来进行远程控制,无线传输方案原型设计,以及云端数据系统的原型设计。
02 作品简介
由于上述内容除了使用RVB2601实现云端数据系统外均为本人的毕业设计,所以本次作品提交以RVB2601的使用介绍为主。
图片左端为本人设计制作的测量板第一版,主要实现输入任意波形信号的采集,THD测量,频率、VPP、谐波归一化幅值等参数的测量,单周期波形的采集等功能,具体见第三部分。测量板将采集到的数据通过串口发送至PC,蓝牙发送至手机,在本作品提交中,由于需要使用串口,因此将蓝牙模块串口断开接至CH2601的串口0,RVB2601接收数据解析出各测量参量,然后将数据上传至IOT studio显示,个别数据在LCD显示。
03 各部分功能说明和解析
非常感谢平头哥的支持,在这次评测活动中,由于前期忙着考研复试与毕业设计,至今才来发帖来分享自己对本次申请板卡RVB2601的使用体验,我大概5月开始前前后后花了应该有八九天的时间来使用板卡熟悉环境,构建一个简单的应用。当时申请板卡的时候,目的也是为了给毕设增加一个数据上传云端的功能,但是后面做完前面的任务后剩余的时间裕量也不足了,但也基本实现了Web显示的功能,遗憾的是暂未实现采集的单周期波形显示功能。
首先我的毕业设计来源于2021年电赛A题信号失真度测量装置,在比赛时我也是将比赛要求完成,因此毕设主要是对整个电路的集成与参数的优化,另外增加PC上位机显示控制功能,整体较为简单。在毕业设计制作过程中,电路设计阶段参照DSO模拟前级电路原理,单片机程序设计综合运用等效时间采样、平顶窗、频谱分析等应用原理实现了整个测量系统的设计制作。在毕设整体设计完成后,我预想使用申请的RVB2601+IOT studio实现WEB端数据查看与测量控制,设计过程如下。
首先接触一个新的板卡或单片机,比如使用MSP430与MSP432时,参照官网提供的详细的datasheet和usersguide,搭配例程来可以较深刻的理解工作机制并构建应用。刚收到RVB2601后,我是这样想的,但奈何官方资料比较少,例程至今也比较有限,我对物联网与操作系统的认识仅限于使用过小熊派和LiteOS连接华为云,其主控为熟悉STM32的低功耗系列,另外我主要方向是底层的板级设计与程序开发信号处理,所以刚开始对RVB2601用起来很不习惯,在我看来只uart的操作就一次又一次的封装,分在不同的包中,函数功能不尽相同,且各函数也不易查找,缺少注释与文件支持。
好在我本次需要用到的外设不多,只调用一个串口即可,作用是与测量板通信,接收测量板的测量数据,并对其测量范围进行控制。另外控制W800连接IOT studio,将数据上传并接收控制指令。
3.1 串口方面
由于本装置的PC端与手机端应用都是基于.NET框架开发的,本人在两个平台上也都使用异步接收数据,对数据进行拼接解析协议,因此我在本单片机的使用中也首选异步收发,这和我之前裸跑32/432不大相同,我按照GitBook指导文档中CSI2驱动接口的异步收发接口说明与例程实现了TX但是不能实现非固定的字节接收,这困扰了我很长时间,为此我想了好多办法,去串口接收寄存器读缓存个数等等,但基本都失败了。后面看了sipower的发帖,嗯,去试了试,嗯,可以,但是由于我需要快速接收数据,测量板发送数据周期<100ms,每次发送300字节左右,由于我水平与时间有限,并且对操作系统认识不足,所以没能调试出来。
后面,还是使用了同步收发,成功完成收发任务。
//串口接收函数
void get_input(char * str)
{
char input = 'a';
uint32_t i ;
uint32_t num = 0;
for( i = 0; i<500 ;i++)str[i] = '';
while(uart_getc() != 'T'){
num++;
if(num == 2200000)return;//超时退出
}
str[0] = 'T';
i = 1;
while(input != 'E')
{
input = uart_getc() ;
str[i] = input;
i++;
}
}
3.2 传输协议
解决了物理层后,需要在协议层规定数据传输格式,由于下位机向电脑与手机端发送数据与接收数据均采用同一格式,因此本着效果不错就不修改方案的原则,我没有再去改下位机单片机MSP432的程序,使用同一协议格式通信,如下:
发送:T0.67Amp0.01,0.00,0.00,0.00F10000V1.97,W 799, 875, 949,1017,1087,1150,1208,1259,1299,1334,1359,1375,1376,1375,1358,1334,1299,1256,1206,1149,1086,1017, 947, 873, 797, 721, 646, 574, 503, 437, 376, 321, 273, 233, 201, 177, 163, 160, 166, 181, 205, 238, 279, 329, 384, 445, 513, 582, 656, 732,E
接收:‘0’或‘1’(分别表示频率测量范围为“1k~500k”或“500k~1M”)
其中T后A前为THD,Amp后F前为归一化幅值逗号隔开,F后V前为频率,V后W前为峰峰值,W后为50个点的波形数据逗号隔开,T和E为数据开始与数据结束,通过串口接收。
串口接收任务如下:
//串口接收任务
static void uart_task(void *arg)
{
char str[500];
uint32_t i;
while(1)
{
//串口接收
get_input(str);
//printf("%s
",str);
if(str[0]=='T'){
rec_flag = 1;
//解析出各参数
char *T_adr = strchr(str,'T');
char *A_adr = strchr(str,'A');
char *F_adr = strchr(str,'F');
char *V_adr = strchr(str,'V');
char *W_adr = strchr(str,'W');
//THD
for(i = 0;i < strlen(T_adr)-strlen(A_adr)-1;i++)THD[i] = T_adr[i+1];
T_adr[i] = '';
//Amp
for(i = 0;i < 4; i++)H2[i] = A_adr[i+3];
for(i = 0;i < 4; i++)H3[i] = A_adr[i+8];
for(i = 0;i < 4; i++)H4[i] = A_adr[i+13];
for(i = 0;i < 4; i++)H5[i] = A_adr[i+18];
//FRE
for(i = 0;i < strlen(F_adr)-strlen(V_adr)-1;i++)FRE[i] = F_adr[i+1];
FRE[i] = '';
//VPP
for(i = 0;i < strlen(V_adr)-strlen(W_adr)-1-1;i++)VPP[i] = V_adr[i+1];
VPP[i] = '';
//Wave
for(i = 0;i < strlen(W_adr)-3;i++)
{
Wave[i] = W_adr[i+1];
}
}
//printf("THD = %s
",THD);
//printf("H2 = %s
",H2);
//printf("H3 = %s
",H3);
//printf("H4 = %s
",H4);
//printf("H5 = %s
",H5);
//printf("FRE = %s
",FRE);
//printf("VPP = %s
",VPP);
//printf("Wave = %s
",Wave);
aos_msleep(20);
}
}
3.3 上传云端
和ESP8266类似,W800可以AT指令控制,所以这个过程就变得简单了,这里使用sipower博主分享的四个AT指令控制函数和上云例程,非常感谢博主的分享。这里在IOT Studio上创建产品,增加功能定义,添加设备。在数据上传函数中将前面的参数与后面的波形数据分开发送,波形数据用数组发送。
在这里注意:在printf里\表示,”表示”
04 作品源码
链接:https://pan.baidu.com/s/1Z4kLJfqyFD5iI0tun0NZxw?pwd=d8tx
提取码:d8tx
05 视频演示
视频链接:
链接:https://pan.baidu.com/s/1YTGGdCWo1JxIpNaMdr4-qw?pwd=6s4n
提取码:6s4n
审核编辑 :李倩
全部0条评论
快来发表一下你的评论吧 !