-         

Ergebnis 1 bis 7 von 7

Thema: kapazitätsbestimmung

  1. #1
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    24
    Beiträge
    1.544

    kapazitätsbestimmung

    Anzeige

    hallo alle,

    ich möchte gleich vorweg sagen, JA ICH HABE GOOGLE BENUTZT UND JA ICH HABE AUCH DIE SUFU IM ROBOTERNETZ BENUTZT!!!!

    ich möchte die kapazität eines kondensators bestimmen, von ungefähr 0.2pf bis 500nf.
    dazu hab ich mir überlegt, einen astabilen multivibrator (evtl. mit ne555) aufzubauen und dann die frequenz zu messen. der zu messende c wird dann parallel zu dem anderen c vom multivibrator angeschlossen und verändert somit die frequenz. diese wird dann erneut gemessen und mit der ersten messung verglichen. ich gehe jetzt mal davon aus, dass sich die frequenz proportional zum c verändert?!?!?!
    ich hatte dabei an eine frequenz von ungefähr 600kHz gedacht, allerdings ist a) meine messmethode ziemlich ungenau (schwankt um den wert 100) und b) ist die höchste frequenz, die mir der atmega32 bis jetzt angezeigt hat ungefähr 22kHz. das ist definitiv zu wenig!! wie kann ich den höhere frequenzen messen?? ich habe mal gehört, man kann max. eine frequenz von der halben taktfrequenz messen. das wären dann bei mir (16000000/2), also ungefähr 8MHz.
    hier mal mein code, ich habe 2 varianten, einmal über timer = counter und einmal mit externem interrupt:

    Code:
    $regfile = "m32def.dat"
    $crystal = 16000000
    
    Config Lcd = 20 * 4
    Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portc.4 , Rs = Portc.5
    Config Lcdbus = 4
    Initlcd
    Cls
    Cursor Off Noblink
    
    Config Pinb.0 = Input
    Portb.0 = 1
    Config Pina.0 = Input
    Porta.0 = 1
    
    Config Timer0 = Counter , Edge = Falling
    Timer0 = 255
    On Timer0 Isr_von_timer0
    Stop Timer0
    Enable Timer0
    
    Config Timer1 = Timer , Prescale = 1024
    Timer1 = 0
    Stop Timer1
    Enable Timer1
    
    Enable Interrupts
    
    
    Main:
    
    Dim I As Long
    I = 0
    
    Locate 1 , 1
    Lcd "Ergibnis in 1 sec"
    Waitms 400
    Locate 2 , 1
    Lcd "ab jetzt"
    
    Start Timer1
    Start Timer0
    Do
    Loop Until Timer1 = 15625
    Stop Timer0
    Stop Timer1
    Timer1 = 0
    
    Locate 3 , 1
    Lcd "Wert = " ; I
    
    Do
    Loop Until Pina.0 = 0
    Cls
    Waitms 200
    Goto Main
    
    End
    
    Isr_von_timer0:
    Timer0 = 255
    Incr I
    Return
    und:

    Code:
    $regfile = "m32def.dat"
    $crystal = 16000000
    
    Config Lcd = 20 * 4
    Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portc.4 , Rs = Portc.5
    Config Lcdbus = 4
    Initlcd
    Cls
    Cursor Off Noblink
    
    Config Pind.2 = Input
    Portd.2 = 1
    Config Pina.0 = Input
    Porta.0 = 1
    
    Config Int0 = Falling
    On Int0 Isr_von_int0
    
    Config Timer1 = Timer , Prescale = 1024
    Timer1 = 0
    Stop Timer1
    Enable Timer1
    
    Enable Interrupts
    
    Main:
    
    Dim I As Word
    I = 0
    
    Locate 1 , 1
    Lcd "Ergibnis in 2 sec"
    Waitms 400
    Locate 2 , 1
    Lcd "ab jetzt"
    Wait 1
    
    Start Timer1
    Enable Int0
    Do
    Loop Until Timer1 = 15625
    Disable Int0
    Stop Timer1
    Timer1 = 0
    
    Locate 3 , 1
    Lcd "Wert = " ; I
    
    Do
    Loop Until Pina.0 = 0
    Cls
    Waitms 200
    Goto Main
    
    End
    
    Isr_von_int0:
    Incr I
    Return
    welche möglichkeit ist den am besten?? mit interrupt oder counter?
    oder gibt es noch eine andere möglichkeit?

    danke schon mal für eure antworten.

    gruß
    chris

  2. #2
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    17.02.2005
    Ort
    NRW-Bergisches Land
    Beiträge
    311
    Hast du dir mal den Befehl GETRC angeschaut?
    Dein Programm könnte deutlich kompakter aussehen.
    Gruß RePi!


    *** Holzhacken ist deshalb so beliebt, weil man bei dieser Tätigkeit den Erfolg sofort sieht. ***
    *** (Albert Einstein) ***

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    24
    Beiträge
    1.544
    hallo repi,

    ja, habe ich, allerdings kann ich mit diesem befehl nicht so kleine kapazitäten messen, wie z.b. 1pf oder sowas!!
    aber trotzdem danke für deine antwort!

    gruß
    chris

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    24
    Beiträge
    1.544
    kann den niemand was zu meinem code sagen??
    ist er richtig/falsch??
    oder soll ich es ganz anders machen??

    gruß
    chris

  5. #5
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Die Methode über die Frequenzmesung ist schon möglich und gar nicht so schlecht. Allerdings wird der NE555 nicht so schnell laufen. Die gezeigten Variante sind nur für eher niedrige Frequenzen geeigent und haben keine besonders hohe Auflösung. Mit dem Timer als Eingang könnte man das noch etwas verbessern und auch hohe Frequenzen bis etwa 7 MHz zulassen. Man sollte den Timer auch wirklich zählen lassen und nicht für jede Periode einen Interrupts auslösen. Als Ergebnis hat man dann den Zählerstand und die Zahl der Interrupts. Ohne externe Hardware kann man so allerdings eine Unsicherheit bei der Gate Zeit bekommen, die man nicht so ohne wieteres lösen kann. Für mehr Auflösung bei niedrigen Frequenzen kann man die ICP Funktion von Timer 1 nutzen. Man mißt dann nicht die Frequenz direkt, sondern die Zeit für eine oder mehrere Perioden. Für die Capatzitätsmessung ist das aber sowieso eher besser.

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    24
    Beiträge
    1.544
    hallo besserwessi,

    danke für deine antwort! du hast mir wirklich sehr geholfen.

    ich habe mir jetzt folgendes überlegt:
    Code:
    $regfile = "m32def.dat"
    $crystal = 16000000
    
    Config Lcd = 20 * 4
    Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portc.4 , Rs = Portc.5
    Config Lcdbus = 4
    Initlcd
    Cls
    Cursor Off Noblink
    
    Config Pinb.0 = Input
    Portb.0 = 1
    Config Pina.0 = Input
    Porta.0 = 1
    
    Config Timer0 = Counter , Edge = Falling
    Timer0 = 0
    On Timer0 Isr_von_timer0
    Stop Timer0
    Enable Timer0
    
    Config Timer1 = Timer , Prescale = 1024
    Timer1 = 0
    Stop Timer1
    Enable Timer1
    
    Enable Interrupts
    
    
    Main:
    
    Dim I As Long
    I = 0
    
    Locate 1 , 1
    Lcd "Ergibnis in 2 sec"
    
    Start Timer1
    Start Timer0
    Do
    Loop Until Timer1 = 31250
    Stop Timer0
    Stop Timer1
    Timer1 = 0
    
    I = I * 256
    I = I / 2
    
    Locate 3 , 1
    Lcd "Wert = " ; I
    
    Do
    Loop Until Pina.0 = 0
    Cls
    Waitms 200
    Goto Main
    
    End
    
    Isr_von_timer0:
    Timer0 = 0
    Incr I
    Return
    was sagst du dazu??
    könnte man das so lassen??

    gruß
    chris

  7. #7
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    So wird der Timer zwar wohl richtig zählen, aber das Ergebnis wird noch nicht richtig ausgelesen. Als Ergebnis sollte hier mehr Timer0 + 256 * I dienen.

    In der ISR von Timer0 sollte man auch nicht Timer0=0 setzen, sondern den sollte man weiterlaufen lassen.

    Die Festlegung der gate Zeit durch timer1 könnte man noch etwas verbessern indem man einen Interrupts von timer1 zum anhalten der Messung benutzt. So wie es jetzt ist hat man als Unsicherheit einen eher unwahrscheinlichen Interrupts von timer0 und die Länge der Schleifen die auf den passenden Wert in Timer1 wartet. Mit dem Interrupts zum Stoppe fällt die Schleife als Unsicherheit weg. Den Fehler durch einen möglichen, aber seltenen Interrupt von timer0 kann man nicht so einfach verhindern. Dafür sollte sich auch eine Lösung finden, ist aber dann nicht mehr so einfach. Vermutlich wird der Unterschied aber kaum ins Gewicht fallen.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •