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
intmain(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
floatvariable=0.5;//standart pwm
34
intvariablex=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
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.
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
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
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
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.
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.
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
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
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.
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
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.
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
> 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).
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
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
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
> 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.
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