Forum: Mikrocontroller und Digitale Elektronik Frequenz messen mit Timer 1


von Micha R. (michaavr)


Lesenswert?

Hallo,

ich verwende Bascom 1.11.9.1 und will mit nem ATmega8 eine Frequenz 
messen.

Meine Idee ist nun, die Frequenz am ATmega entweder an Pin T1 oder an 
Pin ICP1 anzulegen, der den Timer 1 hochzählt.

Timer 2 dient als Zeitbasis, der den Zählerstand in regelmäßigen 
Zeitabständen auslesen und auf 0 setzen soll.

Nun stellt sich mir folgendes Problem:
Wie erreiche ich es, dass die angelegte Frequenz den Timer 1 erreicht.
Und welcher Eingangs-Pin ist besser geeignet T1 oder ICP1?

Wie muß ich den Timer1 configurieren, daß T1 den Timer1 hochzählt?
Wie muß ich den Timer1 konfigurieren, daß ICP1 den Timer1 hochzählt?

Mitch.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Also der ICP zählt nicht in dem Sinne... du kriegst da eine Pulsbreite!
Was "besser" ist richtet sich auch etwas nach der Frequenz.
Für niedrige Frequenzen ist ICP idr besser, für hohe ist zählen mit T1 
besser.

von Micha R. (michaavr)


Lesenswert?

Ich möchte einen kleinen frequenzzähler bauen, der im Bereich 1Hz bis 
etwa 1MHz gehen soll.

Leider kriege ich es nicht hin, dass T1 den Timer1 hochzählt.
die Register TCCR1A=0 und TCCR1B=7 müßten richtig gesetzt sein.

Irgendwie kommt das Signal am Pin T1 nicht zum Timer1

Habe keine Ahnung warum.

Im Datenblatt steht unter der Tabelle der Taktquelle noch ein Satz, wie 
der Zühler Software-seitig kontrolliert werden kann. Den T1-Pin als 
Ausgang schalten. das klingt für mich aber etwas unlogisch.

von Avr N. (avrnix) Benutzerseite


Lesenswert?

Also hier habe ich ein LC-Messgerät welches über Frequenzmessung L und C 
erechnet. Es Wird auch die Frequenzausgegeben.

Die Frequenz wird über T1 gezählt.
Das Programm ist noch nicht fertig, die Frequenzmessung und Messung von 
L und C geht aber.  Du kannst die wesentlichen Sachen gerne anschauen.

Das Programm kommt wenn es fertig ist auf meine HP.

http://www.comwebnet.de - Bascom Projekte

'-----------------------------------------------------------------

'###############################################################
'# Der Kopf darf erweitert werden aber nicht gelöscht werden   #
'###############################################################
' Auf http://www.comwebnet.de - wurde veröffentlicht:
'###############################################################
' Prgrammname:   LC-Metermodul + Frequenzzähler (GPL 2)
'###############################################################
' Programmart: Vollversion
'###############################################################
' Autor:  Dirk Milewski
' Version: V1.1
' BASCOM AVR Verion: 1.11.8.1
' Datum:         12.02.2008
' HP/Forum: http://www.comwebnet.de ,
' Forum: http://comwebnet.weimars.net/forum
' Kontakt:
' Welchen µC:       Mega32 - 16MHz Quarz
'############################################################### 
iir
' Hardware/Port benutzt: LCD 4 BIT an PortC
' ADC0 -> Batterie Überwachnung
' Portd.1,2,3 Tasten
'
'###############################################################
' Changelog:
' Datum:
' Was wurde geändert:
' Warum wurde was geändert:
' Autor:
' Kontakt:
'#############################################

$crystal = 16000000                                         '
$regfile = "m32def.dat"
'$baud = 19200


$hwstack = 128
$swstack = 128
$framesize = 128

Const Version = "1.1"

Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portd.2 , Db5 = Portd.3 , Db6 = Portd.4 , 
Db7 = Portd.5 , E = Portd.1 , Rs = Portd.0
Cursor Off Noblink


Config Debounce = 30                                        'when the 
config statement is not used a default of 25mS will be used but we 
override to use 30 mS
'#######################################
' Frequenzmessung
'#######################################
Config Timer0 = Counter , Edge = Rising
'Handle frequency timer overflow
On Timer0 Timer0_overflow
'Track number of frequency couter overflows between measurements
Dim Overflow_count As Long
Overflow_count = 0
Dim Freq1 As Single
Dim Freq As Single
Dim Freq11 As Single
Dim Freq22 As Single
Dim Freq2 As Single
Dim Induktion As Single
Dim Kondensator As Single
Dim Cx As Single
Dim Lx As Single

'Calibration factors
Dim Fcal As Single
Dim Ical As Single

' Tastenauswahl der Funktion von L,C,f
Dim Auswahl As Byte



'Konstanten L und C ( ohne Cx,Lx )
Fcal = .000000001
Kondensator = Fcal                                          '1nF
Ical = .001                                                 ' 1mH

Dim W As Byte
Dim W_temp As Word
'Flag designates calibration mode is active
Dim Calibrate As Byte
Calibrate = 0

'Flag designates lock mode is active
Dim Lock As Bit
Lock = 0
Declare Function Frequenz() As Single
Declare Sub Eingabe
'############################################
'   Eingaben
'############################################
Config Pinb.5 = Input
Portb.5 = 1
Cmessung Alias Pinc.5

Config Pinb.6 = Input
Portb.6 = 1
Imessung Alias Pinb.6

Config Pinb.7 = Input
Portb.7 = 1
Fmessung Alias Pinc.7

'############################################
'    Ausgabe
'############################################

'  relais
Config Pinb.2 = Output
Relais Alias Portb.2


'Induktionfaktor 4 x Pi^2
Const Ifaktor = 39.4784176043574

'Set up timer to track time
Config Timer1 = Timer , Prescale = 1024

Stop Timer1
'Preload timer constant for 1 second duration at 8 MHz
Const Timer1pre = 49910

Timer1 = Timer1pre
'Handle time overflow (occurs every second)
On Timer1 Pulse

Enable Interrupts
Enable Timer0
Enable Timer1
Stop Timer0
Stop Timer1

'Config Pinb.1 = Output

'Enable Timer2
'Config Timer2 = Timer , Prescale = 1 , Compare = Toggle









Cls

Upperline
 Lcd " LC-Messung " ; Version
 Lowerline
 Lcd "www.comwebnet.de"
 Wait 1
Call Eingabe



Gosub Kali
'Start Timer2
Do
Tccr2 = &B00011001
Ocr2 = W

If W = 255 Then W = 0

Incr W

'######################################
' Messung der Frequenzverstimmung
'######################################
Freq2 = Frequenz()

'#######################################
'      Berechnung von Cx oder Lx
'#######################################

Freq22 = Freq2 * Freq2
Freq11 = Freq1 * Freq1
Cx = Freq11 / Freq22
Cx = Cx - 1
Lx = Freq11 / Freq22
Lx = Lx - 1
Cx = Cx * Kondensator
Cx = Cx * 1e6
Lx = Lx * Induktion
Lx = Lx * 1e3

'######################################################
' Je nach Auswahl Kapazität oder Induktivität Ausgabe
'######################################################

If Auswahl = 1 Then
 Cls
 Lcd Fusing(cx , "#.###") ; "uF "
 Cx = Cx * 1000
 Lcd Fusing(cx , "#.###") ; "nF"
 Lowerline
 Cx = Cx * 1000
 Lcd Fusing(cx , "#.##") ; "pF"
End If


If Auswahl = 2 Then
 Cls
 If Freq < 10 Then
   Lcd " Leitung offen!"
   Lowerline
   Lcd " k. Messung"
 Else
  Lcd Fusing(lx , "#.##") ; "uH"
  Lowerline
  Lx = Lx * .001
  Lcd Fusing(lx , "#.###") ; "mH"
 End If
End If


If Auswahl = 3 Then

 Freq = Frequenz()
 'Print Str(w) ; " " ;Str(freq) ; " " ;
 Cls
 Lcd Str(freq) ; " Hz"
 Lowerline
 Freq = 1 / Freq
 Freq = Freq * 1000
 Lcd Str(freq) ; " ms"



 ' Print Str(freq)


End If


If Auswahl = 4 Then
 'rechteckgenerator
 Freq = Frequenz()
 Cls
 Lcd Str(freq) ; " Hz"
 Lowerline
 Freq = 1 / Freq
 Freq = Freq * 1000
 Lcd Str(freq) ; " ms"
End If

'#############################################################
'      wurde eine taste gedrückt
'#############################################################

If Pinb.5 = 0 Or Pinb.6 = 0 Or Pinb.7 = 0 Then
Gosub Kali
Call Eingabe
End If


Loop

End
                          'end program
'###################################
'   Zählen des Frequenz-Overflows
'###################################
Timer0_overflow:
   Incr Overflow_count
   Return

'Frequenzmessung über Timer1 im overflow
Pulse:
   Stop Timer0
   Stop Timer1


   '#########################
   'berechnen der Frequenz
   '#########################
   W_temp = Counter0
   Freq = Overflow_count * 256
   Freq = Freq + W_temp



   'Zähler zurück setzen
   Counter0 = 0
   Overflow_count = 0
   Start Timer0
   Timer1 = Timer1pre
   Start Timer1
   Return

'########################################
'     Ermitteln der Frequenz
'########################################
Function Frequenz() As Single
    Start Timer0
    Start Timer1
    Wait 3
    Stop Timer0
    Stop Timer1
    Frequenz = Freq
End Function

'#########################################
'    Auswahl der Eingabe
'#########################################
Sub Eingabe
 Auswahl = 0
 Cls

 Lcd " Messung C od.L ? "
 Lowerline
 Lcd " oder Frequenz"
 While Auswahl < 3

If Pinb.5 = 0 Then
    Auswahl = 1
    Lowerline
    Lcd " C-Messung"
    Relais = 0
    Wait 1
    Cls
    Lcd "Messletung"
    Lowerline
    Lcd "frei ?"
    Bitwait Pinb.5 , Reset

   Exit While
End If

If Pinb.6 = 0 Then
    Auswahl = 2
     Lowerline
    Lcd " L-Messung"
    Relais = 1
    Wait 1
    Cls
    Lcd "Messleitung"
    Lowerline
    Lcd "Kurzschliesen"
    Bitwait Pinb.6 , Reset
    Exit While
   End If

If Pinb.7 = 0 Then
Relais = 0
    Auswahl = 3
     Lowerline
    Lcd " Frequenz"
    Exit While
End If

Wend

End Sub

Kali:
Freq1 = Frequenz()

Upperline
Lcd "Freq1:" ; Str(freq1)
Lowerline
Induktion = Freq1 * Freq1
Induktion = Induktion * Ifaktor
Induktion = Induktion * Fcal
Induktion = 1 / Induktion
Induktion = Induktion * 1000                                ' mH Einheit
Lcd "* Kalibriert *"
'Print "Wert Frequenz ms"
Wait 1
Cls
Return
' frequenzteileransteuerung
' rechteckgerator

von Micha R. (michaavr)


Lesenswert?

Hallo AVR NIX,

danke für dein Programm. Muß ich mal genauer anschauen.

Eine Frage dazu hätte ich.

Wie regst du den Schwingkreis an, um dann die Frequenz zu messen?

Zurück zu meinem Problem:
Ich habe es gelöst. Der Fehler war in der OC2-Interrupt-Routine.

Hatte den falschen Zähler zurückgesetzt und ausgelesen. (War wohl müde!)

Aber jetzt funzt es!

Gruß Mitch.

PS: Vergesse meine Frage nicht!

von Avr N. (avrnix) Benutzerseite


Lesenswert?

Gute Frage ! ich weis es nicht vielleicht durch die Energie der 
Schaltung, oder der Empfang von Störungen, keine Ahnung.

Die Schaltung ( LC-Messmodul auf meiner HP ) ist hier auch schon 
gewesen, allerdings in C.

Wegen den Aufbau etc. Frage im Forum auf http://www.comwebnet.de nach.

von He Ro (Gast)


Lesenswert?

> Im Datenblatt steht unter der Tabelle der Taktquelle noch ein Satz, wie
> der Zühler Software-seitig kontrolliert werden kann. Den T1-Pin als
> Ausgang schalten. das klingt für mich aber etwas unlogisch.

Warum denn? Dann kannst du, indem du mit der Software den Ausgangs-Pin 
toggelst den Timer hochzählen. Nicht ganz das, was du willst, aber es 
scheint Leute zu geben, die das wollen, deswegen steht es im 
Datenblatt...

MfG, Heiko

von Micha R. (michaavr)


Lesenswert?

Hallo @ He Ro

habs ausprobiert, das funktioniert tatsächlich.
Aber eine Anwendung fällt mir jetzt dazu keine ein.

Mitch.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.