ايران ويج

نسخه‌ی کامل: خازن سنج با امپدانس ورودی بالا
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
سلام خدمت دوستان عزیز
همینطور که میدونید اخر ترم هست و ترافیک بالای پروژه های اینترنتی و ...،توی این قیل و قال منم واسه یکی از دوستان دنبال یه خازن سنج تو نت بودم که به این رسیدم . گفتم بد نیست اینجا هم باشه . تستش هم کردم واقعا خوب کار میکنه
[تصویر:  capmeter_2.jpg]

ویژه گیها
نقل قول: 1-وضوح بالا اندازه گیری 6 تا 7 رقم اعشار(برخی دیگر 3 تا 4 رقم )
2-محدوده اندازه گیری وسیع بین 0 پیکو فاراد تا 50 میکرو فاراد
3-بدلیل استفاده از یک میکرو 16F628 ارزان تمام میشود.
4-بدون نیاز به کالیبره سازی.
5-نیازی به رعایت پلاریته خازن های بزرگ نیست (من این جوری برداشت کردمWink)

روش اندازه گیری

در این مدار از مقایسه کننده داخلی میکرو برای طراحیِ یک اسیلاتور RC استفاده شده است که ما را از IC دوم بینیاز میکند. فرکانس اسیلاتور نیز بر توسط رابطه ریاضی (f=7.2/Cuf در صورتی که مقاومت های سبز رنگ با هم برابر باشند)تعیین میشود .که با ثابت بودن مقاومتهای اسیلاتور ٍ فرکانس خروجی متناسب با مقدار خازن مجهول می باشد.که با توجه به رابطه ذکر شده خازن محاسبه میشود.
[تصویر:  capmeter_3.gif]

توجه مقاومت RTباید دقیقا 10 کیلو اهم باشه (خطای 1 درصد== مقاومت های متال فیلم) در غیر اینصورت مقدار بدست امده صحیح نیست.راستش منم چنین مقاومتی گیرم نیومد در نتیجه به جاش یک مقاومت 9.1 کیلو با یک مولتی ترن 5 کیلو (پتانسیومتر چند دوری) با هم سری کردم.

[تصویر:  capmeter_4.gif]

اینم لینک فایل هگز میکرو

منبع
سلام ، پروژ جالبی بود ، من یه پروژه دارم خیلی شبیه اینه ، اگه میشه یه نگاهی به این برنامه کنید یه توضیحی بدید ، من مییخوام این برنامه به بیسیک بنویسم اگه راهنمایی کنید ممنون میشم.
این هم مدار :
[تصویر:  hn6jbhlj7ljp2a91zxw.jpg]
[تصویر:  i5h2jv5q0o16e9lvvq5l.jpg]


این هم خود برنامه :

/*
Description : CapMeter based on RC time constant
MCU: PIC16F28A
Oscillator: HS, 4.0000 MHz external

*/

// LCD module connections
sbit LCD_RS at RB2_bit;
sbit LCD_EN at RB3_bit;
sbit LCD_D4 at RB4_bit;
sbit LCD_D5 at RB5_bit;
sbit LCD_D6 at RB6_bit;
sbit LCD_D7 at RB7_bit;
sbit LCD_RS_Direction at TRISB2_bit;
sbit LCD_EN_Direction at TRISB3_bit;
sbit LCD_D4_Direction at TRISB4_bit;
sbit LCD_D5_Direction at TRISB5_bit;
sbit LCD_D6_Direction at TRISB6_bit;
sbit LCD_D7_Direction at TRISB7_bit;

sbit Va at RA0_bit;
sbit Switch at RB0_bit;

char message1[] = "Capacitance";
char message2[] = "Meter";

unsigned int T_Value, Num;
unsigned short i, j, TimerValue, OverRange = 0;
char Capacitance[] = "00.000 uF";

void interrupt(){
if(PIR1.TMR2IF){
TMR2 = TimerValue;
Num ++;
if(Num > 9999) OverRange = 1; // Range is 99.99 uF
PIR1.TMR2IF =0; // Clear TMR0 interrupt flag
}
}

void Display_Cap(unsigned int n){
Capacitance[0] = n/10000 + 48;
Capacitance[1] = (n/1000)%10 + 48;
Capacitance[3] = (n/100)%10 + 48;
Capacitance[4] = (n/10)%10 + 48;
Capacitance[5] = (T_Value*10)/153 + 48;
Lcd_Cmd(_Lcd_Clear);
Lcd_Out(1, 1, "C = ");
Lcd_Out(1, 5, Capacitance);

}

void reset(){
TRISA = 0b00000100;
CMCON = 7;
RA1_bit = 0;
Delay_ms(2000);
TRISA = 0b00000110;
CMCON = 5;
}

void main(){

char cap_size;
TRISB = 0b00000001;
PORTB = 0;
TRISA = 0b00000110;
OPTION_REG.T0CS = 0;
INTCON.GIE = 1; //Enable global interrupt
INTCON.PEIE = 1; //Enable peripheral interrupt

// Configure Timer2 module
PIE1.TMR2IE = 1; // Enable Timer2 interrupt
T2CON = 0; // Prescaler 1:1, and Timer2 is off initially
PIR1.TMR2IF =0; // Clear int bit

// Configure Comparator module
CMCON = 5; // Independent comparator between RA1 (-) and RA2(+)

Lcd_Init();
Lcd_Cmd(_Lcd_Clear);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1, 1, message1);
Lcd_Out(2, 1, message2);
delay_ms(2000);
Lcd_Cmd(_Lcd_Clear);

Lcd_Out(1, 1, "C = ");
Lcd_Out(1, 5, Capacitance);
Va = 0;
TimerValue = 108; // 104 + 4 additional clock cycles delay on branching to ISR
while(1){
if(!Switch) {
Num = 0;
OverRange =0;
Lcd_Cmd(_Lcd_Clear);
Lcd_Out(1, 1, "Testing.");
Lcd_Out(2, 1, "...");
TMR2 = TimerValue; // Initialize Timer2
Va = 1; //apply voltage
T2CON.TMR2ON = 1; // start timer
while(CMCON.C2OUT) {
if(OverRange) break;
}
T2CON.TMR2ON = 0; // stop timer
T_Value = TMR2 - TimerValue; // T_Value is used for improved resolution
Va = 0;
//---------------------------------
if(!OverRange){
Display_Cap(Num*10);
}
else{
OverRange = 0;
Lcd_Cmd(_Lcd_Clear);
Lcd_Out(1, 1, "Out of Range!");
}
reset();
}
}
}