AVR PWM Pulsbreite ändern

Gast #3545350
Lesenswert?

Hallo zusammen,

ich bin grad an PWM dran, und möchte mit meinem ATmega88 ein Signal 
erzeugen (1kHz, verwendung von 16Bit Timer, ICR1 = 1024 da ich die 
Pulslänge über den 10Bit Wert einer ADWandlung ändern will).

Nur leider steh ich grad total auf der Leitung und deshalb meine Fragen:

1.Wie muss ich den Prescaler des Timers einstellen?

2.Wie mache ich es, dass ich die Pulsdauer ändere?
  (nicht invertierter Modus, Fast PWM 10Bit)
   Wäre dieser ansatz richtig, wenn ich den ADCWert in OCR1 übergebe.
   Natürlich erst wenn der Timer wieder auf 0 gesetzt wird.

Ich habe eine 16 Bit Variable für die ADC mit dem Namen ADC_Wert.

Wenn ich irgend einen Fehler gemacht hab, bitte Nachsicht, bin noch 
Anfänger.
#3545467
Lesenswert?

Christian schrieb:
> Hallo zusammen,
>
> ich bin grad an PWM dran, und möchte mit meinem ATmega88 ein Signal
> erzeugen (1kHz, verwendung von 16Bit Timer, ICR1 = 1024 da ich die
> Pulslänge über den 10Bit Wert einer ADWandlung ändern will).

Schön. Hast du das AVR-Tutorial: PWM schon gelesen?

> 1.Wie muss ich den Prescaler des Timers einstellen?

So groß, daß die Überlauffrequenz des Timer die gewünschte PWM-Frequenz 
ergibt.

> 2.Wie mache ich es, dass ich die Pulsdauer ändere?

Indem du den gewünschten Wert ist das zur jeweiligen PWM-Betriebsart und 
dem gewünschten Ausgabepin passende OCR-Register schreibst.

>   (nicht invertierter Modus, Fast PWM 10Bit)
>    Wäre dieser ansatz richtig, wenn ich den ADCWert in OCR1 übergebe.
>    Natürlich erst wenn der Timer wieder auf 0 gesetzt wird.

Der ATmega88 hat bereits einen 10 Bit PWM-Modus. Bzw. genau genommen 
sogar zwei: Mode 3 und 7. Es gibt also keinen Grund, die Zählweiten- 
beschränkung per ICR1 manuell vorzunehmen. Auch um das zeitrichtige 
Update des Vergleichsregisters kümmert sich der ATmega88 selber.

Lies einfach mal das Datenblatt. Abschnitt 16.9.3 "Fast PWM Mode"


XL
Gast #3545555
Lesenswert?

Weil ich nicht so bin und ich letzte Woche gerade mit was Ähnlichem 
rumexperimientiert habe, hier ein bisschen Code:
1
int main(void)
2
{
3
  /* Set as output: */
4
  DDRD |= _BV(PD6);  // OC0A pin
5

6
  TCCR0A = _BV(COM0A1)|  // non-inverting mode
7
    _BV(WGM01)|_BV(WGM00);  // FastPWM
8
  TCCR0B = _BV(CS00);  // enable Timer 0, no prescaler
9
  TIMSK0 = _BV(TOIE0);
10
  // ADC
11
  ADCSRA = _BV(ADEN)|
12
    _BV(ADPS1)|_BV(ADPS0);    // prescaler 8
13
  ADMUX = _BV(REFS0)|_BV(ADLAR)|3;  // ADC3
14
  DIDR0 = _BV(ADC3D);
15

16
  while (1) {
17
    // start AD conversion
18
    ADCSRA |= _BV(ADSC);
19
    // wait for completion
20
    while (ADCSRA & _BV(ADSC))
21
      ;
22
    OCR0A = ADCH;
23
  }
24

25
  return 0;
26
}
Aber Achtung: (1) Das ist für einen ATmega328P, und (2) ich brauche nur 
8 Bit PWM-Genauigkeit (daher Timer0, nicht Timer1) und nutze daher auch 
nur die höherwertigen 8 Bit der AD-Konvertierung, (3) der Atmel läuft 
mit 1MHz (Auslieferungszustand). Also: Umsetzung auf deine Anforderungen 
bitte selber machen mithilfe des Datenblattes.
#3545597
Lesenswert?

Christian schrieb:
> Das mit dem Prescaler versteh ich aber noch nicht?

Der Timer zählt mit jedem Impuls seiner Eingangsfrequenz um eins nach 
oben, bis 1023 (in einem 10-Bit PWM-Modus) und springt von da wieder auf 
0. Bei jedem Durchlauf wird 1 PWM-Impuls erzeugt. Die PWM-Frequenz ist 
also um den Faktor ..... kleiner (Wert bitte selber einsetzen) als die 
Eingangsfrequenz des Timers.

Wenn du nun eine bestimmte PWM-Frequenz willst, muß die Eingangsfrequenz 
des Timers um wieviel größer sein? Und um von der System-Taktfrequenz 
auf diesen gewünschen Wert zu kommen, brauchst du dann welchen 
Vorteiler?

> Und wie mache ich das mit dem Wert des ADCs?

Den ADC-Wert kannst du aus einem Register auslesen. Und den PWM-Wert 
mußt du in ein anderes Register schreiben. Also laß mal überlegen: wie 
könnte man das anfangen, den Wert aus dem ADC Register zu lesen und ins 
OCRx Register zu schreiben?

> Wie gesagt ich bin noch Anfänger.

Das ist doch prima. Desto mehr gibt es für dich zu lernen. Oh. Das 
AVR-Tutorial hat auch was über den ADC.


XL

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren