www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PWM des AVR - so nicht?


Autor: raoul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,
habe mit folgendem code erfolglos versucht, die PWM zu initialisieren:
_________

.include "m32def.inc"
.def temp=r16

        ldi temp, LOW(RAMEND)
        out SPL, temp
        ldi r25, HIGH(RAMEND)
        out SPH, temp

  ldi temp, 0xff
  out DDRD, temp

  ldi temp, 0b01100011
  out TCCR1A, temp
  ldi temp, 0b00000100
  out TCCR1B, temp

  ldi temp, 0x00
  out OCR1AH, temp
  out OCR1AL, temp

loop:
rjmp loop
_________

wie man sieht benütze ich den mega32. kann mir jemand sagen warum das
so nicht funktioniert? habe den code so aus dem datenblatt
erschlossen.

mfg

Autor: dave (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich will mir jetzt nicht nochmal das Datenblatt reinziehen.

1tens: Wie hast du das getesteet? Als ichs mal probiert habe, da hatte
der AVR-Simulator nen Bug (im AVR Studio)
2tens:
        ldi temp, LOW(RAMEND)
        out SPL, temp
        ldi r25, HIGH(RAMEND)
        out SPH, temp
 ==> 3te Zeile muss "ldi temp, .." heißen.
3tens: Warum lädst du 0x0000 in OCR1A ? Das kann ja fast nichts
werden.

dave

Autor: raoul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke für deine antwort dave:

1stens: also ich bekomme da "Assembly complete, 0 errors. 0
warnings"

2tens: stimmt :) mist g. hab den fehler verbessert, aber ich brauch
hier eh keinen stack. also es funktioniert immer noch nicht

3tens: jo habs mit 0xff und mal mit 0x00 probiert. hab ausversehn hier
die 0xff version reingesetzt.

noch wer ne idee?

mfg

Autor: raoul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kann bitte jemand nochmal diesen code auf fehler prüfen?

oder anders gesagt :) : wie habt ihr die register fürs pwm beladen?
kann ja auch ein c code sein ;)

mfg

Autor: avusgalaxy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Fang doch erstmal einfach an. Nimm mal den Timer 0 für deine PWM. Hier
ein Beispiel



.include "m32def.inc"
.def temp    = r16

.equ pwmwert = 150;Hier der PWM Wert eintragen(0-255)

  ldi temp,   low(ramend)
  out spl,   temp
  ldi temp,   high(ramend)
  out sph,   temp

  ldi temp,   0xff
  out DDRB,   temp;bei Port B ist OCR0



  ldi temp,  pwmwert
  out OCR0,  temp;den PWM Wert ins OCR0 register übertrage

  ldi temp,   0b01101001;Fast PWM, Set OC0 on compare match, no
prescaling
  out TCCR0,   temp




main:
  rjmp main

Gruß Avus

Autor: Danny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In C und am Mega32 mit 2 PWM die in serie funktionieren:

// TIMER/COUNTER
TCCR1A  = (1 << COM1B0)|(1 << COM1B1)|(1 << COM1A1)
      |(1 << WGM12)|(1 << WGM11);    // PWM konfiguration (9-Bit) 
[S.05]
TCCR1B  = (1 << WGM12);          // Prescaler 1 (kein Prescaler) 
[S.108]
.
.
.
while ((CHARGE_STATUS==FAST) && (!(CHARGE_STATUS==ERROR))
{do                    // I = I_fast mit "Softstart"
  {                  // Schleife bis Strom = eingestelltem Strom (Soll = 
Ist)
  temp = MESSUNG(Strom_L);            // Messung anstoßen
  if ((temp < (I_FAST_NICD)) && (OCR1A < 0x1FF))        //Dowm
  {
    OCR1A++;
  }
  if ((temp < (I_FAST_NICD)) && (OCR1B < 0x140) && (OCR1A==0x1ff))  //UP
  {
    OCR1B++;              // Vergleichsregister inkrementieren
  }
  if ((temp > (I_FAST_NICD)) && (OCR1B > 0x0000))
  {
    OCR1B--;
  }
  if ((temp > (I_FAST_NICD)) && (OCR1B == 0x0000) && (OCR1A > 0x0000))
  {
    OCR1A--;              // Vergleichsregister dekrementieren
  }
} while
((temp<(I_FAST_NICD-2))||(temp>(I_FAST_NICD+2)));  //Regelhysterese von
+/- 2 zulassen

Autor: avusgalaxy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@raoul

Was wolltest du überhaupt machen? Zwei PWM's mit 8 bit oder eine PWM
mit 9 oder 10 bit?

Gruß Avus

Autor: Danny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist für einen kombibnierten Step-Up/Step-Down Wandler. Wenn der Strom
schon mit dem 1.PWM erreicht wird (Step-Dowm) dann OK. Wenn nicht,dann
2. PWM (Step-Up). Eingangsspannung 10-13V (7V funktionieren auch noch,
wenn mann den Strom liefern kann), Ausgangsspannung bis 0-50V/6A,
jedenfalls bei meiner Schaltung. Funktioniert einwandfrei.

Autor: Danny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nachtrag: beide haben 9-Bit PWM. Kompromiss aus Auflösung und
Schaltfrequenz.

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
lade doch einfach mal das OCR1A register mit einem Wert größer als 0
und kleiner als 255. Bei 0 hast du dauernd low pegel, bei 255 dauernd
high pegel.

mfg
Stefan

Autor: raoul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke für all eure antworten! ich will zwei 8 bit pwm's machen um damit
2 motoren (mit einem l293d treiber) anzusteuern und die geschwindigkeit
zu regeln.

mfg

Autor: avusgalaxy (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi raoul.

Probiere es mal si wie im Anhang.

Wenn du 2 PWM's haben willst, dann darfst du nicht



  ldi temp, 0x00
  out OCR1AH, temp
  out OCR1AL, temp

machen, weil OCR1AH wäre dann für ddi 9 oder 10 bit PWM.

Deshalb

ldi temp, 0x03
out ocr1al,temp; erste PWM
out ocr1bl,temp; zweite PWM


Gruß Avus

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.