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


von raoul (Gast)


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

von dave (Gast)


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

von raoul (Gast)


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

von raoul (Gast)


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

von avusgalaxy (Gast)


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

von Danny (Gast)


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

von avusgalaxy (Gast)


Lesenswert?

@raoul

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

Gruß Avus

von Danny (Gast)


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.

von Danny (Gast)


Lesenswert?

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

von Stefan (Gast)


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

von raoul (Gast)


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

von avusgalaxy (Gast)


Angehängte Dateien:

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

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.