开发板资源
STM32F103C8T6
**
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 |
电源
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 |
板上数据传输
从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
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
找到一条完整数据,如何找到完整数据呢?就我们例子的这个协议,首先在缓存的数据中找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采样时间和传输速率对应关系如下图:
而串口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”
电路板存在问题
- 8266的GND未共地、8266的EN端和PA5相连、RST端和PA6相连
- 思考AD620处可调电阻和固定电阻的值,可调电阻需要值为250欧姆左右。
现存在问题:AD放大值被固定为120左右,可调电阻被导通,有电流流过
- PB1、PB0、PB8引脚引出,方便调试
- 添加状态指示灯,8266正常工作指示灯、数据正常、异常指示灯
通用软件滤波算法-算术平均滤波法
https://blog.csdn.net/weixin_40774605/article/details/94432890