开发板资源

STM32F103C8T6
**无线测力臂数据传输方案 - 图2
无线测力臂数据传输方案 - 图3
无线测力臂数据传输方案 - 图4

无线测力臂数据传输方案 - 图5


无线测力臂数据传输方案 - 图6
无线测力臂数据传输方案 - 图7
无线测力臂数据传输方案 - 图8
无线测力臂数据传输方案 - 图9

image.png

F103核心板引脚资源分配

引脚 与其连接端口 功能
PA2(TX) 8266RX 单片机与8266串口通信,以AT指令配置8266模式,并进行数据无线透传
PA3(RX) 8266TX
PB1 电池的电压信号 对电池电压进行AD转换,实现电压监测
PB9 红色欠压指示灯 当测得的电池电压低于2V(实际电压低于6V)时,PB8端口输出信号,使红色欠压指示灯点亮。
PB0 放大后的电桥输出电压信号(0.08 V—2.42 V) 将扭矩对应的测量电压进行AD转换,
PA9(TX) USB转串口模块的RX、TX 向PC端的串口调试助手发送数据
PA10(RX)
PA5 8266EN(CH_PD) 输出为高电平使能8266
PA6 8266RST(GPIO16) 输出为低电平、高电平,重启8266
PB8 电源欠压报警蜂鸣器 输出为高电平,蜂鸣器叫
PB11 8266IO0
PB10 8266IO2

电源

image.png
12-8-5-3.3
电池截止电压8.5V,10V以下报警、亮红灯,提示更换电源。
传感器

输入数据处理

输入电压范围

输入电压为0.08V-2.42V,对应12位二进制数为0000 0110 0011———1011 1011 1100(63H—BBCH) ,将其拆分为两个8进制数,0.08V对应值为00H、63H,2.42V对应值为0BH、BCH

ADC

ADC 的输入电压范围为: 0~3.3V,扭矩的电压信号与开发板上引脚PB0相连,对其进行AD转换。
AD转换使用ADC12的通道8,ADC1的转换精度为12位.,该通道的转换顺序为1(最先转换),使用软件触发的方式。
转换时间由ADC时钟和采样时间决定,设置ADC时钟分频因子为8,则ADC_CLK=PCLK2 /8=9M ,采样时间为ADC_SampleTime_239Cycles5(239.5个周期,总转换时间为(239.5+12.5)/9M=28us,采样率为35.71kHZ。

采样时间 总转换时间(us) 采样率(kHZ) 传输速率(kb/s)
ADC_SampleTime_1Cycles5 1.56 641.0256 7692.308
ADC_SampleTime_7Cycles5 2.22 450.4505 5405.405
ADC_SampleTime_13Cycles5 2.89 346.0208 4152.249
ADC_SampleTime_28Cycles5 4.56 219.2982 2631.579
ADC_SampleTime_41Cycles5 6 166.6667 2000
ADC_SampleTime_55Cycles5 7.56 132.2751 1587.302
ADC_SampleTime_71Cycles5 9.33 107.1811 1286.174
ADC_SampleTime_239Cycles5 28 35.71429 428.5714

板上数据传输

无线测力臂数据传输方案 - 图12

从ADC到存储器(DMA)

设置16位变量ADC_ConvertedValue(bsp_adc.c中定义),用于存放电压信号转换后的12位二进制数。该变量采用单通道DMA数据传输,传输通道为DMA1的通道1,方向为从外设ADC的ADC_x->DR到存储器的ADC_ConvertedValue。

从存储器到串口(循环读取)

ADC转换1次电压信号的时间为28us,使用滴答定时器中的延时函数,每200us读取一次ADC_ConvertedValue的值(5000kHz,每秒5000个数据),并将其拆分成2个8位变量temp_h,temp_l,在串口发送beginning、number、temp_h,temp_l、ending5个8位二进制数,数据发送速率为500058=200000bit/s,设置串口波特率为230400,串口通信速度大于数据发送速度。预计每秒发送5000个数据

发送数据格式

定义2个常量beginning、ending
IO uint8_t beginning = 0xee;
IO uint8_t ending = 0xff;

定义1个变量number,用来记录发送数据的先后顺序,

beginning
number
temp_h
temp_l
ending

8266接收到后再合并为16位变量。

8266

无线测力臂数据传输方案 - 图13
无线测力臂数据传输方案 - 图14
无线测力臂数据传输方案 - 图15
wifi引脚与开发板的串口2(PA2、PA3)相连,设置串口波特率为230400

串口设计

串口1的PA9(TX)、PA10(RX)与串口调试助手相连,用于调试程序时查看8266配置情况,
串口2的PA9(TX)、PA10(RX)与8266相连,用来向8266发送AT指令,配置8266。将8266配置成透传模式后,通过串口2发送ADC数据,

串口数据帧解析

我们有了通讯协议,如何结合串口的协议来分析,需要关心什么呢?哦。一般就是4个问题:缓存收到的所有数据找到一条完整数据分析数据界面通知

缓存收到的所有数据,我们想到最高效的办法就是顺序表,也就是数组,但数组的操作比较复杂,当你使用完一条数据后,用过的需要移除新数据如果过多的时候,缓存过大需要清理;数据搬移等等,很有可能一个不小心就会丢数据导致软件出些莫名其妙的小问题。个人建议,使用List,内部是数组方式实现,每次数据不足够的时候会扩容1倍,数据的增删改都已经做的很完善了。不会出现什么小问题。

找到一条完整数据,如何找到完整数据呢?就我们例子的这个协议,首先在缓存的数据中找AA 44,当我们找到后,探测后面的字节,发现是05,然后看缓存剩下的数据是否足够,不足够就不用判断,减少时间消耗,如果剩余数据>=6个(包含1个字节的校验),我们就算一个校验,看和最后的校验是否一致。

分析数据:鉴于网络的开放性,我无法确定读者对c#的了解程度,介绍一下,常用的方式就是BitConvert.ToInt32这一系列的方法,把连续的字节(和变量长度一样)读取并转换为对应的变量。c++下使用memcpy,或直接类型转换后进行值拷贝,vb6下使用CopyMemory这个api。

校验:前面说过了。完整性判断的时候需要和校验对比,大多系统都不太严格,不支持重发,所以数据错误就直接丢弃。导致数据错误的原因很多,比如电磁干扰导致数据不完整或错误、硬件驱动效率不够导致数据丢失、我们的软件缓存出错等。这些软件因素数据系统错误,需要修改,但是电磁干扰么,有这个可能的。虽然很少。

问题

1.数据传输格式不匹配

串口数据寄存器DR低8位有效,ADC_ConvertedValue为16位变量,低12位存放输入电压对应的12位二进制数。
ADC转换1次电压信号的时间为28us,使用滴答定时器中的延时函数,每200us读取一次ADC_ConvertedValue的值(80kb/s),将它赋值给16位变量USART_DMA_TransmitValue,并将其拆分成2个8位变量temp_h,temp_l,打印USART_DMA_TransmitValue、temp_h,temp_l发送到串口,并使用串口发送函数USART_SendData发送。
8266接收到后再合并为16位变量。

2.数据传输速度不匹配

ADC1采样时间和传输速率对应关系如下图:
image.png
而串口1通信速率可达4.5兆位/秒(4500kb/s),其他接口的通信速率可达2.25兆位/秒,

波特率(bit/s) 传输速率(kb/s)
115200 115.2
230400 230.4
460800 460.8
576000 576
4068000 4068

串口调试助手支持的最大波特率为576000.

解决办法:
ADC转换1次电压信号的时间为28us,使用滴答定时器中的延时函数,每200us读取一次ADC_ConvertedValue的值(5000kHz,每秒5000个数据),并将其拆分成2个8位变量temp_h,temp_l,在串口发送beginning、number、temp_h,temp_l、ending5个8位二进制数,数据发送速率为500058=200000bit/s,设置串口波特率为230400,串口通信速度大于数据发送速度。

设置浮点变量ADC_ConvertedValueLocal(主函数中定义),ADC_ConvertedValueLocal =(float) ADC_ConvertedValue/4096*3.3;用于存放转换后对应的电压值。

,一般公司都使用kb(千位)来表示。如果是大写B的kBps,则表示每秒传送多少千字节。1kByte/s=8kbit/s(一般简写为1kB/s=8kb/s)。

待实现

1.如何有效地无损压缩二进制数据?

12bit->8bit
方案1:
简单的直接下个zlib调用就好了
自己写如果对压缩率要求不高可以用lz77
否则才考虑算术编码,主要原因是算术编码运算比较慢
方案2:
游程编码+霍夫曼编码
霍夫曼编码也可以改成算术编码,游程编码对0-1二进制序列比较有效。

2.更改串口通信协议

在串口通讯的协议层中,规定了数据包的内容,它由启始位、主体数据、校验位以及停止位组成,通讯双方的数据包格式要约定一致才能正常收发数据, 是否可以将主体数据由8位扩展为12位、16位

3.8266保持服务器模式到flash

8266AP端上电自动打开服务器模式

8266sta端通过AT+SAVETRANSLINK—保存透传到 Flash
本设置将透传模式及建立的 TCP 连接均保存在 Flash system parameter 区域,下次上电⾃自动
建立 TCP 连接并进入透传。
示例:AT+SAVETRANSLINK=1,”192.168.6.110”,1002,”TCP”

电路板存在问题

  1. 8266的GND未共地、8266的EN端和PA5相连、RST端和PA6相连
  2. 思考AD620处可调电阻和固定电阻的值,可调电阻需要值为250欧姆左右。

现存在问题:AD放大值被固定为120左右,可调电阻被导通,有电流流过

  1. PB1、PB0、PB8引脚引出,方便调试
  2. 添加状态指示灯,8266正常工作指示灯、数据正常、异常指示灯

无线测力臂数据传输方案 - 图17

通用软件滤波算法-算术平均滤波法

https://blog.csdn.net/weixin_40774605/article/details/94432890