PWM mit AD-Wandler steuern

OP #1835930
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
}
OP #1842576
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
}
#1842649
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.
OP #1842705
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.
OP #1842832
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.
#1842842
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?
#1842913
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.

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