PWM liefert dauerhaft 2.5 Volt?

OP #3192882
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
}
#3192961
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.
Gast #3193994
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
#3194009
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.
(Firma: matzetronics) #3194028
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.
OP #3194042
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
OP #3194050
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
Angehängte Dateien:
Gast #3194053
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.
OP #3194058
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
Gast #3194067
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).
OP #3194073
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
Angehängte Dateien:
OP #3194098
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
Angehängte Dateien:
Gast #3194115
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.
OP #3194121
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

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