ACS712 Measure
大綱 Outline 實驗目的 系統架構 DC Measure……..p. 4 AC Measure………p.18 實驗步驟 程式介紹 DC Measure……p. 7~p. 13 AC Measure………p. 20~p. 24 注意事項 DC Measure……..p. 14 AC Measure………p. 25 實驗結果 DC Measure……..p. 15~p. 16 AC Measure………p. 26~p. 28 附錄
研究背景 實驗目的 利用 ACS712電流感測器模組來測量DC及AC電流大小;模組可以測量DC & AC ±30A範圍內電流,並將電流值轉換為相對應的類比電壓,每1A的電壓變化為66mV;無檢測電流通過時,輸出電壓=VCC/2。 類比電壓換算電流計算公式推導: 1)ATMEGA328P ADC是10bit,所以範圍為0~1023 2)30A ACS712 感測器,對應類比量輸出66mV/A 3)ACS712 沒有電流通過時,輸出電壓是VCC/2 (=ADC 512 即1024/2) 4)理想Vcc=5V 綜合以上可導出以下公式 公式: I=(ADCcount-512[理想])*(5000mV[理想Vcc]/1024)/66mV[理想]
ACS712 DC Measure
研究背景 DC系統架構 實驗所需材料: Arduino UNO x 1 ACS712 x 1 Power Supply x 1 Load x 1 Load ACS712 30A Arduino UNO DC Power Supply
4.*儲存數值並匯入Origin進行fitting。 研究背景 DC實驗步驟 1.請如前一頁之系統架構圖接線。 2.開啟Arduino程式,並使之先做歸零動作;先斷開待測試電源(即不要讓電流通過ACS712 IP+、IP-),以取得歸零值(每次重開機,一定要做此歸零動作,注意事項中會詳細解釋),再接測試電源,便可讀出較精準電流值。 3.進行量測,開啟Power Supply並開始給電讓鹵素燈亮起,此時ACS712板子會接收值並透過Arduino UNO板將數值顯示於電腦監控視窗上。 4.*儲存數值並匯入Origin進行fitting。
研究背景 程式介紹 ACS712 Measure 主程式 量測數值監控視窗
研究背景 程式介紹 //=== ACS712_30A === //精度改進版 programed by LIN #define Ideal_mv_A 66.0 // ACS712_30A 對應類比量輸出66mV/A (理想值 at Vcc=5.0V) float ADCcount; // 所讀出之類比轉數位值 (0-1023) float I_ave; // 所測電流值(採樣1000次再取平均值) float Vcc; // 實際(接近+5V)電壓值 float Zero_count; // ACS712 無電流輸入時offset歸零值(理想=512) float Real_mV_A; // ACS712 實際對應類比量輸出??mV/A (理想值66mV/A at Vcc=5.0V)
研究背景 程式介紹 void setup() { Serial.begin( 9600 ); //設定serial port傳輸速率 delay(100); // 取得歸零值(無電流時之ADC值當作歸零值;以下取1000次之平均值) // 理想上ACS712無電流輸入時其輸出是Vcc/2(=ADC 512),而Arduino之ADC為10bit=0~1023 Zero_count=0.0; // 因analogRead()每次讀取類比電壓存在著誤差,故取樣1000次採平均值 for(int i = 0; i < 1000; i++) { Zero_count = Zero_count + analogRead(A0)/1000.0; //因要取1000次平均值再累加,故除1000 delay(1); //等待1ms; 因 analogRead() 此函式每次讀取需要約0.1ms }
研究背景 程式介紹 Serial.println("========= ACS712_30A by LIN ========="); // 印出歸零值當參考 Serial.println("========= ACS712_30A by LIN ========="); Serial.println("......... Zeroing !........."); Serial.print("Zero_count = "); Serial.println(Zero_count); // 看看ACS712無電流輸入時offset歸零值(理想=512) //利用內部參考1.1v電壓,來讀取實際之Vcc電壓 Vcc = readVcc(); Serial.print("Vcc = "); Serial.print(Vcc); // 看看實際Vcc電壓(理想=5V=5000mV) Serial.println("mV (ideal Vcc = 5000mV)"); //ACS712 output sensitivity(理想)=185mV/A at Vcc=5.0V Real_mV_A=Vcc*Ideal_mv_A/5000.0; Serial.print("Real_mV_A = "); // ACS712實際對應類比量輸出=??mV/A Serial.print(Real_mV_A); Serial.println("mV (ideal Output_mV_A = 66mV)"); Serial.println("-------- Start testing ! ----------"); }
研究背景 程式介紹 // 讀取ADC值(取樣1000次,以便取得較穩定值) ADCcount=0.0; void loop() { // 讀取ADC值(取樣1000次,以便取得較穩定值) ADCcount=0.0; for(int i = 0; i < 1000; i++) { ADCcount = ADCcount + analogRead(A0)/1000.0; //因要取1000次平均值再累加,故除1000 delay(1); //等待1ms; 因 analogRead() 此函式每次讀取需要約0.1ms } // 將ADC換算成電流 // 公式:I=(count-Zero_count)(Vcc/1024)mV/66mV // I_ave=(ADCcount-Zero_count)*(Vcc/1024.0)*1000.0/66; //(單位mA 取樣1000次之平均值) I_ave=(ADCcount-Zero_count)*(Vcc/1024.0)*1000.0/Real_mV_A; //(單位mA 取樣1000次之平均值)
研究背景 程式介紹 // 印出 Serial.print("ADC:"); Serial.print((int)ADCcount,DEC); Serial.print( (int)I_ave, DEC ); //印出所測電流 Serial.print( " mA" ); //(單位mA) Serial.print( " = " ); Serial.print((float)I_ave/1000.9, DEC); //(單位A) Serial.println( " A" ); }
研究背景 程式介紹 //========================================================= // 利用內部參考1.1v電壓,來讀取較精確Vcc +5V電壓 long readVcc() { long result; // Read 1.1V reference against AVcc ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); delay(2); // 等Vref穩定 ADCSRA |= _BV(ADSC); // 開始轉換 while (bit_is_set(ADCSRA,ADSC)); // 測量 result = ADCL; result |= ADCH<<8; result = 1125300L / result; // 反推算出Vcc(單位mV); 其中 1125300 = 1.1*1023*1000 return result; // Vcc 單位mv }
ACS712是利用霍爾效應原理來檢測電流,使用時請盡量避免磁場對此IC造成影響。 DC注意事項 ACS712是利用霍爾效應原理來檢測電流,使用時請盡量避免磁場對此IC造成影響。 因5V是理想電壓值,但實際電壓值在4.8~5.2V都有可能,故利用內部1.1V參考電壓,來取得實際Vcc電壓值,讀取較精確ADC值;一但Vcc不精確,勢必影響ADC之讀出值。 程式開啟時需先做歸零,取得歸零值(無電流時之ADC值當作歸零值)。 因程式中analogRead()每次讀取類比電壓存在著誤差,故取樣1000次採平均值。 開啟量測數值監控視窗時,要將右下角要設成9600baud,否則可能會出現亂碼。
研究背景 DC實驗結果 2.左側供電:4.4V,2.8A 1.開啟Arduino程式,做歸零動作 3.讀值並顯示於電腦監控視窗
實際量測電流值與理想電流值Fitting之結果 研究背景 DC實驗結果 實際量測電流值與理想電流值Fitting之結果 量測範圍: + 0.01A ~ +3A 量測範圍: -0.01A ~ -3.1A
ACS712 AC Measure
AC系統架構 實驗所需材料: Arduino UNO x 1 ACS712 x 1 AC110V x 1 Load x 1 LOAD
3. AC110V使燈泡亮起,進行量測,此時ACS712板子會接收值並透過Arduino UNO板將數值顯示於電腦監控視窗上。 1.請如前一頁之系統架構圖接線。 2.開啟Arduino程式,並使之先做歸零動作;先斷開待測試電源(即不要讓電流通過ACS712 IP+、IP-),以取得歸零值(每次重開機,一定要做此歸零動作,注意事項中會詳細解釋),再接測試電源,便可讀出較精準電流值。 3. AC110V使燈泡亮起,進行量測,此時ACS712板子會接收值並透過Arduino UNO板將數值顯示於電腦監控視窗上。 4.*儲存數值並匯入Origin進行fitting。
研究背景 AC程式介紹 ACS712 Irms Measure 主程式 量測數值監控視窗
AC程式介紹 const int sensorIn = A0; int Sen = 66; // 30A之Sens值為66mV double V = 0; double VRMS = 0; double Irms = 0; void setup(){ Serial.begin(9600); Serial.println("========= AC Irms by LIN ========="); Serial.println(“-------- Start testing ! ----------”); } void loop(){ V = getVPP(); VRMS = (V/2.0) *0.707; Irms = ((VRMS * 1000.000)/Sen-0.074); Serial.print("Irms= "); Serial.print(Irms); Serial.println(" A "); } float getVPP() { float result; int readValue; //從sensor讀值 int maxValue = 0; // 儲存最大值 int minValue = 1024; // 儲存最小值 uint32_t start_time = millis();
AC程式介紹 while((millis()-start_time) < 1000) //1秒讀取樣品一次 { readValue = analogRead(sensorIn); // 讀取是否有新的數值 if (readValue > maxValue) { /*紀錄最大值*/ maxValue = readValue; } if (readValue < minValue) { /*紀錄最小值*/ minValue = readValue; // 最大值減最小值 result = ((maxValue - minValue) * 5.0)/1024.0; return result; }
研究背景 AC程式介紹 ACS712 Ip-p Measure 主程式 量測數值監控視窗
AC程式介紹 int ADCcount; float I; // 所測電流值 float Zero_count; // ACS712 無電流輸入時offset歸零值(理想=512) void setup() { Serial.begin( 115200 ); Zero_count=0.0; Zero_count = (Zero_count + analogRead(A0));} unsigned long time; void loop() { time = micros(); // 設定讀取時間之精度 ADCcount = analogRead(A0); // 讀取類比電壓 I=4.8828125E-3*(ADCcount-Zero_count)/0.067; Serial.print(time*1E-6,4); Serial.print(" "); Serial.println(I); }
ACS712是利用霍爾效應原理來檢測電流,使用時請盡量避免磁場對此IC造成影響。 程式開啟時需先做歸零,取得歸零值(無電流時之ADC值當作歸零值)。 因Irms程式中((millis()-start_time) < 1000);故讀取此函式analogRead(sensorIn) 需要約1s。 Ip-p程式中time = micros(),讀值是微秒(μs)。 開啟量測數值監控視窗時,要將右下角要設成程式中Serial.begin()所設定之baud值,否則會出現亂碼。 Irms程式用 Ip-p程式用
AC實驗結果 Irms Measure 1.開啟Arduino程式,做歸零動作 2.讀值並顯示於電腦監控視窗
AC實驗結果 Ip-p Measure 1.開啟Arduino程式,做歸零動作 2.讀值並顯示於電腦監控視窗
Ip-p量測 Fitting之結果 研究背景 AC實驗結果 量測時間顯示: 1s~2s 量測時間顯示:: 1s~10s
Thank you for your attention
研究背景 附錄 使用Arduino內建工具-序列埠監控視窗,雖然可即時觀看所量測到的數值,但無法將量測到的數值儲存起來;為了解決無法儲存數據的缺點,我們使用Tera Term(開源終端機連線工具) 把 Arduino 所量測到之數值存到電腦上指定之文字文件中。 Arduino & Tera Term 介面
https://osdn.net/projects/ttssh2/releases/ 研究背景 附錄 (Tera Term下載網址): https://osdn.net/projects/ttssh2/releases/ 進入網址往下拉至此畫面,點選exe. or zip.Download下來,安裝
研究背景 附錄 啟動 Tera Term 的時候會出現 New connection 畫面; Tera Term抓取數值顯示介面 請選 Serial 並點Port欄下拉選單選擇COM Port Tera Term抓取數值顯示介面
研究背景 附錄 Tera Term檔案儲存設定介面 儲存Tera Term抓取數值之文字檔案
霍爾效應原理(Hall effect) 簡介: 研究背景 附錄 霍爾效應原理(Hall effect) 簡介: 此電磁效應說明當導體上通過一定值的電流,此時外加一個與電流方向相垂直的磁場,會使得導線中的電子受到勞倫茲力而聚集到導體的一側,從而在電子聚集的方向上產生一個電場,此一電場將會使後來的電子受到電力作用而平衡掉磁場造成的洛倫茲力,使得後來的電子能順利通過不會偏移,這一現象是由霍爾(Edwin Herbert Hall,1855—1938)首先發現的,故稱霍爾效應(Hall effect) 。 在一塊寬為w,厚度為h的半導體薄片,若在z方向加一均勻的磁場B,在x方向通一穩恒的電流Is,則在y方向的1-3面和2-4面之間將產生一穩恒的電位差VH=V1-3-V2-4 ,電位差VH故稱霍爾電壓(The Hall voltage)