ผมอยากลองสร้าง LC Meter ครับ

Started by gajidirdz, June 13, 2013, 11:14:15 PM

Previous topic - Next topic

gajidirdz

Quote from: ozuke on June 15, 2013, 12:19:37 PM
Quote from: Maxitron on June 14, 2013, 05:15:13 PM
ดูจากลิงค์ท่านโอแล้ว
ผมพอจะขยายความได้ดังนี้ครับ

1. หากต้องการวัดค่า L ก็ fixed ค่า C แล้ววัดความถี่ด้วย PIC เอาเข้าสมการคำนวณหาค่า L
2. หากต้องการวัดค่า C ก็ fixed ค่า L แล้ววัดความถี่ด้วย PIC คำนวณหาค่า C
3. ถ้างั้น PIC ก็คงทำหน้าที่เพียงวัดความถี่ แล้วเอาเข้าสมการที่รู้ค่า L หรือ C แน่นอนแล้ว(การวัดความถี่คงต้องแม่นยำมากเลยนะครับ)

ถ้าผมเข้าใจไม่ผิดพลาดก็คงต้องแยกเป็น 2 ประเด็น
1.สร้างวงจรแล้วลองวัดความถี่ดู แล้วเข้าสมการคำนวณว่า ได้ค่า L หรือ C แม่นยำเพียงใด
2.สร้างเครื่องวัดความถี่ที่มีความแม่นยำสูง

ถ้าทำได้ 2 ประเด็นนี้ก็น่าจะใกล้เคียงครับ ผิดถูกยังก็ต้องขออภัยด้วยครับ
ถูกต้องแล้วครับ
ในการใช้งานมันจะมีปุ่ม Adjust อยู่ครับ
มันเอาไว้ปรับให้มันเที่ยงตรงครับ
คือชอร์ทสายแล้ววัดความถี่ออกมาครับ

คือผมยังติดอยู่ตรง Ccal กับ relay อะคับ มันเอาไว้ทำอะไรหรอคับ

MicroX



ดูจากรูปแล้ว Ccal เป็น C- calibrate ใช้ร่วมกับ relay เพื่อตัดต่อทำ Automatic Ranging ครับ

gajidirdz

Quote from: MicroX on July 02, 2013, 12:40:29 PM


ดูจากรูปแล้ว Ccal เป็น C- calibrate ใช้ร่วมกับ relay เพื่อตัดต่อทำ Automatic Ranging ครับ

ขอบคุณมากครับผมม


Maxitron

ผมว่าน่าจะลองต่อวงจรแบบง่าย ๆ ก่อนนะท่าน เอาแค่ L กับ C ที่รู้ค่าแน่นอนมาต่อแบบ LC resonance แล้ววัดความถี่ดูก่อน ว่าผลที่ได้ใกล้เคียงกับทางทฤษฏีแค่ไหน

อย่าลืมนะครับว่าสิ่งที่ยุกยากและซับซ้อน เกิดจากจากสิ่งง่ายๆนับหลายร้อยพัน เอาใจช่วยครับ..ขอให้สำเร็จ ;D

gajidirdz

Quote from: Maxitron on July 02, 2013, 08:30:54 PM
ผมว่าน่าจะลองต่อวงจรแบบง่าย ๆ ก่อนนะท่าน เอาแค่ L กับ C ที่รู้ค่าแน่นอนมาต่อแบบ LC resonance แล้ววัดความถี่ดูก่อน ว่าผลที่ได้ใกล้เคียงกับทางทฤษฏีแค่ไหน

อย่าลืมนะครับว่าสิ่งที่ยุกยากและซับซ้อน เกิดจากจากสิ่งง่ายๆนับหลายร้อยพัน เอาใจช่วยครับ..ขอให้สำเร็จ ;D

ผมยังทำไม่ได้เลยครับ ตอนนี้ผมสร้างวงจรนับความถี่ได้แล้ว ผมจึงจะนำมาประยุกต์ใช้นับความถี่กับวงจร LC Meter นี้ โดยใช้ Timer เป็นตัวนับเวลา แต่ยัง งงๆ กับการใช้ timer อยู่ครับ ไม่ทราบว่ามีคำแนะนำหรือตัวอย่างที่ทำให้เข้าใจง่ายบ้างไหมครับ
http://www.thaimicrotron.com/CCS-628/Timer/CaptureEx1.htm
ผมดูตามลิงค์นี้และอีกหลายๆลิงค์ ก็ยังไม่เข้าใจอยู่ดีครับ

gajidirdz

#include <16f877a.h>
#use delay(clock=12M)
#include <LCD.c>
#fuses hs,nowdt,nocpd,nolvp,noprotect
#define use_portb_lcd
#byte portc=0x07
#bit  led=portc.4

int16 value;

void main()
{
     lcd_init();
   lcd_gotoxy(1,1);
      printf(lcd_putc,"Frequency");

   set_tris_c(0x00);
   led=1;
   delay_ms(100);
   
   while(1)
   {
      set_timer1(0);   
      setup_timer_1(T1_external | T1_DIV_by_1);
      delay_ms(1000/3);         // in protues, should be 1000/3
   
     
      value=get_timer1();
      lcd_gotoxy(1,2);
      printf(lcd_putc,"%lu HZ   ",value);     
      led=!led;
   }
}

ผมต้องแก้ส่วนไหนให้มันทำงานได้ในระดับความถี่สูงๆอ่ะครับ ฮือๆ ตอนนี้ได้แค่ 0-60k Hz เองครับ = ="

RoLRoR

นับความถี่ผมใช้วิธีนี้ครับ
สร้างตัวแปรเก็บค่าขึ้นมาตัวหนึ่งเป็น int32 ก็ได้ และตั้งให้ timer1 มี interrupt ด้วย

โดยเมื่อ timer1 รับสัญญาณ clock ภายนอก แล้วนับจน overflow เกิด interrupt แล้ว
ใน timer1_interrupt ก็ให้เพิ่มค่า ตัวแปร A +65536 ก็คือค่าที่ timer1 นับได้มากสุด
ถ้า clock มามาก ค่าก็ไปอยู่ในตัวแปร A เรื่อยๆ
พอครบเวลา ก็อ่านค่าจาก timer1 + ค่าจากตัวแปร A = เป็นค่านับรวมได้แล้วครับ

ฐานเวลา 1วินาที ที่คุณ gajidirdz ใช้แบบหน่วงเวลาเอา
ปรับปรุงใช้ timer2 เป็น interrupt ก็จะช่วยให้เที่ยงตรงมากขึ้นครับ
เพราะหน่วงเวลาอาจจะถูกการทำงาน timer1_interrupt หรืออื่นใด แทรกได้ครับ

:)

gajidirdz

Quote from: RoLRoR on August 28, 2013, 05:27:12 AM
นับความถี่ผมใช้วิธีนี้ครับ
สร้างตัวแปรเก็บค่าขึ้นมาตัวหนึ่งเป็น int32 ก็ได้ และตั้งให้ timer1 มี interrupt ด้วย

โดยเมื่อ timer1 รับสัญญาณ clock ภายนอก แล้วนับจน overflow เกิด interrupt แล้ว
ใน timer1_interrupt ก็ให้เพิ่มค่า ตัวแปร A +65536 ก็คือค่าที่ timer1 นับได้มากสุด
ถ้า clock มามาก ค่าก็ไปอยู่ในตัวแปร A เรื่อยๆ
พอครบเวลา ก็อ่านค่าจาก timer1 + ค่าจากตัวแปร A = เป็นค่านับรวมได้แล้วครับ

ฐานเวลา 1วินาที ที่คุณ gajidirdz ใช้แบบหน่วงเวลาเอา
ปรับปรุงใช้ timer2 เป็น interrupt ก็จะช่วยให้เที่ยงตรงมากขึ้นครับ
เพราะหน่วงเวลาอาจจะถูกการทำงาน timer1_interrupt หรืออื่นใด แทรกได้ครับ

:)

ผมเซ็ทค่าให้ timer1 ไม่ได้อ่ะครับ มันคอมไพล์ไม่ผ่าน

unsigned long long value;
int32 a;
     T1CON = 0x01; ------------------------>
     PIR1.TMR1IF = 0;     V
     TMR1H = 0xFF;         V
     TMR1L = 0xFF;          V
     PIE1.TMR1IE = 1;     V
     INTCON = 0xC0;-----------------------> เซ็ทไม่ได้อ่ะครับ




void main()
{
     lcd_init();
   lcd_gotoxy(1,1);
      printf(lcd_putc,"Frequency");

ตามนี้อ่ะครับ