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


von Ingo L. (grobian)


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 ?
1
#define F_CPU 1000000UL
2
#include <avr\io.h>
3
#include <util/delay.h>
4
5
int main (void)
6
{
7
8
DDRB = 255; // PORT auf Ausgang
9
10
// AD INIT
11
ADMUX   |= (0<<REFS1) |(1<<REFS0);  // externe Referenz
12
ADMUX  |= (0<<MUX3)  |(0<<MUX2) | (0<<MUX1) | (1<<MUX0) ; //ADC1
13
//ADMUX   |= (1<<ADLAR);
14
ADCSRA  |= (1<<ADEN) ; // ADC ENABLE
15
ADCSRA  |= (0<<ADPS2) |(1<<ADPS1)| (1<<ADPS0) ; // PRESCALER 8
16
ADCSRA  |= (1<<ADFR);
17
18
// Timer 2 INIT
19
TCCR2 |= (1<<WGM20) | (0<<WGM21);     // MODE 1
20
TCCR2 |= (1<<COM21) | (0<<COM20);    // OC2 ON PB3
21
TCCR2 |= (1<<CS21);      // Prescaler  = 8 und Start Timer
22
23
while(1)
24
  {
25
    ADCSRA |= (1<<ADSC); // WANDLUNG STARTEN
26
    while (!(ADCSRA & (1<<ADIF))); // WARTEN BIS FERTIG
27
    OCR2 = ADC/4; // nur 256 Werte
28
  }
29
}

von Ingo L. (grobian)


Lesenswert?

Keine Kommentare ?

von Wayne (Gast)


Lesenswert?

Der ADC gibt maximal 1023 zurück...

von spess53 (Gast)


Lesenswert?

Hi

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

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

MfG Spess

von Ingo L. (grobian)


Lesenswert?

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

Teile durch 4 von daher sollte zumindest der Wert passen

von spess53 (Gast)


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

von Ingo L. (grobian)


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.
1
#define F_CPU 1000000UL
2
#include <avr\io.h>
3
#include <util/delay.h>
4
5
int main (void)
6
{
7
8
DDRB = 255; // PORT auf Ausgang
9
10
// AD INIT
11
ADMUX   |= (0<<REFS1) |(1<<REFS0);  // externe Referenz
12
ADMUX   |= (0<<MUX3)  |(0<<MUX2) | (0<<MUX1) | (1<<MUX0) ; //ADC1
13
//ADMUX   |= (1<<ADLAR);
14
ADCSRA  |= (1<<ADEN) ; // ADC ENABLE
15
ADCSRA  |= (0<<ADPS2) |(1<<ADPS1)| (1<<ADPS0) ; // PRESCALER 8
16
ADCSRA  |= (1<<ADFR);
17
18
// Timer 2 INIT
19
TCCR2 |= (1<<WGM20) | (0<<WGM21);     // MODE 1
20
TCCR2 |= (1<<COM21) | (0<<COM20);    // OC2 ON PB3
21
TCCR2 |= (1<<CS21);      // Prescaler  = 8 und Start Timer
22
23
while(1)
24
  {
25
    ADCSRA |= (1<<ADSC); // WANDLUNG STARTEN
26
    while (!(ADCSRA & (1<<ADSC))); // WARTEN BIS FERTIG
27
    OCR2 = ADC/4; // nur 256 Werte
28
  }
29
}

von Karl H. (kbuchegg)


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.

von Ingo L. (grobian)


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.

von Karl H. (kbuchegg)


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 ---------+-----------------

von Ingo L. (grobian)


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.

von Karl H. (kbuchegg)


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?

von Ingo L. (grobian)


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.

von Ben _. (burning_silicon)


Lesenswert?

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

von Ingo L. (grobian)


Lesenswert?

software siehe oben

von Ben _. (burning_silicon)


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.

von Karl H. (kbuchegg)


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

von Ben _. (burning_silicon)


Lesenswert?

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

von OPV (Gast)


Lesenswert?

Macht die Slash-Richtung bei den includes eigentlich was aus?

von Ingo L. (grobian)


Lesenswert?

Manchmal macht es auch einfach Sinn den uP mal zu tauschen...
GEHT...

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.