As5600数据跳变

这里也分享一下自己的学习之路

一、问题

二、解决方式

3937d52decf64d9c9ea743cac4d12e49.jpg

 

 一、问题

这里可以看到我使用的是打磨裁剪后的洞洞板做的底座,方便还便宜,由于是第一次使用as5600,作为小白的我也是遇到了头疼的问题,读取到位置信号之后,数据有节奏的来回跳变,这里软件中我没有加滤波,倒是读取到的数据根本无法使用,后面加了简单的滤波后数据依旧跳变,这里另外一个前提是步进电机没有通电的情况下,数据依旧跳动,那么软件滤波都没作用,那就奇了怪了..

 

二、解决问题

这里就得逐步排查了,

1、首先我检查了电源,因为5600芯片的电源是从开发板上接的,而开发板本身就有许多外设,有可能造成电源功率过低,但更换电源后发现现象依旧。

2、会不会是导线连接处有松动,这个最有可能,因为毕竟这种插针式连接线有时候也不一定牢固,检测后发现并无。

3、不会是芯片坏了吧,这个是最不想看到的,但是新买的怎么可能呢,但也不是不可能,所以就狠下心又买了AS5600芯片换上,发现故障解决了..才怪。

4、再次观察后发现,数据虽然跳变,但当手去触碰电机外壳时数据跳动更加明显,噢!我好像发现了新大陆,难道这就是传说中的电磁干扰吗,但是电机动我没有通电且和5600芯片无任何电器连接呀?于是我试着在电机外壳接线,连接至GND,数据瞬间稳定,噗..

d9e72ad3860046ec8949dcd70c264ba6.jpg

 可以看到右下角螺丝出我连接了根线,与通过螺丝与gnd连接,完美的解决了电磁干扰问题。

好了,希望这里能帮助到大家,新手上路,请大家多多指教呀!

以下是一个可以发送DS18B20、AS5600和HX711数据的51单片机程序,使用esp-01作为WiFi模块进行数据传输。 ``` #include <reg51.h> #include <math.h> #include <intrins.h> #include <stdio.h> #include <string.h> #define FOSC 11059200L //定义晶振频率 #define BAUD 9600 //定义波特率 #define ERROR 0 //定义常量0 #define OK 1 //定义常量1 #define DS18B20_PIN P2_3 //定义DS18B20引脚 #define AS5600_PIN P2_4 //定义AS5600引脚 #define HX711_PIN P2_5 //定义HX711引脚 unsigned char idata Send_Buffer[60]; //定义发送缓存区 unsigned char idata Receive_Buffer[60]; //定义接收缓存区 unsigned int count; //定义计数器 bit flag; //用于指示是否有数据需要发送 void Init_UART(void) //初始化UART { TMOD |= 0x20; //设定定时器1为8位自动重载模式 TH1 = TL1 = -(FOSC / 12 / 32 / BAUD); //设定波特率 TR1 = 1; //启动定时器1 SM0 = 0; //设定串口工作模式 SM1 = 1; REN = 1; //允许串口接收数据 EA = 1; //开启总中断 ES = 1; //开启串口中断 } void Init_DS18B20(void) //初始化DS18B20 { DS18B20_PIN = 1; //DS18B20初始化 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); } bit Start_DS18B20(void) //启动DS18B20 { bit ack; DS18B20_PIN = 1; //总线复位 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); DS18B20_PIN = 0; //开始信号 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); DS18B20_PIN = 1; //释放总线,等待DS18B20响应 _nop_(); _nop_(); _nop_(); _nop_(); ack = DS18B20_PIN; //读取DS18B20响应信号 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); return ack; } void Write_DS18B20(unsigned char dat) //写入数据 { unsigned char i; for (i = 0; i < 8; i++) { DS18B20_PIN = 0; //写入数据开始 _nop_(); _nop_(); DS18B20_PIN = dat & 0x01; //写入数据 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); DS18B20_PIN = 1; //释放总线 dat >>= 1; //准备写入下一位数据 } } unsigned char Read_DS18B20(void) //读取数据 { unsigned char i, dat = 0; for (i = 0; i < 8; i++) { dat >>= 1; //准备读取下一位数据 DS18B20_PIN = 0; //读取数据开始 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); DS18B20_PIN = 1; //释放总线,等待DS18B20响应 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); if (DS18B20_PIN) //读取数据 dat |= 0x80; } return dat; } void Read_Temperature_DS18B20(void) //读取DS18B20温度数据 { unsigned char temp[2]; unsigned int t; if (Start_DS18B20()) { //启动DS18B20 Write_DS18B20(0xCC); //跳过ROM Write_DS18B20(0x44); //启动温度转换 while (!DS18B20_PIN); //等待转换结束 Start_DS18B20(); //启动DS18B20 Write_DS18B20(0xCC); //跳过ROM Write_DS18B20(0xBE); //读取温度数据 temp[0] = Read_DS18B20(); //读取LSB temp[1] = Read_DS18B20(); //读取MSB t = ((unsigned int)temp[1] << 8) | temp[0]; //计算温度值 t = t * 0.0625 * 10 + 0.5; sprintf(Send_Buffer, "Temperature: %d.%dC\r\n", t / 10, t % 10); //将温度值转化为字符串 flag = 1; //设置发送数据标志位 } } void Init_AS5600(void) //初始化AS5600 { AS5600_PIN = 1; //AS5600初始化 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); } unsigned char Read_AS5600(void) //读取AS5600角度数据 { unsigned char i, dat = 0; for (i = 0; i < 8; i++) { dat <<= 1; //准备读取下一位数据 AS5600_PIN = 0; //读取数据开始 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); dat |= AS5600_PIN; //读取数据 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); AS5600_PIN = 1; //释放总线,等待AS5600响应 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); } return dat; } void Read_Angle_AS5600(void) //读取AS5600角度数据 { unsigned char angle; Init_AS5600(); //初始化AS5600 AS5600_PIN = 0; //发送起始地址 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); AS5600_PIN = 1; //释放总线,等待AS5600响应 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); angle = Read_AS5600(); //读取角度数据 sprintf(Send_Buffer, "Angle: %d\r\n", angle); //将角度值转化为字符串 flag = 1; //设置发送数据标志位 } void Init_HX711(void) //初始化HX711 { HX711_PIN = 1; //HX711初始化 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); } unsigned long Read_HX711(void) //读取HX711重量数据 { unsigned char i; unsigned long dat = 0; Init_HX711(); //初始化HX711 for (i = 0; i < 24; i++) { //读取24位数据 HX711_PIN = 0; //读取数据开始 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); dat <<= 1; //准备读取下一位数据 if (HX711_PIN) dat++; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); HX711_PIN = 1; //释放总线,等待HX711响应 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); } HX711_PIN = 0; //读取校验位 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); dat ^= 0x800000; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); HX711_PIN = 1; //释放总线,等待HX711响应 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); return dat; } void Read_Weight_HX711(void) //读取HX711重量数据 { unsigned long weight; weight = Read_HX711(); //读取重量数据 sprintf(Send_Buffer, "Weight: %ldg\r\n", weight); //将重量值转化为字符串 flag = 1; //设置发送数据标志位 } void Send_Data(void) //发送数据 { unsigned char i; for (i = 0; i < strlen(Send_Buffer); i++) { SBUF = Send_Buffer[i]; //发送数据 while (!TI); //等待数据发送完成 TI = 0; //清除发送完成标志位 } memset(Send_Buffer, 0, sizeof(Send_Buffer)); //清空发送缓存区 flag = 0; //清除发送数据标志位 } void main(void) { Init_UART(); //初始化UART while (1) { Read_Temperature_DS18B20(); //读取DS18B20温度数据 if (flag) Send_Data(); //发送数据 Read_Angle_AS5600(); //读取AS5600角度数据 if (flag) Send_Data(); //发送数据 Read_Weight_HX711(); //读取HX711重量数据 if (flag) Send_Data(); //发送数据 } } void UART_ISR(void) interrupt 4 //UART中断服务程序 { if (RI) { //接收数据 RI = 0; //清除接收完成标志位 Receive_Buffer[count++] = SBUF; //将接收数据存入接收缓存区 if (count >= sizeof(Receive_Buffer)) count = 0; //如果接收缓存区已满,重置计数器 } if (TI) TI = 0; //清除发送完成标志位 } ``` 需要注意的是,该程序中的DS18B20、AS5600和HX711的引脚定义是P2_3、P2_4和P2_5,可以根据实际硬件连接情况进行修改。此外,程序中使用了一个标志位flag来指示是否有数据需要发送,可以避免数据重复发送的问题。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值