通常,在測量220V或380V工頻電壓時,并不要求非常高的精度,一般的控制系統中,能精確到1%就足夠了。在這里向大家介紹一種我設計的非常簡單的測量方法,實踐證明,該方法實用、可靠,成本低廉,完全能夠滿足一般監控系統的要求。
硬件電路:僅用一個220V/6V-1W的普通電源變壓器,經過全波整流,小電容濾波,濾除其高頻干擾諧波,然后電阻分壓成適合A/D轉換的帶有紋波的電壓。直接連接到A/D輸入腳。如果測量380V的電壓,將兩只220V的變壓器串聯使用即可。
軟件設計:
1、先進行一次A/D轉換,存入一個變量x中,作為參考值;
2、再進行一次A/D轉換,與上次比較,如果小于x,說明正處于交流電壓的下降沿,存入 x中;繼續A/D轉換,至到大于前次的轉換值,說明已經進入了交流電壓的上升沿,存入x;
3、繼續A/D轉換,如果轉換結果大于x,存入x;直到轉換結果小于x,說明x中保存的就是交流電壓的最大值!
4、然后把x除以一個常數,得出你想顯示出的值即可。完成一次測量。
這樣完成一次測量最長時間是10ms,最短時間只需三次A/D轉換時間。如果軟件還執行其它操作,便轉入其它子程序,之后繼續1-4的步驟,將每次結果累加。
測量n次后,求算術平均值。也可以采取其它數字濾波的方法。
為避免測量0電壓程序進入死循環,可以設置一個A/D轉換次數計數器,轉換一定次數之后退出。
校準電壓可以在分壓電阻中設置一個電位器,也可以軟件校準。軟件校準的方法:例如在380V點校準,把結果乘以380,再除以380,假如得382。那么,把除數變成382即可。
這樣測量交流電壓,在寬范圍內的線性不是太好,主要原因是全波整流的二極管電壓降是一個常數(約1.4V)。但針對220V或380V的電壓測量來講,電壓波動不可能超過30%,在此范圍內的線性誤差還是可以接受的。我曾以一只0.5級的電壓表與采取該方法的測量顯示值相比較,基本一致。
附一段測量程序:
//電壓測量程序
int mesure(void)
{
uchar m_cAdccount; //ADC轉換次數
uint m_nPreAdcValue; //前次ADC轉換值
// enum condition eX;
//定義A口為輸入,A0無上拉電阻,A1~A7有上拉電阻
DDRA=0X00;
PORTA=0XFE;
//有關變量初始化
m_nAdcValue=0;
m_nPreAdcValue=0;
//內部2.56V參考電壓,0通道
ADMUX=0Xc0;
//使能ADC, 時鐘:ck/32
ADCSRA=_BV(ADEN)|_BV(ADPS2)|_BV(ADPS0);
//開始第一次轉換
ADCSRA|=_BV(ADSC);
//等待轉換結束
while(ADCSRA&_BV(ADSC))
;
//讀取第一次轉換值
m_nAdcValue=ADCL;
m_nAdcValue|=(uint)(ADCH《《8);
for(m_nPreAdcValue=m_nAdcValue,m_cAdccount=0;
(m_nAdcValue《=m_nPreAdcValue)&&(m_cAdccount《100);
m_cAdccount++)
{
m_nPreAdcValue=m_nAdcValue;
ADCSRA|=_BV(ADSC);
//等待轉換結束
while(ADCSRA&_BV(ADSC))
;
m_nAdcValue=ADCL;
m_nAdcValue|=(uint)(ADCH《《8);
}
for(m_nPreAdcValue=m_nAdcValue,m_cAdccount=0;
(m_nAdcValue》=m_nPreAdcValue)&&(m_cAdccount《100);
m_cAdccount++)
{
m_nPreAdcValue=m_nAdcValue;
ADCSRA|=_BV(ADSC);
//等待轉換結束
while(ADCSRA&_BV(ADSC))
;
m_nAdcValue=ADCL;
m_nAdcValue|=(uint)(ADCH《《8);
}
if(g_nBaseVoltage==100)
m_nPreAdcValue=m_nPreAdcValue/4;
else
m_nPreAdcValue=m_nPreAdcValue/2;
return(m_nPreAdcValue);
}
-
變壓器
+關注
關注
159文章
7462瀏覽量
135135 -
二極管
+關注
關注
147文章
9627瀏覽量
166308 -
AD轉換
+關注
關注
3文章
167瀏覽量
45311 -
電源變壓器
+關注
關注
5文章
207瀏覽量
21525
發布評論請先 登錄
相關推薦
評論