有一個負載需要監控電流
精度需要精確到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);
- }
- }
復制代碼
|