諧振法測電感改變電阻大小對精度有什么影響
1、制作
先是試制了網(wǎng)上流行的LM311電路。因手上沒有LM311,用LM393代換。雖然只有幾個元件,但也焊接了幾個小時。
原電路出現(xiàn)以下問題:
1、頻率穩(wěn)定性不好,跳得比較歷害
2、測量大電感誤差非常大,可達20%
3、測量更大的電感,如10H以上的電感,很多無法測量,不起振。
解決方法:
用示波器觀察,諧振器上面的波形非常差,說明電路Q值太低。
原電路使用33k電阻反饋(就是那3個100k電阻的并聯(lián)值),測大電感時,頻率低,阻抗大比33k電阻還大, Q值嚴(yán)重下降,造成電路不起振,就算起振了,測值誤差也大得驚人。所以改用1兆歐高阻耦合。
改了之后,可以測到1000H以上的大電感,而且很準(zhǔn)。
2、性能
為了與電橋比對,所以上限頻率只做到200kHz,輔助電感是220uH
零點緩慢漂移,得經(jīng)常清零,比較討厭。這是諧振元件溫漂害的。
不過,秒一級的穩(wěn)定性比較好,讀數(shù)不會亂跳,因為頻率只會跳1個計數(shù)值(1計數(shù)對應(yīng)2Hz,計數(shù)時間采用0.5秒),所以清零后,及時測量,還是可以準(zhǔn)確測量0.x uH電感的。
從幾uH到1H之間實測來看,誤差小于1%,1H到幾百H,誤差可以5%左右估算,一般是偏大。因為本電路測量大電感的電壓比較高,不易與電橋比對。鐵芯電感的電感量隨測量電壓升高,電感量略有增加。
3、校準(zhǔn)
通過修改程序中的這一句校準(zhǔn):
c0 = 3.12e-9 * c2c(f);
其中3.12e-9表示諧振電容在1kHz頻率下是3.12nF。
實測700uH空芯線圈,根據(jù)誤差大小,調(diào)整3.12的值,重新下載,使得測量準(zhǔn)確。
本表測量的結(jié)果實際上是等效并聯(lián)電感。
4、電容容量修正
?諧振器的極限諧振頻率是200kHz。
?滌綸電容隨頻率變大而變小,所以程序內(nèi)建修正表,改正電容的容量誤差。
以下是3.12nF電容的真值修正表,其中b數(shù)組是容量的修正系數(shù)
code float a[5]={100, 1000, 10000, 100000, 200000 }; //頻率
code float b[5]={1.004, 1.000, 0.992, 0.975, 0.973 }; //修正量(滌綸原真修正表)
?修正值改進
那個1M歐的耦合電阻,在超聲波范圍內(nèi)并不是存阻的。當(dāng)頻率較高時,電阻兩端的分布電容及LM393內(nèi)的信號耦合是不可以忽略的。雖然是電容耦合量很小,但在密勒效應(yīng)的作用下,會被成百上升倍放大,有效諧振電容變小。頻率比較高時,諧振器的阻抗很小,所以反饋系數(shù)非常弱,這就造成密勒效應(yīng)的影響嚴(yán)重,可影響2%以上,為此高頻率下,有效諧振電容僅修正系數(shù)僅為0.973是不夠的。
此外,LM393的延遲也會造成振蕩頻率變小,引起測值變大。如果諧振器高Q,則影響小。整個回路的Q值只有20左右,所以頻率高時,這個影響也是不能忽略的。用排除法證明:表筆接20R電阻測量電路中的那個功率電感,結(jié)果輸電感量變大了2%,并聯(lián)串聯(lián)關(guān)系的轉(zhuǎn)換遠沒有2%變化,諧振電壓的變化也遠不足以造成2%的變化,而接電阻后諧振阻抗變低,密勒效應(yīng)更大,應(yīng)造成電感量測值變小才對。顯然,這2%的增加是LM393引起的。
以上因素,結(jié)合起來,修正表變?yōu)?
code float a[5]={100, 1000, 10000, 100000, 150000 }; //頻率
code float b[5]={1.004, 1.000, 0.992, 0.960, 0.950 }; //修正量(綜合修正表)
?測量100uH以下的電感的改正
測量這種電感,頻率大約在150kHz至200kHz
這個范圍內(nèi)頻率變化,產(chǎn)生如下效果:
功率電感約有0.5uH的變化,電感量隨頻率變大而變小,引起電感測值變小。
滌綸電容隨頻率增加,容量變小,引起電感測值變大。
以及其它方面因素影響,相互補償,最后結(jié)果150kHz以后的電容修正值與200kHz的修正值是一樣的。所以電容修正表上限只要做到150kHz即可,大于150kHz的使用150kH的修正值。
//==========================================================================
// LC表驅(qū)動程序 V1.0
// 許劍偉 于莆田 2012.10
//==========================================================================
//==========================================================================
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#include
//==========================================================================
// 項目:LCD1602 四線驅(qū)動程序
// 設(shè)計要點:
// LCD1602 的運行速度慢,而單片機運行的速度快,因此容易因為速度不
// 匹配造成調(diào)試失敗。因此,調(diào)試之前應(yīng)準(zhǔn)確測試lcd_delay() 延時函數(shù)
// 準(zhǔn)確的延時量,如果不能滿足注釋中的要求,則應(yīng)調(diào)整循次數(shù)。每步操
// 作所需的延時量,按照數(shù)據(jù)手冊指標(biāo)指行,同時留下足夠的時間余量。
// 硬件連接:
// 至少需要9條線,電源線2條,7條信號線。信號線詳見程序中的接口定義。
// 清注意對LCD1602比對的調(diào)節(jié),否則無顯示。
// 設(shè)計:許劍偉,于莆田,2010.12
//==========================================================================
sbit lcd_RS = P0^1; //數(shù)據(jù)命令控制位,0命令1數(shù)據(jù)
sbit lcd_RW = P0^2; //讀寫位,0寫1讀
sbit lcd_EN = P0^3; //使能位,下降沿觸發(fā)
sbit lcd_D4 = P0^7; //數(shù)據(jù)端口D4
sbit lcd_D5 = P0^6; //數(shù)據(jù)端口D5
sbit lcd_D6 = P0^5; //數(shù)據(jù)端口D6
sbit lcd_D7 = P0^4; //數(shù)據(jù)端口D7
//==========================================================================
void lcd_delay(int n){ //LCD專用延時函數(shù)
//32MHz鐘頻下,約循環(huán)3000次延遲1毫秒
int i,j;
if(n<0) { for(i=0;i< 20;i++); return; } //10us
if(n== 0) { for(i=0;i<100;i++); return; } //50us
for(;n;n--){ for(j=0;j<2000;j++); } //n毫秒
}
//==========================================================================
void lcd_B(char f, uchar c, char t){ //控制四線式接口LCD的7個腳
//f=0寫命令字, f=1寫RAM數(shù)據(jù), f=2讀地址(或讀忙), f=3讀RAM數(shù)據(jù)
lcd_EN = 0;
lcd_RS = f%2;
lcd_RW = f/2%2;
//移入高四位
lcd_D4 = c & 16;
lcd_D5 = c & 32;
lcd_D6 = c & 64;
lcd_D7 = c & 128;
lcd_EN = 1; lcd_delay(-1); lcd_EN = 0; //使能脈沖
if(f==4) { lcd_delay(t); return; }
//移入低四位
lcd_D4 = c & 1;
lcd_D5 = c & 2;
lcd_D6 = c & 4;
lcd_D7 = c & 8;
lcd_EN = 1; lcd_delay(-1); lcd_EN = 0; //使能脈沖
lcd_delay(t); //不同的命令,響應(yīng)時間不同,清零命令需要2ms
}
//==========================================================================
void lcd_init(){ //LCD1602 初始化
//啟動四線模式須勢行9個步驟,初始化所須耗時較長,約65ms,時限不可減
lcd_delay(20); //啟動lcd之前須延時大于15ms,直到VDD大于4.5V
lcd_B(4, 0x30, 9); //置8線模式,須延時大于4.1ms
lcd_B(4, 0x30, 5); //置8線模式,須延時大于100us
lcd_B(4, 0x30, 5); //置8線模式,手冊中未指定延時
lcd_B(4, 0x20, 5); //進入四線模式
lcd_B(0, 0x28, 5); //四線模式雙行顯示
lcd_B(0, 0x0C, 5); //打開顯示器
lcd_B(0, 0x80, 5); //RAM指針定位
lcd_B(0, 0x01, 5); //啟動清屏命初始化LCD
}
//==========================================================================
//=========================幾個功能常用函數(shù)=================================
void lcd_cls() { lcd_B(0, 0x01+0, 2); } //清屏
void lcd_cur0() { lcd_B(0, 0x0C+0, 0); } //隱藏光標(biāo)
void lcd_goto1(uchar x){ lcd_B(0, 0x80+x, 0); } //設(shè)置DDRAM地址,第1行x位
void lcd_goto2(uchar x){ lcd_B(0, 0xC0+x, 0); } //設(shè)置DDRAM地址,第2行x位
void lcd_putc(uchar d) { lcd_B(1, 0x00+d, 0); } //字符輸出
void lcd_puts(uchar *s){ for(; *s; s++) lcd_B(1,*s,0); } //字串輸出
//==============字符顯示函數(shù)====================
#define digW 4 //數(shù)字顯示位數(shù)宏
void lcd_puti(long a,char w){ //定寬顯示正整數(shù)
char i=0, s[10]={32,32,32,32,32,32,32,32,32,32};
if(a<0) { a=-a; lcd_puts("-"); }
else lcd_puts(" ");
do{
s[i++] = a%10+48;
a /= 10;
}while(a);
for(;w;w--) lcd_putc(s[w-1]);
}
void lcd_putf(float a,char n,char w){ //浮點輸出,n是保留小數(shù)的位數(shù),w是數(shù)字寬度
char i,g,fi=0;
long b,c=1;
if(a<0) { lcd_putc('-'); a = -a; }
else { lcd_putc(' '); }
for(i=0;i
for(i=1;i
b = a;
for(i=0;i
g = b/c;
b -= g*c;
c /= 10;
if(g>9||g<0) g='*'-48;
if(i == w-n ) lcd_putc('.');
if(!g && !fi && i