Hallo Leute, ich versuche schon seit langem mittels Externe Interrupts(INT0 oder INT1) einen Frequenzzähler mit meinem ATmega hinzubekommen. Ich habe dazu einen definierten Rechteckimpuls von 50KHz bis 120KHz. Diesen möchte ich messen.Leider bekomme ich über die UART weniger vorkommenden Flankenanzahl die ausgegebene Frequenz, die ich erwarte. Ich habe langsam keine Ahnung mehr was ich machen soll. Vielleicht könnt ihr mir helfen und mir einen Tipp geben, wo das Problem liegen könnte. ich hatte diese Problem mit einem Timer und einem Counter glöst.Es gibt dafür einen reservierten Pin am Mikrocontroller mit der Bezeichnung T1,weil ich möchte Frequenzzähler für 3 Signalen gleichzeitig mit einem ATmega8 hinzubekommen. geht das oder geht nicht.
Ohne Deine Anforderungen zu kennen, kann man wenig sagen. Drei Signale 50 - 120 kHz gleichzeitig mit einem ATmega8 ist sehr problematisch bis unmöglich. Ideal wäre ein reziprokes Verfahren mit ICP als Meßeingang und einem vorgeschalteten Multiplexer. Welche Auflösung brauchst Du und welche Meßgeschwindigkeit? Was willst Du messen und wo sollen die Daten hin?
Nabil Mourad schrieb: > Ich habe langsam keine Ahnung mehr was ich machen soll. Wir ja nichtmal, was Du bisher gemacht hast. Nabil Mourad schrieb: > Vielleicht könnt > ihr mir helfen und mir einen Tipp geben "Hilfe, aber ich zeig nix" klingt nach abstauben wollen. 16MHz / 120kHz sind 133 Zyklen, das ist knapp für 3 Interrupts. Besser 2 über T0, T1 zählen und nur einen als Interrupt. T2 als Zeitbasis. Peter
ich habe folgenen C Code mit einen Atmega 8. Mit dem angehängten Programm (ICP1 / PB0) möchte ich nun diese Pulsweite messen und im Endeffekt einen Abstand messen, es handelt sich nämlich um einen FGM 3h (Magnetfeldsensor).aber Leider bekomme ich über die UART nur die 0 Hz Werten . Hat jemand eine Idee wie man das hinbekommen könnte. Vielen Dank schon mal im voraus :)
Oh je. Erst Frequenz, dann Pulsweite. Hast Du alle drei Signale an ICP1?
nochmal um mein Problem richtig zu erklären, ich habe ein Sensor FGM-3h, diese Sensor misst den Magnetfeld, und diese Magnetfeld wird Rechtecksignal (nur 1 Signal) zu meinem Mikrocontroller ATmega8 gesendet. ich möchte die Pulsbreite diese Signal messen, da benutzte ich den Eingang ICP1, diese messwerte werden in USART als ASCII gesendet. mit Eingang T1(Timer/Counter )habe ich schon eine Lösung, aber jetzt brauche den zweite Lösung.
ich wollte mit dem Timer_1 Pulsweiten oder Signalperioden messen. Es wird mit Hilfe der Input Capture Funktion (spezielles Register des Controllers), die Zeit zwischen zwei Flanken gemessen. Diese Funktion nutzt den Capture-Interrupt ( INT_TIM1CAPT). Der Puls wird zwischen einer steigenden und der nächsten fallenden Signalflanke gemessen. Die Periode wird zwischen zwei steigenden Signalflanken gemessen. Durch die Input Capture Funktion gehen Die Daten der ausgegebenen Frequenz werden in einem ARRAY gespeichert und über die serielle schnittstelle RS232 ALS ASCII-CODE Code übertragen.
das funktioniert so nicht: irgendwie muss gesichert werden dass flanke1 und flanke2 zusammengehören und auch dass sie sich während der Berechnung flanke2-flanke1 nicht ändern es fehlt also ein flag und der Interrupt muss gesperrt werden
PORTB = 0b00111110; DDRB = 0b00111110; // Port B0 als Eingang (ICP) TCCR1A = 0; TIMSK |= (1<<TICIE1); // ICP enable TCCR1B |= (1<<CS10)|(1<<CS12)|(1<<ICES1); while ((TIFR&(1<<ICF1)) == 0); Flanke1 = ICR1; TIFR = (1<<ICF1); TCCR1B = 0x05; Pulsdauer = ICR1-Flanke1; so was meinst du ? wenn was falch sag mir bitte bescheid! Danke
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.