Forum: Mikrocontroller und Digitale Elektronik PWM rauf/runter regeln


von Samy (Gast)


Angehängte Dateien:

Lesenswert?

Guten Abend

Hoffe hier kann mir einer helfen bzw. findet den Fehler. Teste schon
das ganze Wochenende rum!!

Zum AVR: es wird auf 8 Kanälen PWM erzeugt und an PortB (STK 500)
ausgegeben --> gut das funktioniert. Da ich das PWM zu einer
Gleichspannung per RC-Siebung/OP verwandle wollte ich das ganze testen
d.h. PWM rauf und runter reeln und Spannungen prüfen. Tja wie regle ich
das PWM --> da es nur zum testen ist habe ich im Hauptprogramm einfach
einen Sprung auf das Unterprogramm "Tasten" gesetzt! Das
Unterprogramm fragt den Status der Tasten ab an PinD --> entprellt
diese und addiert bzw. subtrahiert einen Zahl vom Sollwert des PWM -->
somit kann ich das PWM rauf und runter regeln.

Wenn ich das ganze im AVRStudio 4 teste funktioniert das auch super -->
nur wenn ich das ganze in echt auf dem AVR teste gehen die Tasten
nicht.

Vielleicht kann mir einer helfen

Thanks @ all

von ...HanneS... (Gast)


Lesenswert?

Hi Sammy...

- Du verwendest in Haupt: RCALL ohne RET, das gibt Stack-Überlauf.
- Du fragst die Tasten in der Hauptschleife ab, das ist zu schnell.
  Das solltest du mit in der Timer-ISR erledigen.
- Deine Tastenentprellung kann ich nicht ganz nachvollziehen,
  schau die mal die Routine von Peter Dannegger an, die ist
  absolut sicher:
  http://www.mikrocontroller.net/forum/read-1-140056.html#140084
- Das Verändern der PWM-Werte um 50 ist etwas heftig, außerdem gibt
  es keinen Schutz gegen Überlauf.

Ansonsten kommt mir das Programm sehr bekannt vor ;-)

...

von ...HanneS... (Gast)


Angehängte Dateien:

Lesenswert?

Ich denke mal, so müsste es gehen...

...

von Samy (Gast)


Angehängte Dateien:

Lesenswert?

Abend HanneS

Sorry für späte Antwort --> bin erst vor kurzem von Arbeit gekommen.
Thanks für deine Datei bzw. Mühe.

- Du verwendest in Haupt: RCALL ohne RET, das gibt Stack-Überlauf.

Tja das war der Grund warum nix funktioniert hat. Da habe ich mir
meinen Stack schön zugemüllt --> da kanns nett gehen.
Wie kann ich nur so einen Fehler übersehen???????????

- Deine Tastenentprellung kann ich nicht ganz nachvollziehen,
  schau die mal die Routine von Peter Dannegger an, die ist
  absolut sicher:
  http://www.mikrocontroller.net/forum/read-1-140056.html#140084

Wenn Bock hast kannst dir den Dateianhang ansehen. In meinem ersten
Post/Dateianhang war ein Fehler im Interrupt Timer0--> kleiner Dreher
von setze und lösche die Flags. Jetzt habe ich auch ne Erklärung
hingeschrieben.

Das Prinzip habe ich mal in einem Buch gelesen --> was haltest Du bzw.
Ihr davon???

- Du fragst die Tasten in der Hauptschleife ab, das ist zu schnell.
  Das solltest du mit in der Timer-ISR erledigen.

Ist klar das es zu schnell ist --> war nur ein Test
Da der AVR überhaupt nett auf die Tasten reagiert hat (dank rcall)
hatte ich einiges im Programm raus genommen (Fehler eingrenzen).

- Das Verändern der PWM-Werte um 50 ist etwas heftig, außerdem gibt
  es keinen Schutz gegen Überlauf.

Da die LED`s auf dem STK500 nicht jede Änderung des PWM sichtbar
machen, deswegen der Wert 50 --> da gibt es dann nur an, aus und
blinken --> so sehe ich sicher das der AVR die Taste mal einliest.

Zum Thema Überlauf

Wie gesagt die Tasten sind nur zu Testen --> PWM rauf und runter und
schauen was die Glättung macht.
Später kommen Tasten raus und der AVR bekommt seine Sollwerte von
Windows per USB in das EEPROM geschrieben --> dauert noch etwas.


Vielen Dank

von ...HanneS... (Gast)


Angehängte Dateien:

Lesenswert?

Warum wieder das gesamte Projekt als Zip?? Nur die ASM-Datei hätte doch
gereicht. Dein Programm ist doch einteilig.

Ich habe mal kurz reingesehen, aber es nicht vollständig analysiert.
Nimms mir nicht übel, aber es ist mir etwas zu undurchsichtig und
hektisch. Wenn ich schon sehe, dass mit RJMP aus der ISR rausgesprungen
wird. Schau mal, wieviele Takte du für diese Spaghettispringerei
vertrödelst, die ISR soll möglichst kurz und übersichtlich sein. Deine
Entprellung ist auch bedeutend länger als die von Peter und irgendwie
auch umständlicher. Ich kann mich damit nicht anfreunden.

Funktioniert sie denn wenigstens?

Und hast du mal die oben gepostete "Test2.asm" angesehen, assembliert
und getestet? Einen alten PC-Turboschalter (oder Reset-Taster) als
Shift-Taste wirst du doch sicher finden, passt direkt auf die
Stiftleiste von PortA auf GND und PA6 des STK500. Siehe Anhang...

...

von ...HanneS... (Gast)


Lesenswert?

Was soll das eigentlich mal werden, eine Lüftersteuerung für den PC??

Dann reichen weniger PWM-Stufen. Und dann sollte die PWM nicht bei Null
(aus) beginnen, sondern bei einem Wert, bei dem die Lüfter noch sicher
drehen.

...

von Samy (Gast)


Lesenswert?

Guten Morgen

Stimmt die ASM-Datei reicht, poste ich auch in Zukunft.

Ja ok, etwas hektisch. Das so mancher Takt vertrödelt wird ist auch
richtig. Habe das gestern nur schnell nach Arbeit geschrieben, weil du
gesagt hast du kannst die Tastenentprellung nicht nachvollziehen --> da
kann man noch einiges optimieren!

Ja, deine ASM läuft grad auf meinem AVR. Bin grad dabei das zu
analysieren. Werde ich mal heute Abend weitermachen, da ich jetzt auf
Arbeit muß.

Lüftersteuerung für PC sagt dir nix?
Das System ist ein AMD A64 mit Wasserkühlung --> da sollen die
Radiator-, Gehäuselüfter je nach Lastzustand des Systems bzw.
Wasser-,CPU- und Gehäusetemperatur geregelt werden. Warum --> der
Geräuschpegel soll so klein wie möglich sein.

Was meinst genau mit PWM-Stufen? Die 8 Kanäle oder Zählerumfang 100?
Das von PWM 0 weg der Lüfter nicht sicher anläuft ist klar --> PWM 0 da
ich die Lüfter auch anhalten will.

Thanks nochmal an dich.

von ...HanneS... (Gast)


Lesenswert?

Hi...

Sicher sagt mir Lüftersteuerung was. Ich wusste nur nicht, dass eine
Wasserkühlung 8 Lüfter hat, also 8-fach PWM erfordert. So eine
Lüftersteuerung ist ja auch eine feine Sache, wenn es nicht zum
Selbstzweck ausartet. (Soll keine Kritik sein.)

Da gibt es nur einige Dinge zu bedenken. Z.B. mögen viele bürstenlose
Lüftermotoren keine PWM. Bei einigen spinnt dann die Elektronik, andere
pfeifen mit der PWM-Frequenz. Statt leiser wird der PC lauter. Also
glättet man die PWM. Das bedeutet aber, dass man die Lüfter mit
geglättetem Gleichstrom betreibt. Aber wo glättet man? Direkt an der
Last wird es recht aufwendig, also macht man das davor. Das bedeutet,
dass das "Stellglied" für den Lüfter (Transistor, Spannungsregler...)
Gleichspannung/Gleichstrom "dosieren" muss, was wiederum Leistung in
Wärme umsetzt. Diese muss man nun zusätzlich abführen. Doch eigentlich
wollte man doch die Wärme so gering wie möglich halten, oder? Wenn man
nun den Wärmehaushalt und Lärm des PC als Ganzes betrachtet, wird
Vieles fraglich weil oft das Gegenteil von dem erreicht wird was man
eigentlich wollte.
Dann soll das System per USB gesteuert werden. Was passiert, wenn sich
der PC mal aufhängt? (soll ja gelegentlich vorkommen) Dann fehlen der
Lüftersteuerung die Daten. Angenommen die Lüfter sind gerade recht
langsam eingestellt, der PC läuft Amok, kommt aber nicht mehr in das
Programm, das per USB mit der Lüftersteuerung kommuniziert. Das wäre
mir zu heiß. Daher meine ich, dass eine Lüfter"steuerung" besser eine
"Regelung" sein sollte, die ihre eigenen Sensoren hat und unabhängig
vom PC funktioniert. So kann diese die Lüfter immernoch anpassen, wenn
der PC sich schon lange aufgehängt haben sollte. Und eine
Datenschnittstelle zum PC zur Visualisierung der aktuellen Werte kann
ja trotzdem vorhanden sein.

Dein 8515 bekommt also noch allerhand zu tun. Vielleicht muss auch ein
anderer AVR-Typ her, der andere Features bietet (ADC?). Zumindest ist
es sinnvoll, gleich von Anfang an etwas auf die Rechenzeit (also den
sinnvollen Umgang mit Prozessortakten) zu achten. Die Timer-ISR wird ja
nun periodisch aufgerufen, sie sollte daher extrem kurz sein. Zumindest,
wenn man die PWM-Frequenz möglichst hoch haben möchte, um den
Hardwareaufwand bei der Glättung in Grenzen zu halten. Der
PWM-Zählumfang (also die Anzahl der Tempostufen) sollte nicht höher als
erforderlich sein, den je geringer er ist, desto schneller wird die
PWM-Frequenz. Ich denke mal, dass ich nicht in der Lage bin, mehr als
20...30 Tempostufen unterscheiden zu können, eher noch weniger. Kann
sein, dass 10 Stufen schon genügen.

Dass ich mich wehre, deine Entprellung zu analysieren, ist eine Frage
des Aufwandes. Es ist nämlich schon ein schönes Stück Arbeit, fremden
Code zu analysieren. Besonders, wenn er unzureichend kommentiert ist,
wenn also die Kommentare das gleiche aussagen wie die Befehle selbst
(war jetzt leicht übertrieben, was dich betrifft). Und wenn ich dann
sehe, dass schonmal rund doppelt soviel Code erforderlich ist wie bei
der Bulletproof-Routine von Peter, dann stellt sich die Frage warum
sollte ich das analysieren, denn es kann doch garnicht besser sein.

Wenn jemand ein (kleines) fehlerhaftes Programm veröffentlicht, um
Hilfe bei der Fehlersuche zu bekommen, dann sollte das als
unkomprimierte ASM-Datei (also sofort lesbarer Text!) erfolgen. Wenn
ich erst entzippen mus, einen Ordner auf meiner Platte anlegen muss um
mir die Textdatei anzusehen, dann ist der Lustfaktor schonmal bedeutend
kleiner. Wenn ich aber mit einem Klick auf den Anhang einen gut lesbaren
Programmtext angezeigt bekomme, bei dem sogar noch die
Tabulator-Einrückungen halbwegs formatiert dargestellt werden, dann
schau ich da gerne mal drüber. Dabei möchte ich anhand der Kommentare
aber schon wissen, warum das so und nicht anders gemacht wurde. Wenn
ich beim bloßen Lesen des Quelltextes Fehler entdecke, dann kann ich
auch helfen. Wenn ich das aber erst in AVR-Studio simulieren muss oder
gar in einen eigenen AVR brennen soll, dann frage ich mich, ob das den
Aufwand wert ist, denn das artet in Arbeit aus.
Deine Fehler (Stack) sind mir durch bloßes Lesen des Quelltextes
aufgefallen. Ich höre allerdings mit dem Lesen auf, wenn unsinnig
hinundher gesprungen wird, wenn der Code mangels Kommentare nicht
nachvollziehbar ist bzw. wenn ich sehe, dass der Autor selbst nicht
weiß was er tut. Drangeblieben bin ich eigentlich nur, weil ich
feststellte, dass Teile des Programms von mir abgeschrieben sind (so
wie ich auch gute Algorithmen anderer Leute übernehme).

...

von Samy (Gast)


Lesenswert?

Abend HanneS

Ja acht Lüfter ist etwas viel, sind im Moment noch 2 Reserve bei
 ;-) .
Am Anfang habe ich die Lüfter auch direkt mit PWM betrieben, wie du
schreibst kann man das in die Tonne tretten. Ne saubere Gleichspannung
muß her. Eine Glättung auf der Leistungsseite scheidet aus, da 1. zu
hohe Verlustleitung und 2. zu hohe Spannungsfälle. Da sind wir beim
nächsten Prob --> habe max. +12V vom Netzteil brauche nach Regelung
aber +12V --> dürfte nicht machbar sein d.h. Spannungsfälle müssen so
klein wie möglich bleiben.
Meine grobe Idee ist: AVR erzeugt PWM --> RC-Glättung --> OPV soll/ist
Regelung --> FET. Das scheint mir das beste zu sein, was meinst du
dazu.

Das mit USB ist falsch rüber gekommen --> der AVR und somit die
Steuerung läuft absolut unabhängig von Win! Der AVR bekommt nur meine
Sollwerte per Win über USB in den EEPROM geschrieben und liefert
Messwerte (Temp, Drehzahl, Durchflußmenge usw.) an Win zurück.
Sollten meine Sollwerte/Drehzahlen der Lüfter nicht reichen das Sys zu
kühlen regelt der AVR per Kennlinie automatisch nach, sollte er
zumindest mal machen wenn`s fertig ist.

Du brauchst dich nicht rechtfertigen, ist schon ok so. Bin dir sehr
dankbar für deine Mühe die test2.asm zu schreiben für mich.
Bin etwas raus aus AVR und wirklich viel Erfahrung habe ich noch nicht,
da ist man für jeden Tipp dankbar.
Habe meine Entprellung nur nochmal gepostet weil ich dachte dich würde
es interessieren --> die von Peter ist klasse keine Frage.

Mit abgeschrieben meinst deine Sicherung der Carry-Flags beim PWM,
oder?? Das ist raus aus diesem Forum. Mein PWM war gut doppelt so lang
--> wenn´s einfacher geht, warum nicht.

Werde in der Zukunft wenn ich einen Code hier rein stellen deine
Ratschläge beachten.

Thanks an dich

von ...HanneS... (Gast)


Lesenswert?

@Samy:

Das "Einsammeln der Carry's" habe ich mir auch nur von Peter
abgeguckt. Aber eben aus einem im Forum veröffentlichten Code und nicht
aus einem gewerblich vertriebenem Programm. ;-)

Bekannt kamen mir bei dir die Variablennamen (Register-Alias) vor.
(PWZ, SOLL0...SOLL7)

Eigentlich war das kein "Rechtfertigen". Mir war einfach mal danach,
meine Meinung zu diesem Thema zu äußern. Das hat nichtmal was mit dir
zu tun sondern ganz allgemein, in der Hoffnung, dass das auch Andere
lesen. Und auf meine sarkastisch-humorige Art wird das eben manchmal
stark überspitzt dargestellt. Klar, sowas wird manchmal als Frechheit
aufgefasst, ist mir vorhin auch wieder passiert, weil jemand Rat sucht,
aber seinen Quelltext nicht postet
(http://www.mikrocontroller.net/forum/read-1-148287.html#148510). Und
ohne Quelltext kann ich das Problem nicht lösen, ich bin ja kein
Hellseher.

Der große "Helfer" bin ich da aber auch nicht, denn ich zähle mich
eigentlich immer noch zu den (relativen) Anfängern. Und da ich auch
alle meine Anfängerfehler gemacht habe und noch mache, hilft es mir
auch, solche Fehler zu suchen, wenn mal jemand Probleme hat. Oft muss
ich darüber lachen, dass es genau die Fehler sind, die ich vor garnicht
langer Zeit selbst gemacht habe. Ich überfliege daher ganz gerne mal
fremden Code, wenn er halbwegs strukturiert und gut kommentiert ist.
Allerdings breche ich auch schnell ab, wenn ich merke, dass es
Spaghetticode ist oder mangels aussagekräftiger Kommentare nicht
nachvollziehbar ist.

Meine ersten AVR-Programme waren für den AT90S1200, da gibt es kein
SRAM. Auch waren diese Programme recht zeitkritisch, wegen
Impulsbreitenmessung und PWM im RC-Modellbau. Da fäng man dann schon
an, Takte zu zählen. Und heute schäme ich mich fast für das, was ich
damals so zusammenprogrammiert hatte. Einen kleinen Teil davon habe ich
auch ins Netz gestellt: www.hannes.de.md.

Gruß...
...HanneS...

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.