Forum: Mikrocontroller und Digitale Elektronik PWM liefert dauerhaft 2.5 Volt?


von Phil E. (mieper)


Lesenswert?

Hallo Community :)

ich verzweifle gerade ab meinem Mini Projekt. Ich möchte mit zwei 
Knöpfen das Tastverhältnis meiner PWM um 5% erhöhen oder verringern. 
Doch egal was ich drücke, oder auch nicht drücke. Ich bekomme 
ausgangsseitig immer 2.5V Spannung.
Ein Ossi hab ich leider momentan nicht zur Verfügung um das mal genau 
nachzumessen. Mein Multimeter zeigt mir eine Frequenz von 16.24 kHz.
Ich kann mir nicht ausmalen was der Fehler sein könnte. Hättet ihr eine 
Anregung?

Grüße



1
#define F_CPU 8000000UL
2
#include <avr/io.h>
3
#include <util/delay.h>
4
#include <stdlib.h>
5
#include <avr/interrupt.h>
6
7
8
9
int main(void){
10
11
12
DDRC &= ~(1 << PC5); // PC5 als Eingang festlegen
13
PORTC |= (1 << PC5); // Pullup für PC5 aktivieren
14
DDRC &= ~(1 << PC4); // PC4 als Eingang festlegen
15
PORTC |= (1 << PC4); // Pullup für PC4 aktivieren
16
17
18
  
19
  //Hardware-PWM initialisieren
20
21
  DDRB |= (1 << DDB3);
22
  // PB3 is now an output
23
24
  TCCR2 |= (1 << COM21);
25
  // set none-inverting mode
26
27
  TCCR2 |= (0 << WGM21) | (1 << WGM20);
28
  // set fast Phasecorrect PWM Mode
29
30
  TCCR2 |= (1 << CS20);
31
  // no prescaler
32
  
33
  float variable = 0.5; //standart pwm
34
  int variablex = variable * (255); //standart pwm
35
  while(1){
36
    
37
    if (bit_is_clear(PINC,5)) {variable = variable + (0.05); _delay_ms(10);} // Wert von PC5 prüfen  
38
    if (bit_is_clear(PINC,4)) {variable = variable - (0.05); _delay_ms(10);} // Wert von PC4 prüfen
39
    
40
    if (variable < 0){variable = 0;}
41
    if (variable > 1){variable = 1;}
42
      
43
    variablex = variable * (255);
44
    OCR2 = variablex;
45
    
46
  }
47
48
49
  return 0;
50
}

von Stefan S. (stefan2013)


Lesenswert?

Hallo!

Also erstens mal: welchen Controller verwendest du und was ist deine 
Betriebsspannung?

Mit "TCCR2 |= (0 << WGM21) | (1 << WGM20);" wirst du WGM21 nicht auf 0 
setzten! Bitte schau dir was über Bitmasken hier im Tutorial an. Das 
dürste hier aber egal sein, da per default sowieso auf 0.

float = schlecht!
Das kannst du sicher auch anders lösen.

von Phil E. (mieper)


Lesenswert?

Hab das mal korrigiert. Ändert sich trotzdem nichts.
Der Controller ist der liebe Atmega8.

Grüße

von da1l6 (Gast)


Lesenswert?

Hallo


Mit einem Multimeter kann man das PWM Tastverhältnis meist nicht 
zuverlässig messen.
Klemme eine LED mit Vorwiderstand an und gucke ob sich die Helligkeit 
ändert.

da1l6

von Phil E. (mieper)


Lesenswert?

Bleibt auch immer gleich hell. :(


Grüße

von da1l6 (Gast)


Lesenswert?

Versuch es mit Fehler-Eingrenzung:

Schreib in OCR2 mal testweise feste Werte rein, also z.B. einmal 
programmieren mit dem Wert 2 dann 128 und 255 und vergleiche das 
Ergebnis.

Wenn sich die LED Helligkeit ändert, ist arbeitet der Timer korrekt und 
der Fehler ist in der Floating point (muss das sein?) Logik.
Ändert sich die LED helligkeit nicht, arbeitet der Timer nicht richtig.

da1l6

von Phil E. (mieper)


Lesenswert?

Hab das jetzt mit 'OCR2 = 255' und 'OCR2 = 0' getestet. Die Spannung ist 
2,4V und die LED verändert seine Helligkeit nicht sichtbar.
Ist der Timer Defekt?

Grüße

von Hubert G. (hubertg)


Lesenswert?

Du hast einen Hardwarefehler, z.B. AVCC nicht mit VCC verbunden, oder 
sonst was falsch verbunden. Dein Programm funktioniert, vielleicht nicht 
ganz so wie du es möchtest.
Wenn du die Tasten etwas länger drückst, dann ist die LED ganz hell oder 
ganz aus. Mit kurz antippen geht es stufenweise.

von da1l6 (Gast)


Lesenswert?

Funktioniert der IO Pin ohne Timer, also Ausgang 1/0?

von Ralf G. (ralg)


Lesenswert?

Hubert G. schrieb:
> Du hast einen Hardwarefehler

... würde ich auch tippen. Denn die Simulation im AVR-Studio läuft 
einwandfrei.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Phil E. schrieb:
> TCCR2 |= (1 << COM21);
>   // set none-inverting mode
>
>   TCCR2 |= (0 << WGM21) | (1 << WGM20);
>   // set fast Phasecorrect PWM Mode
>
>   TCCR2 |= (1 << CS20);
>   // no prescaler

Es ist nach wie vor keine gute Idee, das alles so häppchenweise in die 
Register zu schreiben. Da entstehen ungewollte und evtl. sogar 
reservierte Zwischenzustände, die einem den Spass verderben.
1
TCCR2 |= (1 << COM21)|(0 << WGM21)|(1 << WGM20)|(1 << CS20);
Besser so.

von Phil E. (mieper)


Angehängte Dateien:

Lesenswert?

Doch genauso hatte ich mir mein Programm vorgestellt. Vorrausgetzt es 
funktioniert überhaupt.
Habe jetzt die Fehlen Brücken dazu gesteckt. Immernoch der selbe Mist.

Grüße



Edit:

Matthias Sch. schrieb:
> TCCR2 |= (1 << COM21)|(0 << WGM21)|(1 << WGM20)|(1 << CS20);

Ich teste das mal.

Grüße

von Phil E. (mieper)


Lesenswert?

Matthias Sch. schrieb:
> TCCR2 |= (1 << COM21)|(0 << WGM21)|(1 << WGM20)|(1 << CS20);

Habe das reinkopiert. Kein Ergebnis.

da1l6 schrieb:
> Funktioniert der IO Pin ohne Timer, also Ausgang 1/0?

Sollte noch funktionieren. Hatte vor wenigen Tagen den IC noch für etwas 
anderes genutzt. Der Pin ging da Klasse.

Zum Programmieren benutze ich das STK 500. Vielleicht hab ich ein Fuse 
falsch gesetzt? Ich überprüf das mal.

Grüße

von Hubert G. (hubertg)


Lesenswert?

Zum einen solltest du die Bildformate beachten, mit 100k Bildgröße sieht 
man genau so viel.
Gib man an VCC und AVCC je einen 100n Kondensator nach GND.

von Phil E. (mieper)


Angehängte Dateien:

Lesenswert?

Hubert G. schrieb:
> Zum einen solltest du die Bildformate beachten, mit 100k Bildgröße sieht
> man genau so viel.
> Gib man an VCC und AVCC je einen 100n Kondensator nach GND.

Ok ich mach in Zukunft die Bilder kleiner. Ist jetzt die kleinste 
Auflösung von meinem Handy.
Beide Kondensatoren sind dabei. Scheint ein Fehler in der "Matrix" zu 
sein :D

Grüße

von Wissender (Gast)


Lesenswert?

Hallo,

auch der Spannungsregler oben am Rand will einige Kapazitäten haben, um 
korrekt zu funktionieren (siehe Datenblatt des 7805). Und den Pin AREF 
sollte man nicht an Plus legen, sondern über einen 0u1 Kondi an GND.

von Phil E. (mieper)


Lesenswert?

Wissender schrieb:
> Hallo,
>
> auch der Spannungsregler oben am Rand will einige Kapazitäten haben, um
> korrekt zu funktionieren (siehe Datenblatt des 7805). Und den Pin AREF
> sollte man nicht an Plus legen, sondern über einen 0u1 Kondi an GND.

Der 7805 hat einen 4,7uF Elko Ausgangsseitig. Hab auch AREF umgeklemmt.
Löst aber auch nicht mein Problem :(

Grüße

von Hubert G. (hubertg)


Lesenswert?

Laut Datenblatt gehört an den Eingang des 7805 ein 330n Kondensator und 
an den Ausgang ein 100n, und zwar so nahe wie möglich an die Pin.

von Wissender (Gast)


Lesenswert?

> Der 7805 hat einen 4,7uF Elko Ausgangsseitig.

Sorry, hatte ich übersehen (er ist rechts oben). Aber auch der Eingang 
des Reglers mag einen Kondensator.

Wie hoch ist die Versorgungsspannung des ATmega? Miss mal nach (am 
Controller).

von Phil E. (mieper)


Angehängte Dateien:

Lesenswert?

Hubert G. schrieb:
> Laut Datenblatt gehört an den Eingang des 7805 ein 330n Kondensator und
> an den Ausgang ein 100n, und zwar so nahe wie möglich an die Pin.

Wissender schrieb:
> Wie hoch ist die Versorgungsspannung des ATmega? Miss mal nach (am
> Controller).


Hab ihn mal Probeweise auf dem STK500. Ändert leider auch nichts.

Grüße


Edit:
Hab gerade auf dem Steckbrett gemerkt das es Wurst ist wie rum die LED 
gepolt ist. Der Timer taktet also. Nur eben nicht anpassbar.

Grüße

von Hubert G. (hubertg)


Lesenswert?

Dann hast du das Programm nicht korrekt auf den Kontroller übertragen. 
Bei mir funktioniert es auch auf dem STK500.
Fuses auch schon kontrolliert?

von holger (Gast)


Lesenswert?

>Dann hast du das Programm nicht korrekt auf den Kontroller übertragen.

Oder das falsche Programm.

von Phil E. (mieper)


Angehängte Dateien:

Lesenswert?

Hubert G. schrieb:
> Dann hast du das Programm nicht korrekt auf den Kontroller übertragen.
> Bei mir funktioniert es auch auf dem STK500.
> Fuses auch schon kontrolliert?

Hab das Programm jetzt mal ohne diesen on-the-fly Debug Knopf 
übertragen.
Funktioniert jetzt 1A. Schon komisch. Der Debug Knopf hat sonst immer 
super funktioniert.

Ich bedanke mich bei allen Herzlich. Dafür das ihr euch alle die Zeit 
und Geduld genommen habt. War wohl schlichtweg ein dummer Bedienfehler 
von mir.

Danke! :)
Grüße

von Phil E. (mieper)


Lesenswert?

Hab doch noch eine kleine Frage am Rande. Die Spannung für den 
Controller beträgt 4.98Volt. Und die maximale PWM Ausgangsspannung liegt 
bei 4.5Volt. Warum ist das denn? Auf 100% wird doch garnichts mehr 
zerhackt.

Grüße

von Wissender (Gast)


Lesenswert?

> Und die maximale PWM ausgangsspannung liegt bei 4.5Volt. Warum ist das denn?

Spannungsabfall vom internen Schalttransistor wegen des LED-Stroms.
Wenn Du die LED abklemmst und direkt am Pin nach GND misst, sollte die 
Spannung die Versorgungsspannung knapp erreichen.

von Phil E. (mieper)


Lesenswert?

Wissender schrieb:
>> Und die maximale PWM ausgangsspannung liegt bei 4.5Volt. Warum ist das denn?
>
> Spannungsabfall vom internen Schalttransistor wegen des LED-Stroms.
> Wenn Du die LED abklemmst und direkt am Pin nach GND misst, sollte die
> Spannung die Versorgungsspannung knapp erreichen.

Jap :)
Hab die LED jetzt mit einem BC548A angesteuert. Die PWM Ausgangsspannung 
am IC ist jetzt 4.98 Volt. Der Pin konnte wohl nicht so viel auf einmal 
verkraften.

Ok alles funktioniert wunderbar. Ich bedanke mich nochmal bei allen, und 
gehe jetzt frohen gemütes ins Bett. :)

Grüße

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.