Forum: Mikrocontroller und Digitale Elektronik (AVR) Attiny85 PWM


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Jo (jo12345)


Lesenswert?

Heyy,
ich arbeite jetzt schon länger an einem Projekt und bin nun auf weitere 
Probleme gestoßen, die ich jetzt schon seit mehreren Wochen nicht lösen 
kann. Ich habe mir selber eine Platine erstellt, auf der ich einen 
Attiny85 20SU 
(https://www.reichelt.de/8-bit-attiny-avr-risc-mikrocontroller-8-kb-20-mhz-so-8-attiny-85-20-su-p69300.html?&trstct=pos_1&nbc=1) 
habe. Er und die ganze Platine werden von einem LiPo-Akku (3.7V | 
130mAh) betrieben. Unteranderem ist an dem Ausgang PB1 ein Mosfet 
angeschlossen (AO3400A) und an diesem ein kleiner Modellbaumotor 
(0.5V-4V). Nun wollte ich den Motor zum laufen bringen, heißt ihn 
beschleunigen, bremsen und auf einer gewünschten Geschwindigkeit fahren 
lassen. Damit er für meine Anwendungen geeignet ist, will ich den Motor 
aber nicht mit vollen 3.7V laufen lassen, sonder mit so 1.5V-2V damit er 
nicht zu schnell läuft. Nun hatte es aber nach vielen Versuchen nicht 
geklappt, den Motor irgendwie langsamer laufen zu lassen. Ich kenne mich 
nicht soo gut aus mit der Programmierung solche Microcontroller, aber 
ich mache es über einen ISP-Header und einen Arduino Uno. Ich hab schon 
viele Codes versucht die ich mir von KI's ausspucken habe lassen, jedoch 
keine hat Erfolg gezeigt. Ich habe schon alle Verkabelungen überprüft 
und wenn ich den Motor mit digitalWrite ansteuere funktioniert es auch 
einwandfrei.
Ich freue mich seeehr über Kommentare und Hilfestellungen, jetzt schon 
mal Danke, ich verzweifle hier wirklich D:
Mit Freundlichen Grüßen Jo

von Mario M. (thelonging)


Lesenswert?

AnalogWrite ist Dein Freund. Freilaufdiode am Motor nicht vergessen.

von Jo (jo12345)


Lesenswert?

Ich hatte es schon versucht, jedoch ohne Freilaufdiode, kann dass das 
Verhalten so stark einschränken, dass der Motor dann trotz 
analogWrite(100) mit voller Leistung fährt?

von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

Jo schrieb:
> dass der Motor dann trotz
> analogWrite(100) mit voller Leistung fährt?

Nicht jeder Pin kann Hardware PWM.

von Jo (jo12345)


Lesenswert?

Ja, ich meine aber der Pin PB1 kann das.

von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

Du hast Wahr!

von Andreas B. (bitverdreher)


Lesenswert?

Jo schrieb:
> Ich hatte es schon versucht, jedoch ohne Freilaufdiode,

Deshalb ist der MosFet vermutlich schon durchlegiert.

: Bearbeitet durch User
von Jo (jo12345)


Angehängte Dateien:

Lesenswert?

So ich habe nun eine Freilaufdiode eingebaut und das Mosfet nochmals 
ausgetauscht. Dann habe ich den angehängten Code hochgeladen, es gab 
keine Fehlermeldung. Als ich dann die Platine über den Akku "anmachte", 
lief der Motor gar nicht flüssig, sondern er springt immer so nach 
vorne.

von Falk B. (falk)


Lesenswert?

Jo schrieb:
> ich arbeite jetzt schon länger an einem Projekt und bin nun auf weitere
> Probleme gestoßen, die ich jetzt schon seit mehreren Wochen nicht lösen
> kann. Ich habe mir selber eine Platine erstellt, auf der ich einen
> Attiny85 20SU
> 
(https://www.reichelt.de/8-bit-attiny-avr-risc-mikrocontroller-8-kb-20-mhz-so-8-attiny-85-20-su-p69300.html?&trstct=pos_1&nbc=1)
> habe. Er und die ganze Platine werden von einem LiPo-Akku (3.7V |
> 130mAh) betrieben.

Der Controller läuft mit 3,3V, aber nur wenige MOSFETs. Die müssen für 
3,3V oder weniger Ansteuerspannung spezifiziert sein.

https://www.mikrocontroller.net/articles/FET#Gate-Source_Threshold_Voltage

> Unteranderem ist an dem Ausgang PB1 ein Mosfet
> angeschlossen (AO3400A)

OK, der kann das.

> (0.5V-4V). Nun wollte ich den Motor zum laufen bringen, heißt ihn
> beschleunigen, bremsen und auf einer gewünschten Geschwindigkeit fahren
> lassen. Damit er für meine Anwendungen geeignet ist, will ich den Motor
> aber nicht mit vollen 3.7V laufen lassen, sonder mit so 1.5V-2V damit er
> nicht zu schnell läuft.

Das macht PWM.

> keine hat Erfolg gezeigt. Ich habe schon alle Verkabelungen überprüft
> und wenn ich den Motor mit digitalWrite ansteuere funktioniert es auch
> einwandfrei.

Schon mal gut.

von Monk (roehrmond)


Lesenswert?

Im Programmcode fällt mir auf dze Schnelle kein Problem auf. Zeige mal 
deinen Schaltplan und Fotos vom Aufbau.

von Falk B. (falk)


Angehängte Dateien:

Lesenswert?

Jo schrieb:
> So ich habe nun eine Freilaufdiode eingebaut und das Mosfet nochmals
> ausgetauscht. Dann habe ich den angehängten Code hochgeladen, es gab
> keine Fehlermeldung. Als ich dann die Platine über den Akku "anmachte",
> lief der Motor gar nicht flüssig, sondern er springt immer so nach
> vorne.

Ich glaube der Fehler liegt hier.

const int pwmPin = PB1;  // Der Pin, der per PWM gesteuert wird

Das ist falsch. Du muss die Pinnummer nach Arduino-Zählweise angeben, 
siehe Anhang. PB1 ist der Name aus dem Microchipdatenblatt. Also so.

const int pwmPin = 1;  // Der Pin, der per PWM gesteuert wird

Die Arduino-Pinnummern sind hellblau.

von Jo (jo12345)


Angehängte Dateien:

Lesenswert?

Das ist ein Bild vom Aufbau der Platine. Die Testpoints sind alles 
Lötpins auf der Platine, wo dann entsprechend Bauteile dran gelötet 
wurden. Die Diode komplett ignorieren, die wurde nicht eingebaut, da sie 
komplett falsch verkabelt wurde, ich hab sie jetzt im nachhinein mit 
zwei Kabel an den Motor gelötet. Und das Mosfet hat sich auch verändert, 
ist das AO3400A, wie oben beschrieben. Und ich habe die beiden Pins PB0 
und PB1 per Kabel vertauscht auf die Platine gelötet. Also alle 
Anschlüsse die hier im Schaubild an PB0 angeschlossen sind, sind an PB1 
angeschlossen und umgekehrt, deshalb habe ich auch MISO und MOSI am 
ISP-Header umdrehen müssen. Ansonsten sollte das eigentlich so umgesetzt 
worden sein.

von Jo (jo12345)


Lesenswert?

Falk B. schrieb:
> const int pwmPin = 1;  // Der Pin, der per PWM gesteuert wird
Ich probiere es mal kurz

von Falk B. (falk)


Lesenswert?

Jo schrieb:
> Das ist ein Bild vom Aufbau der Platine.

Nö, das ist ein absolut übersichtlicher Schaltplan.

Schaltplan richtig zeichnen

Und nach deinem Schaltplan hängt der MOSFET an PB0 und NICHT PB1, wie es 
im Quelltext steht!

> ist das AO3400A, wie oben beschrieben. Und ich habe die beiden Pins PB0
> und PB1 per Kabel vertauscht auf die Platine gelötet.

Klasse, so macht ein Schaltplan Spaß!

von Monk (roehrmond)


Lesenswert?

Es fehlen Freilaufdiode, Abblock-Kondensatoren und Pull-Down Widerstand.

Nach deinem Text hast du ALLES anders gemacht, als der Plan zeigt. Ich 
hoffe dir wird selbst klar, wie nutzlos dieser Plan dadurch ist.

Wo sind die Fotos von Aufbau?

: Bearbeitet durch User
von Jo (jo12345)


Angehängte Dateien:

Lesenswert?

Hier nochmal der neue Plan, in wie Fern bringen Bilder von der Platine 
etwas? Dort sind ja nur die Bauteile draufgelötet und viele Kabel die 
von der Platine weg gehen.
> const int pwmPin = 1;  // Der Pin, der per PWM gesteuert wird
hat nichts verändert.

von Monk (roehrmond)


Lesenswert?

Jo schrieb:
> in wie Fern bringen Bilder von der Platine etwas?

Dort sieht man häufig Fehler, die der Plan nicht zeigt.

Dein Schaltplan ist immer noch kaum lesbar. Da du mit der Software nicht 
zurecht kommst:  nimm Stift und Papier!

von Monk (roehrmond)


Lesenswert?

Falk B. schrieb:
> Du muss die Pinnummer nach Arduino-Zählweise angeben, siehe Anhang. PB1
> ist der Name aus dem Microchipdatenblatt

Das ist prinzipiell richtig. In diesem konkreten Fall macht das aber 
keinen Unterschied, weil PB1=1 ist.

von Jo (jo12345)


Lesenswert?

Ich frage mich halt, in wie Fern der Fehler auf der Platine liegen kann, 
wenn doch mit digitalWrite alles funktioniert?

von Monk (roehrmond)


Lesenswert?

Die 1N4148 kommt mir für einen Motor recht schwach vor.

von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

Falk B. schrieb:
> Die Arduino-Pinnummern sind hellblau.

Dann: Glücklicher Weise hat PB1 den Wert 1.
Ist also "hier" egal.

Jo schrieb:
> der neue Plan

Abblockkondensator fehlt.
Stützkondensator fehlt

von Monk (roehrmond)


Lesenswert?

Jo schrieb:
> Ich frage mich halt, in wie Fern der Fehler auf der Platine liegen kann,
> wenn doch mit digitalWrite alles funktioniert?

Zeige Bilder, dann wird sich das aufklären. Du siehst den Fehler nicht, 
weil du denkst, dort kann er nicht sein. So ist es jedenfalls oft.

Es fehlen immer noch Abblock-Kondensatoren. Schraube mal deinen PC auf 
und zähle dessen Kondensatoren. Denkst du, die sind da nur zur 
Dekoration drin?

: Bearbeitet durch User
von Jo (jo12345)


Angehängte Dateien:

Lesenswert?

Hier noch ein Bild. Also nur erste Testversionen, an denen viel 
verändert werden musste.
Und nur kurz als Anmerkung, ich finde diesen befehlshaberischen Ton 
unangebracht, ich kenne mich hier in diesem Gebiet nicht gut aus und 
Versuche hier meine Probleme zu lösen und da finde ich solche Kommentare 
einfach nicht angepasst. Wir sind alles Menschen die noch was lernen 
können und auch Fehler machen ;D

von Falk B. (falk)


Lesenswert?

Monk schrieb:
> Das ist prinzipiell richtig. In diesem konkreten Fall macht das aber
> keinen Unterschied, weil PB1=1 ist.

Zufall! Bei anden anderen Pins funktioniert das nicht mehr!

von Monk (roehrmond)


Lesenswert?

Die Drähte kommen mir arg dünn vor. In Kombination mit den fehlenden 
Abblock-Kondensatoren scheitert es wohl an instabiler Stromversorgung.

von Christian S. (roehrenvorheizer)


Lesenswert?

Jo schrieb:
> ich finde diesen befehlshabbärischen Ton
> unangebracht,

Hallo,

da magst du Recht haben, solche Entgleisungen passieren nur allzu 
leicht.

mfg

von Jo (jo12345)


Lesenswert?

Monk schrieb:
> Die Drähte kommen mir arg dünn vor. In Kombination mit den fehlenden
> Abblock-Kondensatoren scheitert es wohl an instabiler Stromversorgung.

Sollten da 100 nF reichen? Gibt es sonst noch Spezifikationen auf die 
ich achten sollte? Hast Du vielleicht einen Link zu einem passendem?

von Falk B. (falk)


Lesenswert?

Jo schrieb:
>> Die Drähte kommen mir arg dünn vor. In Kombination mit den fehlenden
>> Abblock-Kondensatoren scheitert es wohl an instabiler Stromversorgung.
>
> Sollten da 100 nF reichen?

Den brauchst du auf jeden FALL!!! Der war hoffentlich schon auf dem 
Board. Warum hast du ihn entfernt? Bei dem Motor braucht man nochmal um 
die 5-10uF als Elko, Tantal oder Aluminium.

> Gibt es sonst noch Spezifikationen auf die
> ich achten sollte? Hast Du vielleicht einen Link zu einem passendem?

100nF Keramikondensatoren mit 25V gibt es wie Sand am Meer!
Dito Elkos!

von Falk B. (falk)


Angehängte Dateien:

Lesenswert?

Jo schrieb:
> Screenshot__128_.png
>
>             2,7 MB

Lies mal was über Bildformate.

Siehe Anhang, Faktor 20! kleiner!

von Monk (roehrmond)


Lesenswert?

Jo schrieb:
> Sollten da 100 nF reichen?

100uF + 100nF an VCC/GND vom Mikrocontroller.

Außerdem würde ich mit einem Oszilloskop prüfen, ob Akku und Leitungen 
ausreichend belastbar sind.

Dein sogenannter "Spannungsregulator" ist falsch beschriftet. Das IC 
überwacht die Spannung nur, es regelt sie nicht.

von Jo (jo12345)


Lesenswert?

Okay, danke euch, dann werde ich mal weiter probieren, ich habe leider 
gerade keine Kondensatoren da…

von Oliver D. (flenky)


Lesenswert?

Du hast zwischen dem Pin des MCU und dem Gate des MOSFETs einen 330Ohm 
Widerstand vorgesehen. Damit verhinderst du, dass der MCU durch einen zu 
hohen Strom überlastet wird - das ist gut. ABER, ein schnelles 
Umschalten des MOSFETs wird die mit ein paar Milliampere Gatestrom nicht 
gelingen. Für eine PWM solltest du m.E. schon einen MOSFET Treiber vor 
das Gate schalten - entweder als IC oder diskret mit einzelnen 
Bipolar-PNP und NPN.

von Falk B. (falk)


Lesenswert?

Oliver D. schrieb:
> Du hast zwischen dem Pin des MCU und dem Gate des MOSFETs einen 330Ohm
> Widerstand vorgesehen. Damit verhinderst du, dass der MCU durch einen zu
> hohen Strom überlastet wird - das ist gut.

Aber überflüssig.

> ABER, ein schnelles
> Umschalten des MOSFETs wird die mit ein paar Milliampere Gatestrom nicht
> gelingen. Für eine PWM solltest du m.E. schon einen MOSFET Treiber vor
> das Gate schalten - entweder als IC oder diskret mit einzelnen
> Bipolar-PNP und NPN.

Ebenfalls überflüssig. Die Standard-PWM beim Arduino sind 480Hz, sehr 
langsam. Aber selbst mit deutlich höheren Frequenzen kommt man ohne 
Gatettreiber aus.

Beitrag "Re: Transistor, 1A, 4MHz Schaltfrequenz"

Ok, bei 3,3V sind die Ausgänge vom AVR hochohmiger, aber für 480 Hz 
reicht es locker.

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.