有一个负载需要监控电流
精度需要精确到0.1MA-0.01MA的程度
使用ACS712试一试,感觉是没问题的
至少在用万用表测的时候没有问题
然后使用STC8 AD采集
发现AD值一直在波动,波动幅度还很大
并了一个104电容效果不大
软件上技术欠佳,也不知道该怎么滤波比较好。
电流实际情况在0.16ma的时候
测出来的数据反而是在0.00 0.03 0.12 0.20这四个数之间跳来跳去
电路图和单片机代码如下
单片机源程序如下:
- #include<STC8.H>
- #include "LCDINT.h"
- #include "LCD.h"
- #include "PIC.h"
- #include "intrins.h"
- float t;
- float p;
- float u;
- #define ADCTIM (*(unsigned char volatile xdata *)0xfea8)
- int main(void)
- {
- P0M0 = 0x00;
- P0M1 = 0x00;
- P2M0 = 0x00;
- P2M1 = 0x00;
- P3M0 = 0x00;
- P3M1 = 0x00;
- P1M0 = 0x00; //设置P1.0为ADC口
- P1M1 = 0x01;
- ADCCFG = 0x0f; //设置ADC时钟为系统时钟/2/16
- P_SW2 |= 0x80;
- ADCTIM = 0x3f; //设置ADC内部时序
- P_SW2 &= 0x7f;
- ADC_CONTR = 0x80; //使能ADC模块
- LCD_Init();//LCD初始化
- LCD_Fill(0,0,LCD_W,LCD_H,BLACK);
- while(1)
- {
- ADC_CONTR |= 0x40; //启动AD转换
- _nop_();
- _nop_();
- while (!(ADC_CONTR & 0x20)); //查询ADC完成标志
- ADC_CONTR &= ~0x20; //清完成标志
- t = ADC_RES; //读取ADC结果
- p=t/256*3300;
- if(p<=2475)
- {p=2475;}
- u=(p-2475)/185;
- _nop_();
- _nop_();
- LCD_ShowChinese(60,70,"电子",WHITE ,BLACK,32,0);
- LCD_ShowString(32,100,"cccc",RED,BLACK,16,0);
- LCD_ShowIntNum(120,100,p,4,RED,BLACK,16);
- LCD_ShowFloatNum1(90,130,u,4,RED,BLACK,16);
- LCD_ShowPicture(40,120,40,40,gImage_1);
- }
- }
复制代码
|