-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 13

Thema: atmega als variabler rechteckgenerator ?

  1. #1
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    08.11.2006
    Ort
    olargues
    Beiträge
    776

    atmega als variabler rechteckgenerator ?

    Anzeige

    hallo ihr,
    da ich die letzten wochen weniger mit atmel und Bascom gearbeitet habe und vielmehr mit analoger elektronik habe ich gerade eine art kreative blockade, was den atmel angeht.

    ich benötige einen rechteckgenerator mit variabler frequenz (im bereich 400khz bis 600khz).
    es würde reichen, wenn ich die frequenz in 10khz (oder evt 5khz) schritten variieren könnte.
    das tastverhältnis sollte so bei 50% liegen.

    spontan denke ich da natürlich an hardware-pwm und / oder timer/counter.

    zur verfügung habe ich mega8 und mega 88.

    hat einer von euch da vielleicht mal den entscheidenden hinweis, mich auf die richtige fährte zu bringen.

    gruss klaus

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Andree-HB
    Registriert seit
    10.12.2004
    Ort
    Bremen
    Alter
    47
    Beiträge
    2.556
    ...vielleicht einfach so :


    dim a as word 'je kleiner, je höher die Ausgabefrequenz

    do
    waitus a
    toggle Portx.x
    loop
    end
    Danke an Alle, die uns bei der erfolgreichen 1.000€-Aktion der IngDiba unterstützt haben! | https://www.hackerspace-bremen.de | http://www.pixelklecks.de |

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    08.11.2006
    Ort
    olargues
    Beiträge
    776
    klar...
    das geht als "quick and dirty" lösung.
    aber wie geht es elegant ?

    mit dieser schleife kann man ja mit dem prozessor sonst nix mehr machen, ohne den rechteck zu gefährden.

    gruss klaus

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    26.05.2007
    Beiträge
    594
    Hmm vielleicht ne Hardware-PWM mit 50/50 duty-cycle?
    Oder eigene Routine mit ISR...

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    14.11.2003
    Beiträge
    813
    Timer-Interrupt ?

  6. #6
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.554
    Genau, Timer-Interrupt.

    a) (Irgendeinen) Timer auf Interrupt im CTC-modus initialisieren. So nach dem Muster (hier für den mega168, in C, weil ich kein Basic mache):

    Code:
        TCCR0A |= (1<<WGM01);		// Timer im CTC-Mode, Top=OCRA  (doc S104)
        TCCR0B |= (1<<CS01);		// Prescaler 1/8 / Clock <- CPU	(doc S106)
        OCR0A = 125;                        // Preset 125 für 50µs bei 20Mhz  
        TIMSK0 |= (1<<OCIE0A);		// Tmr/Cntr0 CompareA interrupt enabled
    und dann - z.B. auf Tastendruck, den Vorteiler auf einen entsprechenden Wert setzten und den Preset OCRnx:
    Code:
        OCR0A = 125;                        // Preset 125 für 50µs bei 20Mhz  
        TIMSK0 |= (1<<OCIE0A);		// Tmr/Cntr0 CompareA interrupt enabled
    Dann kommt am entsprechenden Pin Deine gewünschte Frequenz (wenns richtig initialisiert ist). Und Du kannst das mit OCIEnx auch bei Bedarf aus- und wieder einschalten.

    Viel Erfolg,
    Ciao sagt der JoeamBerg

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    11.04.2005
    Beiträge
    1.469
    dim a as word 'je kleiner, je höher die Ausgabefrequenz

    do
    waitus a
    toggle Portx.x
    loop
    end
    Geht nicht, da waitus keine Variablen zulässt, im Gegensatz zu waitms.

    Gruß
    Christopher

  8. #8
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    08.11.2006
    Ort
    olargues
    Beiträge
    776
    danke für die antworten. irgenwie klappt das nicht immer mit der emailbenachrichtigung, wenn man antworten bekommen hat. insofern lese ich das erst jetzt.

    muss ich jetzt erstmal drüber nachdenken, was oberallgeier da schrieb.

    also dann bis später wieder.

    gruss klaus

  9. #9
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    08.11.2006
    Ort
    olargues
    Beiträge
    776
    sooooo. nun habe ich mir das mit dem ctc mal angesehen und möchte mal nachhören,
    ob ich das so richtig sehe.

    sagen wir mal ich hätte nen takt von 8mhz.

    sagen wir mal der prescaler wäre auf 1.

    laut der formel im datenblatt kann ich je nach inhalt des OCRnx registers
    minimal durch 2 teilen und von hier an in 2er schritten steigend (also 2..4..6..8 usw.)

    bei einer teilung von 20 (also OCRnx=9) hätte ich 400khz.
    bei ocrnx=8 hätte ich dann eine teilung von 18 ..das entspricht 444khz.

    also 1 schritt = 44khz

    um also die gewünschte auflösung von etwa 10khz zu erreichen müsste ich den mega dann wohl mit 35,2mhz takten, was nicht geht.

    wenn ich hier also jetzt keinen denkfehler drinne habe, ist die idee von oberallgeier für meine zwecke nicht geeignet.

    trotzdem danke ich für den denkanstoss. da konnte ich mich mal wieder mit einem unbeachteten kapitel des datenblattes beschäftigen.

    gruss klaus

  10. #10
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.554
    Hallo Klaus,

    Zitat Zitat von kolisson
    ... habe ... das mit dem ctc mal angesehen ...
    Das gibt schon mal einen Pluspunkt (psssst - nicht weitersagen: ich habe immer wieder Dinge abgeschrieben und ans Laufen bekommen ohne sie zu verstehen - aber meistens hinterher versucht, das Getane zu verstehen).

    Zitat Zitat von kolisson
    ... nachhören, ob ich das so richtig sehe ...
    Vermutlich ist es doch etwas anders - und auch anders beschrieben.

    Wir schauen und das mal an. Nehmen wir also mal das doc2545 für den mega48/88/168, bei mir steht drauf Rev. 2545M–AVR–09/07 - also aktuell seit letztem September. Gehe nach S 96, Punkt 14.7.2 Clear Timer on Compare Match (CTC) Mode.

    In Clear Timer on Compare or CTC mode (WGM02:0 = 2), the OCR0A Register is used to manipulate the counter resolution.
    Und GENAU das ist der Trick bei der Geschichte: Manipulation der Zählerauflösung - der zweite Trick ist der Prescaler. Mal der Reihe nach - so Schritt für Schritt.
    i) Mit dem Prescaler teilst Du die Controller Frequenz auf eine Frequenz, die Dir angenehm ist - kommt noch.
    ii) Mit dem Preset (so nenne ich den Inhalt im OCRnx) - nehmen wir mal an, im OCR0A, also das OCRnx für den Timer/Counter0 - setzen wir nun einen Wert in das Register, bis zu dem NACH dem Prescale der Counter hochzählt - um danach wieder auf Null zu kommen. Das siehst Du ganz genau in diesem Bild. Da sind die Counterstände bei unterschiedlichen OCR0A-Werten gezeigt. Und wenn der Wert erreicht wird, gehts runter auf Null (mit Interruptmöglichkeit und allem). Und jetzt ist es doch klar: großer Presetwert - lange hochzählen, kleiner Presetwert - kurz hochzählen. Oder: kein Prescale - dann wird schnell hochgetackert - mit Prescale entsprechend langsamer.

    . . . . . . . .

    Was hat das für Konsequenzen?

    . . . . . . . .

    Bei Deinem mega88 mit 8 MHz OHNE Prescaler wird der Counter mit 8 MHz hochgezählt. Wenn Du da 10 kHz erreichen willst, dann musst Du 10 000 mal bis 800 zählen - das geht aber nun nicht in den Timer0 hinein , denn das ist, siehe Seite 138, ein “8-bit Timer/Counter0 with PWM”. Bähhhh. Also teilen wir den Prozessortakt mit dem Prescaler 1/8 - und erhalten einen Takt von 1 MHz, mit dem der Counter hochgetackert wird. Für 10 kHz müssen wir wieder 10 000 mal, diesmal aber nur bis 100 zählen - das ist ein Wert der unter 255 liegt - also mit 8 bit definierbar. Und Du siehst auch gleich, was der Zweck des Presets im OCR ist! Steht auch hier, auf S 96: "The OCR0A defines the top value for the counter, hence also its resolution." Wenn Dieser Presetwert erreicht wird, gibt der Counter auf - wird auf Null gesetzt, setzt ein Interruptflag und kann auch den Pin OC0A toggeln (steht auch auf S 96), also Pin 12 bzw. PD6. Wir sind also im CTC-Output Mode A.

    Das Excel-blatt für DEINEN Fall mit den 10 kHz habe ich Dir oben dazugegeben. Du kannst nun - wenn Du willst - diesen CTC-Modus (genauer gesagt: den Interrupt) ein- und ausschalten. Dazu wird im Timer/Counter0 Interrupt Mask Register = TIMSK0 das Bit OCIE0A - OC Interrupt Enable 0A - gesetzt oder gelöscht. Und wie oben beschrieben - mit dem Preset kannst Du die Frequenz verstellen. Für das Erreichen einer bestimmten Frequenz kann es erforderlich sein Prescale UND Preset zu ändern. Und manche Frequenzen bekommt man halt nicht genau hin.

    Ist das so besser erklärt ? Versuch es mal - bau Dir eine ISR in der Du Deine 10 kHz von 10000 runterzählst und beim Nulldurchgang eine LED toggelst. Dann wird die eine Aktiv-Pausen-Zeit von 1s/1s haben.

    Zitat Zitat von kolisson
    wenn ich hier also jetzt keinen denkfehler drinne habe, ist die idee von oberallgeier für meine zwecke nicht geeignet.
    Vielleicht ist sie doch geeignet - die Idee?
    Ciao sagt der JoeamBerg

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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