Forum: Mikrocontroller und Digitale Elektronik Fixfrequenz + variable PWM


von Günter König (Gast)


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

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Warum nicht mit den normalen Timer-PWM-Funktionen?

von Günter König (Gast)


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

von Matthias (Gast)


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

von Günter König (Gast)


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

von Matthias (Gast)


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

von Günter König (Gast)


Lesenswert?

Danke Matthias,
denn will das man mal probieren.

Glückauf,
Günter

von Günter König (Gast)


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

von Matthias (Gast)


Lesenswert?

Hi

Teiler durch 64 und Auflösung reduzieren

4000000/64=62500Hz

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

Matthias

von Günter König (Gast)


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

von Günter König (Gast)


Lesenswert?

Hi Matthias,

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

Gruß,
Günter

von netman (Gast)


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

von Günter König (Gast)


Angehängte Dateien:

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

von Andreas S. (andreas) (Admin) Benutzerseite


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).

von Günter König (Gast)


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

von Andreas S. (andreas) (Admin) Benutzerseite


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?

von Günter König (Gast)


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?

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

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

von Günter König (Gast)


Lesenswert?

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

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.