-         

+ Antworten
Seite 1 von 4 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 35

Thema: Ein paar Fragen zum Timer !!!

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    08.02.2017
    Beiträge
    14

    Ein paar Fragen zum Timer !!!

    Anzeige

    Hallo zusammen,

    ich bin die neue hier

    Habe ein paar Fragen an euch Profis.

    Und zwar möchte ich gerne mit dem 8-bit Timer von einem Attiny85 ein Signal erzeugen.
    Es soll ein PWM Signal sein mit 1 kHz.

    Signale kann ich bereits erzeugen nur leider nicht die richtigen
    Jetzt meine Frage an euch:

    Für ein 1 kHz Signal sollte man doch den Fast PWM Modus wählen richtig ?
    Reicht es wenn ich die Takt Frequenz vom Attiny im Code setze oder muss ich noch etwas in den Fuses verändern ?

    Kann mir vielleicht auch jemand genau erklären wie ich am einfachsten auf die richtige Wunsch Frequenz komme ?
    Damit meine ich, gibt es keine einfache Rechnung um das ganze leicht zu errechnen?

    Es gibt so viele Formeln, nur so ganz leicht zu verstehen finde ich sind die nicht

    Ich würde mich sehr freuen wenn Ihr mir weiter Helfen könntet.

    Vielen Dank im Voraus.

    Nicole

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    32
    Beiträge
    2.029
    ein Timer braucht einen Takt, der Takt durchläuft einen sog. Prescaler, der den Takt herunterteilt (siehe Datenblatt für die Divisoren des verwendeten Timer).

    Wenn du also einen 1MHz Takt hast und einen Prescaler von 1, zählt dein Timer 1 Schritt pro Takt also 1 mio Schritte pro Sekunde.

    Ein 8bit Timer kann 2^8 = 256 Schritte machen und läuft dann über. Im Fast PWM bedeutet das wenn du Set on Overflow und Clear on Compare benutzt dass dein Ausgang alle 256 Schritte auf An gesetzt wird und je nachdem wie du dein Compare Register programmierst länger oder kürzer an bleibt bis Count == Compare ist.

    Du kannst auch Toggle on Overflow/Compare benutzen, dann schaltet dein Ausgang immer um wenn er einmal durchgelaufen ist.

    Angenommen wir machen Clear on Compare mit Prescale 1: 1.000.000 Takte/Sekunde / 256 Takte/Überlauf = 3906,25 Überläufe pro Sekunde

    also 3.9kHz ca.

    das ist ziemlich krumm ... nehmen wir mal statt Fast PWM & Overflow on Top die Konfiguration PWM & Overflow on Input Compare!
    Damit kannst du über das Input Capture Register einstellen WANN er überlaufen soll ... manchmal benutzt er dafür auch einen der Output Compare Register für den Timer, das kommt auf den Chip und den Timer an, siehe Datenblatt.

    Setzen wir den Overflow also auf 250 (denk dran, dass der Timer immer genau EINEN Prozessortakt braucht wenn er den Zielwert erreicht hat um das REgister auf 0 zu setzen BEVOR er weiter zählt)

    Input Capture = 248 (von 0 bis 248 sind es 249 Takte + den Reset Takt = 250)

    1.000.000 / 250 = 4000

    das sind schonmal solide 4kHz

    Also nehmen wir einen Prescaler von 4 (sofern verfügbar) 1.000.000 / 4 => 250.000 / 250 = 1000

    Wunderbar ... FAST ... der Prescaler ist 4 damit sind es 4 Takte pro Zählschritt, das Nullsetzen braucht aber nur EINEN Takt, also sind es nicht mehr 250 Schritte sondern 249.25 ... aber der Oszillator hat in der Regel auch einen gewissen Fehler, also kannst du mit Hilfe des Input Capture und einem Oszilloskop ein wenig nachtrimmen wenn du es exakt brauchst.
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    08.02.2017
    Beiträge
    14
    Guten Morgen Ceos,

    vielen vielen Dank für deine Mühe.

    Habe das ganze jetzt schon ein wenig mehr verstanden.

    Ich zeige Euch mal meinen Code mit dem ich eigentlich ein 1 kHz Signal erzeugen wollte.

    Code:
    #include <avr/io.h>
    #define F_CPU 1000000
    
    
    int main(void)
    {
        DDRB |= (1<<PB1);
    	OCR0A = 999;
    	OCR0B = 370;
    	
    	TCCR0A = (1<< COM1A1) + (1<< WGM01) + (1<< WGM00);
    	TCCR0B = (1<<WGM01) + (1<< WGM02) + (1<< CS13); 
    	
        while (1) 
        {
    		asm ("NOP");
        }
    }

    Laut Datenblatt stehen mir diese Prescaler Optionen zur Verfügung 2,4,8,16,32,64,128,256.
    Habe ich das richtig erlesen ?

    Ich teste jetzt deine Tips und melde mich später wieder.

    Viele Grüße und vielen Dank.

    Nicole

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    1.854
    Brauchst Du tatsächlich eine PWM, oder würde auch ein symetrisches 1kHz Signal reichen?
    Dazu könnte man einen normalen PWM Modus nehmen und den Timer mit der CTC Option zurücksetzen.
    Das bedeutet der Timer läuft bis zum Wert des Comparematch Registers und wird dann auf 0 gesetzt.
    Dadurch wird dann der Ausgang OCxx getoggelt.
    Damit ist dann die Frequenz des des symetrischen Ausgangssignals in Grenzen einstellbar.

    Fast PWM nehm ich persönlich nicht so gerne, weil immer ein kleiner Spike übrig bleibt auch wenn das Comparematch Register auf 0 steht -
    Beziehungsweise bei inverse PWM immer eine kleine Lücke im Ausgangssignal bleibt.

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    32
    Beiträge
    2.029
    da sehe ich schon mal die ersten Fehler, wahrscheinlich nicht kritisch, aber das ist Prozessorspezifisch nicht ungefährlich

    du verwendest die Timer1 Flags in den Timer0 Registern COM1A1 ist für Timer1 du brauchst COM0A1 für TCCR0

    Die Config sagt mir Fast PWM mit OCRA als TOP und OCRB als COMPARE ... aber du hast OCR1A als Ausgang konfiguriert, was nicht geht weil du Timer 0 verwendest und obendrein das OCRA Register durch die TOP Funktion blockierst! Du musst COM0B1 setzen und OC0B auf PB1 benutzen(Glücklicherweise zufällig derselbe Pin).

    Im TCCR0B Register gibt es das WGM01 Flag garnicht, das gehört da nicht hin und CS13 gehört ebenfalls nicht zum Timer0 sondern Timer1 bzw. e gibt garkein CSx3 Flag, keine ahnung wieso der das überhaupt akzeptiert.

    also:

    Code:
    TCCR0A = (1<<COM0B1) + (1<<WGM01) + (1<<WGM00)
    TCCR0B = (1<<WGM02)  // + gültige CS Bits
    WTF ... dein Compiler sollte dich eigentlich mit Warnings erschlagen

    Du verwendest einen 8Bit Counter der bis 256 Zählen kann und fütterst ihn mit Werten wie 999 und 370? Das KANN nicht gehen

    EDIT: Der Vollständigkeit ein theoretisch funktionierender Code
    Code:
    DDRB |= (1<<PB1);
    OCR0A = 124; //siehe Rechenbeispiel in vorhergehendem Post und es gibt nur einen /8 Prescaler leider
    OCR0B = 63; //ca. 50% Duty Cycle
    TCCR0A = (1<<COM0B1) + (1<<WGM01) + (1<<WGM00);
    TCCR0B = (1<<WGM02)  + (1<<CS01); //WGM 111 (fast pwm), clear on match, set on bottom, PS /8
    PPS: Sowas gibts bei mir nur ganz selten dazu, aber ich hab eh schon fast alles haarklein erklärt

    PPPS: Fehler beim OCR0A REgister korrigiert ... hab die 0 nicht mitgezählt
    Geändert von Ceos (09.02.2017 um 10:20 Uhr)
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    08.02.2017
    Beiträge
    14
    Hallo wkrug,

    danke für deine Antwort.

    Es gibt ja mehrer PWM Moduse.
    Ich dacht mal gelesen zu haben das wenn man eine hohe Frequenz erzeugen möchte es nötig sei den Fast PWM Modus zu nutzen.

    Ist das falsch gedacht ?
    Gerne versuche ich auch deine Version.

    Nur glaube ich wäre es für mich auch sehr gut, wenn ich endlich verstehen würde wie man auf die gewünschte Frequenz kommt

    Vielen Dank

    Nicole

  7. #7
    RN-Premium User Roboter Genie Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.363
    Blog-Einträge
    97
    Zitat Zitat von Nicole01 Beitrag anzeigen
    Nur glaube ich wäre es für mich auch sehr gut, wenn ich endlich verstehen würde wie man auf die gewünschte Frequenz kommt
    Hallo,

    ich versuche mich mal an einer Erklärung - für die Fast-PWM.

    Der Timer Counter (TCNT) eines 8-Bit Timers durchläuft im Normalmodus den Wertebereich eines 8-Bit Binärzahl, also von 0 bis 255.

    Wie schnell er das macht, hängt von dem Systemtakt und dem Vorteiler ab (mal abgesehen von der Taktung des Timers durch einem externen Takt).

    Jeder Taktimpuls, der den Timer erreicht, erhöht den TCNT um eins. Es braucht also 256 Timertakte um einen kompletten Timerzyklus im Normalmodus und auch im Fast-PWM Modus zu durchlaufen.
    TCNT = 0 nach TCNT = 1 -> 1 Takt, 1 Takt total
    TCNT = 1 nach TCNT = 2 -> 1 Takt, 2 Takte total
    .
    .
    TCNT = 254 nach TCNT = 255 -> 1 Takt, 255 Takte total
    TCNT = 255 nach TCNT = 0 -> 1 Takt, 256 Takte total -> TCNT Turn von 0 nach 0 nenne ich mal einen "Timerzyklus"

    Bei einem Systemtakt von 1MHz und einem Vorteiler (Prescaler) von 1 wird der TCNT mit einer Frequenz von 1Mhz um 1 erhöht. Für einen Timerzyklus braucht er 256 Takte, die Timerzyklenfrequenz ist also 1000000Hz/256 = 3906,25Hz. Ist höher als Deine geforderten 1kHz. Kann man auch nicht so ohne Weiteres per CTC (Clear Timer on Compare) tiefer machen.

    Also erstmal mit Prescaler den Timertakt heruntersetzten. Nach Datenblatt vom ATtiny85 ist der nächste Prescalerwert des Timers 0 nach 1 die 8. Damit erreicht man eine Timerzyklusfrequenz von (1000000Hz/8 )/256=488,28125Hz. Zu langsam! Bekommt man aber schneller, wenn man den CTC Modus einschaltet und in ein Compareregister den entsprechenden Wert hineinschreibt. TCNT läuft dann nur noch bis zu dem Comparewert bevor auf 0 gesetzt wird. Die Timerzykluszeit wird also schneller.

    Der Timertakt mit dem Prescaler 8 ist 1MHz/8=125000Hz und eine Periode dauert dann 1/125000Hz=8µs. Alle 8µs wird also der TCNT um eins erhöht. Um auf eine Timerzyklusfrequenz von 1kHz zu kommen, muß die Timerzykluszeit 1/1kHz=1000µs sein. Dazu braucht der TCNT 1000µs/8µs=125 Zählschritte.

    Also CTC Modus zum Fast-PWM einschalten und 124 ins Compareregister eintragen (Der 125ste Schritt kommt durch den Schritt von 124 nach 0 zustande). Das andere Compareregister dient dann zur Einstellung der Pulsweite.

    Gruß
    Searcher
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  8. #8
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    32
    Beiträge
    2.029
    Der 125ste Schritt kommt durch den Schritt von 124 nach 0 zustande
    whoops Panne XD hab ich in meiner Antwort oben total vergessen
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    08.02.2017
    Beiträge
    14
    Danke für die anderen Antworten und eure Hilfe.

    Bitte nicht gleich sauer sein aber so ganz verstehe ich das immer noch nicht

    Ich hätte dazu bitte noch ein paar Fragen.

    Wie oben schon gefragt, reicht es wenn ich die Takt Frequenz vom Attiny im Code eintrage oder muss ich auch noch etwas in den Fuses verändern?
    Als nächstes würde mich Interresieren wo Ihr genau die ganzen Daten aus dem Datenblatt herbekommt ?

    Damit meine ich sind das immer die gleichen Stellen die Wichtig sind ?
    Z.b. Seite 10, 33, 52, 63 usw ( ist nur ein Beispiel )

    Die CS Bits bestimmen die Quelle für den Timer/Counter richtig ?
    Ist das auch gleichzeitig der Prescaler ?


    Auch verstehe ich die Berechnung der Frequenz noch nicht ganz.

    Wie genau hast Du das berechnet ?
    Timerzyklusfrequenz von (1000000Hz/8 )/256=488,28125Hz

    Ich verstehe es nur soweit, der Systemtakt beträgt 1Mhz ( 1000000 ) jetzt rechnet Ihr 1000000:256=3.906,25
    Gut nur wie kommt Ihr auf dieses Ergebniss ?
    (1000000Hz/8 )/256=488,28125Hz ???

    Wie lautet hier der genaue Rechnungsweg ?

    Entschuldigung für meine vielen Fragen

  10. #10
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    32
    Beiträge
    2.029
    in deinem konkreten Fall (angenommen wir haben dasselbe Datenblatt und nicht nur die "Summary" ... Dokumentnummer ist atmel-2586)

    Kapitel 11.9 Register Description

    11.9.2 TCCR0A – Timer/Counter Control Register A und folgend

    Da sind die Bits beschrieben die die Ausgänge und den Countermodus steuern.

    11.9.3 TCCR0B – Timer/Counter Control Register B und folgend

    gehört immer zu dem anderen Register dazu, im konkreten Fall ist das WGM02 Bit Teil vom B-Register

    Hier steht unter anderem auch welche Prescaler es gibt und wie sie ausgewählt werden.
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

+ Antworten
Seite 1 von 4 123 ... LetzteLetzte

Ähnliche Themen

  1. Ein paar Fragen ;)
    Von Checker 1.0 im Forum Robby RP6
    Antworten: 11
    Letzter Beitrag: 18.08.2011, 22:37
  2. Ein paar fragen ...
    Von Gamestake im Forum Suche bestimmtes Bauteil bzw. Empfehlung
    Antworten: 3
    Letzter Beitrag: 21.04.2011, 10:12
  3. Ein paar Fragen
    Von Speed im Forum AVR Hardwarethemen
    Antworten: 10
    Letzter Beitrag: 03.11.2008, 08:19
  4. Ein paar Fragen zu µC
    Von Lars. im Forum Microcontroller allgemeine Fragen/Andere Microcontroller
    Antworten: 5
    Letzter Beitrag: 09.06.2006, 15:38
  5. Paar Fragen -g-
    Von Adacart im Forum Elektronik
    Antworten: 4
    Letzter Beitrag: 06.01.2005, 18:57

Berechtigungen

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