mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PWM mit AD-Wandler steuern


Autor: Ingo Laabs (grobian)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auf die Gefahr hin, dass gleich wieder mit mir gemeckert wird wegen
formatierung.
Ich wollte jetzt mit demn Wert den ich über den ADC einlese an die PWM
ausgeben. Das gelingt auch, nur kann ich das Tastverhältniss nur bis 
etwa
50% einstellen. Wo ist hier der Knacks ?
#define F_CPU 1000000UL
#include <avr\io.h>
#include <util/delay.h>

int main (void)
{

DDRB = 255; // PORT auf Ausgang

// AD INIT
ADMUX   |= (0<<REFS1) |(1<<REFS0);  // externe Referenz
ADMUX  |= (0<<MUX3)  |(0<<MUX2) | (0<<MUX1) | (1<<MUX0) ; //ADC1
//ADMUX   |= (1<<ADLAR);
ADCSRA  |= (1<<ADEN) ; // ADC ENABLE
ADCSRA  |= (0<<ADPS2) |(1<<ADPS1)| (1<<ADPS0) ; // PRESCALER 8
ADCSRA  |= (1<<ADFR);

// Timer 2 INIT
TCCR2 |= (1<<WGM20) | (0<<WGM21);     // MODE 1
TCCR2 |= (1<<COM21) | (0<<COM20);    // OC2 ON PB3
TCCR2 |= (1<<CS21);      // Prescaler  = 8 und Start Timer

while(1)
  {
    ADCSRA |= (1<<ADSC); // WANDLUNG STARTEN
    while (!(ADCSRA & (1<<ADIF))); // WARTEN BIS FERTIG
    OCR2 = ADC/4; // nur 256 Werte
  }
}

Autor: Ingo Laabs (grobian)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Keine Kommentare ?

Autor: Wayne (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der ADC gibt maximal 1023 zurück...

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

> while (!(ADCSRA & (1<<ADIF))); // WARTEN BIS FERTIG

Am Ende der Wandlung wird ADSC wieder Null. Also darauf prüfen.

MfG Spess

Autor: Ingo Laabs (grobian)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wayne schrieb:
> Der ADC gibt maximal 1023 zurück...
while(1)
  {
    ADCSRA |= (1<<ADSC); // WANDLUNG STARTEN
    while (!(ADCSRA & (1<<ADIF))); // WARTEN BIS FERTIG
    OCR2 = ADC/4; // nur 256 Werte !!!!!!!!!!!
  }

Teile durch 4 von daher sollte zumindest der Wert passen

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Nochmal. Deine Prüfung von ADIF ist Müll. Das wird nach der ersten 
Wandlung gesetzt und bleibt bis zum Ausschalten des Controllers auf H.

MfG Spess

Autor: Ingo Laabs (grobian)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe das Programm jetzt mal (endlich) geändert und prüfe auf ADSC. 
Ändert aber nicht an der Tatsache, dass ich die Pulsweite nicht 
kontinuierlich von 0-100 % einstellen kann. Folgende kann ich 
feststellen: Messe ich die Spannung die am ADC1 anliegt (kommt über ein 
10kOhm-Poti) kann ich die von 0 - 3,1 Volt einstellen (das Poti ist OK 
und wurde schon getauscht). Kling komisch ist aber so. Das aber auch nur 
im Falle, wenn ich im PWM-Betrieb bin. Lasse ich den Weg und gebe den 
ADC-Wert auf einen Port aus, kann ich die Spannung am Eingang von ADC 
von ca. 0-5 Volt einstellen.
Warum ist das so, welchen Einfluss hat die PWM auf den AD-Wandler ?
Der Verwendetet Prozessor ist der Mega 8 und der Aref pin liegt über 
100nF an Masse. VACC liegt an 5 Volt.
#define F_CPU 1000000UL
#include <avr\io.h>
#include <util/delay.h>

int main (void)
{

DDRB = 255; // PORT auf Ausgang

// AD INIT
ADMUX   |= (0<<REFS1) |(1<<REFS0);  // externe Referenz
ADMUX   |= (0<<MUX3)  |(0<<MUX2) | (0<<MUX1) | (1<<MUX0) ; //ADC1
//ADMUX   |= (1<<ADLAR);
ADCSRA  |= (1<<ADEN) ; // ADC ENABLE
ADCSRA  |= (0<<ADPS2) |(1<<ADPS1)| (1<<ADPS0) ; // PRESCALER 8
ADCSRA  |= (1<<ADFR);

// Timer 2 INIT
TCCR2 |= (1<<WGM20) | (0<<WGM21);     // MODE 1
TCCR2 |= (1<<COM21) | (0<<COM20);    // OC2 ON PB3
TCCR2 |= (1<<CS21);      // Prescaler  = 8 und Start Timer

while(1)
  {
    ADCSRA |= (1<<ADSC); // WANDLUNG STARTEN
    while (!(ADCSRA & (1<<ADSC))); // WARTEN BIS FERTIG
    OCR2 = ADC/4; // nur 256 Werte
  }
}

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Folgende kann ich
> feststellen: Messe ich die Spannung die am ADC1 anliegt
> (kommt über ein 10kOhm-Poti) kann ich die von 0 - 3,1 Volt
> einstellen (das Poti ist OK und wurde schon getauscht).

Heist das, du hast die mit einem Voltmeter gemessen?
Oder schliest du das aus dem Verhalten deines Programms?


Es wäre jetzt wichtig zu wissen, ob der ADC Wert deiner tatsächlichen 
Spannung entspricht. d.h. bricht die Spannung bei laufender PWM 
tatsächlich ein oder ist nur der ADC Messwert falsch.

Wenn die tatsächlich einbricht, dann muss man hardwaremässig 
weiterschauen. Blockkondensatoren, Einbrüche des Netzteils, was hängt am 
PWM Ausgang, etc.

Autor: Ingo Laabs (grobian)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Heist das, du hast die mit einem Voltmeter gemessen?
> Oder schliest du das aus dem Verhalten deines Programms?

Ich messe mit dem Voltmeter am Pin ADC1 vom Mega8

>
>
> Es wäre jetzt wichtig zu wissen, ob der ADC Wert deiner tatsächlichen
> Spannung entspricht. d.h. bricht die Spannung bei laufender PWM
> tatsächlich ein oder ist nur der ADC Messwert falsch.

Die Spannung bricht devinitiv zusammen der ADC-Wert wird der Spannung 
entsprechen, weil ich etwa 50% Tasverhältniss habe bei ca. 3,1 Volt am 
ADC Eingang. Bei Ansclag des Potis habe ich da einen Restwiederstand von 
20 Ohm. Darüber fällt die komplette Spannung ab die eigentlich zum ADC 
Eingang soll.


>
> Wenn die tatsächlich einbricht, dann muss man hardwaremässig
> weiterschauen. Blockkondensatoren, Einbrüche des Netzteils, was hängt am
> PWM Ausgang, etc.

Blockkondensatoren sitzen im Netzteil sowie am Mega8.
Messe den Ausgang mit dem Oszi.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ingo Laabs schrieb:

> ADC Eingang. Bei Ansclag des Potis habe ich da einen Restwiederstand von
> 20 Ohm. Darüber fällt die komplette Spannung ab die eigentlich zum ADC
> Eingang soll.

Wie sieht die Schaltung aus?



    Vcc --------+
                |
               ---  10k Poti
               | |
              <-----+---------------> zum ADC Pin
               | |
               ---
                |
                |
   GND ---------+-----------------

Autor: Ingo Laabs (grobian)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
jo..genau so.
Wenn der Schleifer auf dem oberen Anschlag steht, messe ich noch 
zwischen Schleifer und VCC einen Widerstand von 20 Ohm an dem die 
fehlende Spannung abfällt. Das wäre eigentlich nur denkbar, wenn der 
Eingang vom ADC niederohmig wäre was ja eigentlich nicht der Fall ist.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ingo Laabs schrieb:

> Wenn der Schleifer auf dem oberen Anschlag steht, messe ich noch
> zwischen Schleifer und VCC einen Widerstand von 20 Ohm an dem die
> fehlende Spannung abfällt. Das wäre eigentlich nur denkbar, wenn der
> Eingang vom ADC niederohmig wäre was ja eigentlich nicht der Fall ist.

Ich hab keine Erklärung dafür.
Und wenn du die PWM nicht erzeugen lässt, dann ist der Effekt weg?
Seltsam.

Lötbrücke oder sonst irgendeine Verbindung vom PWM Ausgang zum ADC 
Eingang ist völlig ausgeschlossen?

Autor: Ingo Laabs (grobian)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Ich hab keine Erklärung dafür.
> Und wenn du die PWM nicht erzeugen lässt, dann ist der Effekt weg?
> Seltsam.
>
Ja ist so !

> Lötbrücke oder sonst irgendeine Verbindung vom PWM Ausgang zum ADC
> Eingang ist völlig ausgeschlossen?

Eigentlich schon. Werde aber am Nachmittag nochmal genau schauen. Bin 
jetzt auf Arbeit.

Autor: Ben ___ (burning_silicon)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
stinkt nach einem softwareproblem, was den ADC-pin als ausgang 
definiert. dadurch würde der µC selber den strom nach masse ziehen.

Autor: Ingo Laabs (grobian)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
software siehe oben

Autor: Ben ___ (burning_silicon)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wenn ich blind wär könnte ich hier nur schlecht schreiben oder?

C is aber nicht mein ding, erstens weißt du nicht was der compiler aus 
deinem source zurechtwurstet und zweitens mag ich assembler. ich weiß, 
hilft dir nicht weiter, aber ich wollte es nur als mögliche 
fehlerursache anmerken.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ben _ schrieb:
> wenn ich blind wär könnte ich hier nur schlecht schreiben oder?
>
> C is aber nicht mein ding, erstens weißt du nicht was der compiler aus
> deinem source zurechtwurstet

Na komm.
Der Compiler saugt sich ja nicht einfach irgendetwas aus den virtuellen 
Fingern.

> und zweitens mag ich assembler.

Schon gut.
Aber auch als Assemblerprogrammierer sollte man erraten können, was wohl
   DDRB = 255; // PORT auf Ausgang
macht. Und eine andere Verwendung eines DDRx Registers kommt im Programm 
nicht vor.

Hab extra noch einmal nachgesehen.
Beim Mega 8 liegt der OCR Pin am Port B, der ADC aber am Port C. Von 
daher dürfte es eigentlich keine Beeinflussung geben.

Autor: Ben ___ (burning_silicon)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
definier doch den entsprechenden pin von portc mal spaßeshalber explizit 
als eingang und schau was dann passiert...?

Autor: OPV (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Macht die Slash-Richtung bei den includes eigentlich was aus?

Autor: Ingo Laabs (grobian)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Manchmal macht es auch einfach Sinn den uP mal zu tauschen...
GEHT...

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.