上一篇**介绍了ADC芯片CS1237的使用。
在利用芯片读取到正确的数值之后,需要对这个数据进行处理才能得到一个较为精确的重量数据。
其中一点比较重要的就是在放上物品的时候,悬臂梁会不可避免产生抖动。
为了达到更好的滤波效果,需要查看该数据的输出波形,这样更加直观。
当然有很多串口助手自带数据绘图功能。
但是我使用的是利用【匿名上位机】来进行数据图形的绘制。
因为这个上位机对数据的能力做的非常好,也有一套完善的接口协议,非常用来进行数据处理与绘图。
具体关于这个上位机的使用,也可以参考我的这篇博客:https://blog.csdn.net/m0_37655357/article/details/79514601
在绘图之前,要知道自己发送的数据有多大。
我这里利用24位ADC采样得来的数据是long int型的数据。但是串口的数据发送函数我是发送的char型数据:
- /*中断发送方式缓冲区字符*/
- static void Send_Data(unsigned char *DataToSend ,unsigned char data_num)
- {
- uint8_t i;
-
- for(i = 0;i < data_num;i++) //要发送的数据放到发送缓冲区
- Tx_Buffer[Tx_Counter++] = *(DataToSend+i);
- if(!(USART1->CR1 & USART_CR1_TXEIE)) //中断方式发送
- USART_ITConfig(USART1, USART_IT_TXE, ENABLE); //只要发送寄存器空,就会一直有中断
- }
这是就需要对所发送的数据进行一下分解:
需要定义一下宏:
- /*
- ** 数据拆分宏定义,在发送大于1字节的数据类型时,比如int16、float等,需要把数据拆分成单独字节进行发送
- ** stm32是小端模式,低字节存放在低地址空间,高字节存放在高地址空间
- */
- #define BYTE0(dwTemp) (*(char *)(&dwTemp))
- #define BYTE1(dwTemp) (*((char *)(&dwTemp) + 1))
- #define BYTE2(dwTemp) (*((char *)(&dwTemp) + 2))
- #define BYTE3(dwTemp) (*((char *)(&dwTemp) + 3))
- #define BYTE4(dwTemp) (*((char *)(&dwTemp) + 4))
完了之后就可以按照他们给出的数据帧格式进行数据的发送了,
具体的发送函数如下:
- /*----------------------------------
- **函数名称:Send_Senser
- **功能描述:发送打包的6050传感器数据
- **参数说明:无
- **作者:Andrew
- **日期:2018.1.24
- -----------------------------------*/
- void Send_Senser(void)
- {
- u8 cnt = 0;
- uint16_t sum = 0;
- u8 i = 0;
- data_to_send[cnt++]=0xAA; //帧头:AAAA
- data_to_send[cnt++]=0xAA;
- data_to_send[cnt++]=0xF1; //功能字:与上位机中显示哪个波形有关
- data_to_send[cnt++]=0; //需要发送数据的字节数,暂时给0,后面在赋值。
-
- //第一个数据段
- data_to_send[cnt++] = BYTE3(ADC_NOW);//取data[0]数据的高字节,
- data_to_send[cnt++] = BYTE2(ADC_NOW);
- data_to_send[cnt++] = BYTE1(ADC_NOW);
- data_to_send[cnt++] = BYTE0(ADC_NOW);
-
- //第二个数据段
- // data_to_send[cnt++] = 0;
- // data_to_send[cnt++] = 0;
- // data_to_send[cnt++] = 0;
- // data_to_send[cnt++] = 0;
- // data_to_send[cnt++] = 0;
- // data_to_send[cnt++] = 0;
- // //第三个数据段
- // data_to_send[cnt++] = 0;
- // data_to_send[cnt++] = 0;
- // data_to_send[cnt++] = 0;
- // data_to_send[cnt++] = 0;
- // data_to_send[cnt++] = 0;
- // data_to_send[cnt++] = 0;
-
- data_to_send[3] = cnt-4; //计算总数据的字节数。
- for(i=0;i<cnt;i++)
- sum += data_to_send[i];
-
- data_to_send[cnt++]=sum; //最后一位是校验和
- Send_Data(data_to_send, cnt); //发送一个数据包
- }
这里我只用了第一个数据段。如果读者需要发送更多数据的话,可以自己添加。
然后就可以打开上位机设置好串口,进行数据的发送了。
下一篇**,我会继续介绍电子称的基本功能实现与我自己想的一些创新功能的实现。希望大家继续关注。
|