mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Fixfrequenz + variable PWM


Autor: Günter König (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tag Forum,

hat jemand eine Idee, wie mit einem 8515
a. eine feste Frequenz aber mit
b. einem variablen Puls-Pausenverhältnis erzeugen kann?

Das Puls Pausenverhältnis soll von aussen über ein 4bit Wort einstellbar 
sein.

Dank schon mal,

Günter König

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum nicht mit den normalen Timer-PWM-Funktionen?

Autor: Günter König (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Andreas,

ich glaube, es ist gelungen. Hatte da noch mal eine Idee und die scheint 
zu funktionieren.Ich kann jetz unterschiedliche Werte für das Puls - 
Pausenverhältnis einstellen.
Aber wie meintest du das mit den Timern?

Gruß,
Günter

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

der AT90S8515 kann mit dem Timer 1 ein PWM-Signal mit bis zu 10-Bit per 
Hardware erzeugen. D.h. du beschreibst ein paar Register und der Rest 
macht der Chip für dich.

Matthias

Autor: Günter König (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin Matthias,

wie meinst du denn das "beschreib ein paar Register..." ? Leider habe 
mich mich mit den Timerfunktionen noch nie auseinandergesetzt. Gibts ein 
paar Beispiele?

Gruß,
Günter

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

TCCR1A = 0xF3;
OCR1A = 256;
OCR1B = 768;
TCCR1B = 0x01;

Dann solltest du an Pin 15 und an Pin 29 eine PWM mit 25% bzw. 75% 
Puls/Pausen-Verhältnis haben.

Matthias

Autor: Günter König (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Matthias,
denn will das man mal probieren.

Glückauf,
Günter

Autor: Günter König (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Matthias,

habe es mal ausprobiert und klappt gut. Feste Frequenz und Duty Cycle 
variabel. Soweit alles klar, aber leider liege ich mit der Frequenz im 
günstigsten Fall bei 244 Hz (4MHz Takt). Ich benötige aber einen Wert 
zwischen 70 und 100 Hz. Mit der Einstellung über TCCR1B klappt das 
nicht. Ich habe das Teilerverhältniss jetzt auf $02 stehen (/8), die 
nächste Stufe wäre /64.
Gibt es da noch einen Trick?

Auf jeden Fall danke erstmal, du hast mir auf jeden Fall mächtig 
gewaltig geholfen,

Gruß,
Günter

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Teiler durch 64 und Auflösung reduzieren

4000000/64=62500Hz

62500/510=122Hz (TCCR1A = 0xF1)
62500/1022=61Hz (TCCR1A = 0xF2)

Matthias

Autor: Günter König (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alles klar Matthias,

das hatte ich mittlerweile schon soweit rausgefunden. Nun aber sei mir 
doch noch eine Frage gestattet:
Welche Gesetzmäßigkeit steckt dahinter? Wie sind die Abhängigkeiten der 
Registerinhalte OCR1A und OCR1B auf das Puls-Pausenverhältnis? Ich habe 
da schon einige Zeit probiert, finde aber den Faden nicht......


Ich hatte mal eben einen Motor angeschlossen (über FET-Schalter), brummt 
zwar etwas bei 61Hz, zieht aber ganz gut durch. 122Hz sind etwas zu 
hoch.

So denn,
Günter

Autor: Günter König (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Matthias,

wie ist es nun mit den Zusammenhängen? Ganz so einfach ist das wohl doch 
nicht.

Gruß,
Günter

Autor: netman (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ließ dir mal das Datasheet durch. Da steht alles gut beschrieben.
Die genaue Funktion ist von den PWM-Bits abhängig.
Normale PWM zählt z.B. hoch, bis der OCR Wert erreicht ist. Dann 
schaltet er den OCR-Pin um, zählt weiter bis TOP(0xFFFF). Dann zählt er 
wieder runter schaltet beim erreichen von OCR den Pin wieder um, zähl 
bis er bei 0 ist. -> Beginnt von vorne.

Netman

Autor: Günter König (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi Netmann,

ich habe da mal was über PWM gefunden und das .asm Listing etwas 
angepasst.
Das funktioniert auch recht anständig soweit, das ich beliebige 
Frequenzen ("Bereiche") mit beliebigem Tastverhältnissen erzeugen kann.
Das ist eigentlich genau das was ich auch wollte. Ich habe das Listing 
mal angehängt weil leider eines nicht funktioniert, nämlich:

ändere ich über die .set Direktrive die Impuls/Pausen Zeiten in der 
Main-Schleife ein weiteres mal, sind diese Werte sofort gültig.
Beispiel: zu Beginn der Main-Schleife steht

.set impuls = 200
.set Pause  = 6466

und nach einer Warteschleife (z.B. 500mS) folgt

.set impuls = 3333
.set pause  = 3333

dann ist diese letzte Einstellung sofort gültig. Es liegt sofort eine 
Frequenz von 76 Hz mit einem Tastverhältniss von 50% an PD5 an.
Eigentlich sollte es so sein, das zuerst eine Frequenz von 76 Hz mit 
Tastverhältnis von 3% anliegen soll.

(Zu einem späteren Zeitpunkt wird anstelle der Warteschleife eine 
Abfrage eines Eingangsports stehen von dem die Werte Impuls/Pause 
abhängen).

Kann mir da jemand nochmal helfen?


Dank und Gruß,

Günter

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
.set ist eine Assemblerdirektive, d.h. der Assembler setzt überall wo er 
im Assemblercode das Wort "impuls" findet die Konstante (!) 3333 ein. 
Logisch dass man diese zur Laufzeit nicht ändern kann. Um eine variable 
PWM zu realisieren musst du diese Konstanten durch Register(paare) 
ersetzen und die Befehle ändern welche diese Konstanten verwenden (ldi 
-> mov, subi -> add, sbci -> adc).

Autor: Günter König (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Andreas,

wenn ich das richtig verstanden habe, handelt es sich bei
.equ und .set um Direktriven wobei die Anweisung .equ sich so verhält 
wie du beschriebst. Ich meine bei .set kann ich die Werte während des 
Laufs ändern.

oder unterliege ich einem grandiosem Irrtum???


Günter

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht helfen die beiden folgenden Beispiele:

1)

  .set bla = 1
    ldi r16, bla

  .set bla = 99
    ldi r16, bla

Hier wird einmal 1 und einmal 99 in das Register geladen.

2)

  .set bla = 1 ; für alle bla bis zum nächsten set wird 1
               ; eingesetzt

  unterprogramm:
    ldi r16, bla ; hier steht also eine 1, egal was später passiert
    ret

  main:
    rcall unterprogramm
  .set bla = 99 ; dieses .set interessiert keinen, da ab hier
                ; kein "bla" mehr vorkommt!
    rcall unterprogramm

Hier wird zwei mal 1 in das Register geladen.

Klar?

Autor: Günter König (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Andreas,
aber bedeutet das nicht, das wenn ich folgendes schreibe:

main:

  .set bla = 1
   rcall UP1
   ldi r16, bla
   ret

delay, irgendwas

   .set bla = 99
    rcall UP1
    ldi r16, bla
    ret

delay, wieder irgendwas

rjmp main

das wechselweise in R16 1 und 99 geschrieben wird?

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, aber das Unterprogramm UP1 merkt keinen Unterschied ob bla beim 
Aufruf als 1 oder als 99 definiert ist.

Autor: Günter König (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mmmmmmh,
seltsam, eine Ausgabe auf einem Port würde also immer das gleiche 
Bitmuster (00000001) ergeben?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.