Forum: Mikrocontroller und Digitale Elektronik Arduino Blue Pill & 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 Kay L. (kgbrus)


Angehängte Dateien:

Lesenswert?

Hallo und ein frohes neues Jahr,

ich komme mal wieder nicht weiter. Ich benutze einen Arduino BluePill 
also letztendlich einen STM32F103.

Dazu wollte ich ein Lauflicht (Knight Raider) programmieren. Das passt 
soweit auch.
Was nicht passt, ist das Verhalten der PWM Ausgänge.
Also hab ich einen sketch geschrieben der nur die LED´s mittels PWM 
Heller und Dunkler macht. Dieser anbei.
Das Lauflicht verhält sich so:
https://youtu.be/yAkn36FYmO8

Also LED 3,6,7 gehen nicht an LED 9 & 10 Blinken hin und her bei jedem 
Durchlauf.

Ersetzte ich im Sketch den analogWrite Befehl mit digitalWrite und 
ändere die Werte 150 auf HIGH und 0 auf LOW funktioniert es wie es soll. 
Es muß also an der PWM liegen.

Hat dazu jemand eine Idee?

Gruß

Kay

von Wastl (hartundweichware)


Lesenswert?

Kay L. schrieb:
> Hat dazu jemand eine Idee?

- Lerne was PWM bedeuted. In deiner "Source" kann ich
keine PWM Programmierung erkennen. Nur einfache analog
Write Operationen. PWM hat was mit Timern zu tun mit
denen man Signale länger oder kürzer machen kann.

- Man kann nicht einfach jeden Pin analog betreiben.

von Monk (roehrmond)


Lesenswert?

Wastl schrieb:
> In deiner "Source" kann ich keine PWM Programmierung erkennen.
> Nur einfache analog Write Operationen.

Genau diese benutzen Timer im PWM Modus.

> Lerne was PWM bedeuted

lerne Arduino kennen, bevor zu unpassende Antworten dazu gibst.

von J. S. (jojos)


Lesenswert?

Laut Pinout für das Bluepill sollen PA2, PA9 und PA10 funktionieren. 
PA9/10 sind aber voreingestellt für Serial benutzt, eventuell muss man 
die mit setRx/setTx erst auf einen anderen Serial Pin umbiegen.
https://github.com/stm32duino/Arduino_Core_STM32/wiki/API
Warum PA2 nicht geht sehe ich auf die Schnelle nicht.

von Monk (roehrmond)


Lesenswert?

Ich sehe auch auf Anhieb keinen Grund, warum die anderen Pins (außer 
PA9/10) nicht funktionieren.

Ist das Board mit einem original STM32F103 bestückt? Die Fakes haben 
sich ja schon oft als nur teilweise funktionierend herausgestellt.

von M. K. (sylaina)


Lesenswert?

Wastl schrieb:
> Kay L. schrieb:
>> Hat dazu jemand eine Idee?
>
> - Lerne was PWM bedeuted. In deiner "Source" kann ich
> keine PWM Programmierung erkennen. Nur einfache analog
> Write Operationen. PWM hat was mit Timern zu tun mit
> denen man Signale länger oder kürzer machen kann.
>
> - Man kann nicht einfach jeden Pin analog betreiben.

Kreuze an:

[ ] Du weißt was Ardiuno ist und wie es funktioniert?
[ ] Arduino? Ich fahr BMW.
[ ] Ich kenne nur Adriano, der Sack schuldet mir noch 50 Euro!

von Kay L. (kgbrus)


Lesenswert?

Bis hierhin erstmal vielen Dank für die hilfreichen Antworten.

Das wichtigste ist das ich keinen Programierfehler gemacht habe. Ist bei 
dem Pipicode zwar fast nicht möglich aber ab und zu sieht man den Fehler 
einfach nicht.
Laut Analyser ist an den nicht funktionierenden Pin auch kein PWM zu 
messen.

Ich denke das die PA9/PA10 Seriell Geschichte am blinken schuld ist.
Das es viele Fake STMs gibt weiß ich. Zumindest haben die das ST Logo 
aufgedruckt, die die ich schon mal hatte hatten das nicht.
Da die aber aus meiner letzten Bestellung sind könnte das eine Ursache 
sein. Ich hab mir deshalb mal einen anderen genommen den ich gerade 
Griffbereit hatte. Zur weiteren Info der aktuelle (also der aus dem 
Video) ist ein C8. Ich muss schauen ob ich noch einen anderen, nicht aus 
dieser Lieferung stammenden, C8 habe. Einen C6 hab ich gerade probiert, 
der verhält sich für den Pin PA2 anders, (der funktioniert beim C6) PA7 
und PA8 funktionieren bei beiden nicht, auch Blinken bei PA9& 10 ist 
gleich.

Vielleicht hat ja noch jemand die zündende Idee?

ich versuche am WE aber mal eine komplette Schaltung mit ULN2003, damit 
ich alle LED gleichzeitig schalten kann.

Gruß

Kay

: Bearbeitet durch User
von Sven B. (mainframeosx)


Lesenswert?

Schau mal in der Pinbelegung vom Blue Pill, nicht alle Pins können PWM, 
es gibt auch Pins die nicht 5Volt tollerant sind, habe auch gerade die 
Blue Pill und betreibe die am Arduino IDE.

Wenn du das ganze einfacher halten willst, dann nutze die NEOPIXEL. Ist 
dann auch etwas einfacher zu händeln als die LED's einzeln zu schalten.

von Kay L. (kgbrus)


Lesenswert?

Ja nicht alle PIns können das die von mir im Sketch genutzten sind aber 
laut DB PWM fähig.

Ob Neopixel einfacher ist kann ich nicht beurteilen. Aber 15LED in einer 
Reihenfolge also knight rider zu programmieren ist nun auch kein 
Hexenwerk. Geht mit ner state Maschine und analogWrite ganz einfach. 
Mein Sketch funktioniert ja auch. Nur die Ausgänge spinnen. ich hab mit 
meiner State Maschine den gleichen Effekt (das x LED nicht leuchten) wie 
mit dem angehängten Sketch.

von Kay L. (kgbrus)


Lesenswert?

So ich hab folgendes gemacht:

Alle funktionierenden LED´s auskommentiert.
Somit bleiben nur noch PA2 PA7 PA8 PA9 und PA 10 übrig.
Ergebnis:
PA2 leuchtet weiterhin nicht
PA7 Blinkt einmal auf nur im ersten Durchlauf, danach nicht mehr
PA8 leuchtet nicht
PA9 blinkt wie gewünscht
PA10 blinkt wie gewünscht

nächster Versuch:
PA 9 und PA 10 ebenfalls auskommentiert
Ergebnis:
PA2 leuchtet nicht
PA7 Blinkt wie gewünscht
PA8 leuchtet nicht

nächster Versuch
PA7 auch auskommentiert ( also nur Noch PA2 und PA8 werden angesteuert)
Ergebnis:
PA2 leuchtet nicht
PA8 blinkt wie gewünscht

letzter versuch
bis auf PA2 alles auskommentiert
Ergebnis:
keine LED blinkt

somit folgendes seltsame Fazit:
PA2 funktioniert gar nicht
PA9 und 10 funktionieren nur wenn nicht alle PWM Ausgänge genutzt werden
PA7 und PA8 funktionieren anscheinend nur allein

seltsam.....

: Bearbeitet durch User
von Michael M. (michael89)


Lesenswert?

Hey,

kenn mich mit den BluePill nicht aus, aber beim esp32 zum Beispiel gibt 
es mehre Channels für PWM. Da muss man den Pin ein Channel zuweisen und 
dann kann man den Channel ändern, wenn man Änderung am Pin haben will.

//Als Ausgang deklarieren
pinMode(L1_rot_pin,OUTPUT);

// Stellt Channel Frequenz und Resolution pro Channel ein
ledcSetup(L1_red_channel, freq, resolution);

// Channel wird mit Pin verbunden
ledcAttachPin(L1._red_pin  , L1_red_channel);

// setzt duty
ledcWrite(L1_red_channel, l->red_value_scaled);

evtl. bekommt das Arduino Framework das nicht ordentlich hin den 
richtigen Channel den Pin zuordnen. Würde mal gucken ob das STM-Layer 
sone Funktionen anbietet und es damit nochmal Versuchen.

Gruß
Michael

von Kay L. (kgbrus)


Lesenswert?

Hallo zusammen,

ich habe ein wenig weiter gemacht, wenn ich PA8, PA10 und PB0 
auskommentiere scheinen die anderen zu funktionieren.

Aber nur bis zu dem Moment wo ich analogWrite einen Wert von kleiner als 
128 zuweise, dann leuchten  PB6, PB7, PB8 und PB9 nicht mehr.

Da ich mir der "fakes" bewusst bin hab ich aus jeder Bestellung einen 
Blue Pill zum testen gelassen. alle verhalten sich gleich. Da ich die 
bei verschiedenen Lieferanten bestellt habe, werden wohl nicht alle 
gefaket sein.

Gruß

Kay

von Monk (roehrmond)


Lesenswert?

Ich nehme an, dass du den Arduino Core von STM verwendest.

Versuche mal zum Vergleich den alten Core von Roger Clarks. Vielleicht 
verhält sich dieser anders.
http://stefanfrings.de/stm32/stm32f1.html#roger

von Kay L. (kgbrus)


Lesenswert?

Vielen Dank und sorry, das ich jetzt erst antworte.

ja ich nutze den von STM, das Problem bei dem Core von Roger Clarks ist, 
das dabei CAN nicht funktioniert. Ich nutze aber CAN zum Austausch 
zwischen den einzelnen Arduinos.

Gruß

kay

von Kay L. (kgbrus)


Lesenswert?

Noch eine Zusatz Info:

bei meinen Tests habe ich festgestellt das die Pins PB6 bis PB9 mit 
Werten kleiner 128 nicht arbeiten. Das bedeutet die LED ist bei Wert 128 
noch an, ab 127 und darunter aber bereits aus. Im Gegensatz zu den 
anderen Pins, die sich schön bis 0 runterdimmen lassen.

Somit ist der aktuelle Stand, das ich von 15 als PWM fähig deklarierten 
Pin nur 8 vollwertig (incl Dimmen) gleichzeitig nutzen, das ist nicht 
wirklich zufrieden stellend.

Gruß

Kay

von N. M. (mani)


Lesenswert?

Kay L. schrieb:
> das Problem bei dem Core von Roger Clarks ist, das dabei CAN nicht
> funktioniert. Ich nutze aber CAN zum Austausch zwischen den einzelnen
> Arduinos.

Aber nicht in oben stehenden Code. Also wäre es trotzdem ein Versuch 
wert um den den Arduino Core als Fehlerquelle auszuschließen.

von Kay L. (kgbrus)


Lesenswert?

Da hast Du natürlich recht. ich probiere das die Tage mal aus und melde 
mich wieder

danke

: Bearbeitet durch User
von Kurt (kurtcontroller)


Lesenswert?

Bei mir blinkt es!
Siehe unten analogWrite
1
const int LED3 = PA2;
2
unsigned long Delay = 500;
3
4
// the setup function runs once when you press reset or power the board
5
void setup() {
6
  // initialize digital pin LED_BUILTIN as an output.
7
  pinMode(LED3, OUTPUT);
8
}
9
10
void loop() {
11
analogWrite(LED3, 255); // 150 Nicht 255 OK 
12
delay(Delay);
13
analogWrite(LED3, 0);
14
delay(Delay);
15
}

[Mod: C-Tags eingefügt]

: Bearbeitet durch Moderator
von Kay L. (kgbrus)


Lesenswert?

Ja, den Fehler bei PA2 habe ich gefunden, dies war eine kalte Lötstelle.

Das ist der aktuelle Stand
1
const int LED1 = PA0;
2
const int LED2 = PA1;
3
const int LED3 = PA2;
4
const int LED4 = PA3;
5
const int LED5 = PA6;
6
7
const int LED6 = PA7;
8
const int LED7 = PA8; // Auskommentiert da nicht funktioniert
9
const int LED8 = PA9;
10
const int LED9 = PA10; // Auskommentiert da nicht funktioniert
11
const int LED10 = PB0; // Auskommentiert da nicht funktioniert
12
13
const int LED11 = PB1;
14
const int LED12 = PB6; // Funktioniert bei analogWrite kleiner als 128 nicht mehr
15
const int LED13 = PB7; // Funktioniert bei analogWrite kleiner als 128 nicht mehr
16
const int LED14 = PB8; // Funktioniert bei analogWrite kleiner als 128 nicht mehr
17
const int LED15 = PB9; // Funktioniert bei analogWrite kleiner als 128 nicht mehr

[Mod: C-Tags eingefügt]

: Bearbeitet durch Moderator
von N. M. (mani)


Lesenswert?

Kay L. schrieb:
> Das ist der aktuelle Stand

Ist es wirklich so schwierig die Code Tags zu verwenden?
So will das doch keiner lesen!

von Kay L. (kgbrus)


Lesenswert?

Es ging ja nicht um den Code es soll nur eine Aufstellung sein welcher 
Pin funktioniert und welcher nicht.

Aber damit sich keiner überanstrengt beim lesen:

Das ist der aktuelle Stand:
1
PA0 - funktioniert
2
PA1 - funktioniert
3
PA2 - funktioniert
4
PA3 - funktioniert
5
PA6 - funktioniert
6
PA7 - funktioniert
7
PA8 - funktioniert nicht
8
PA9 - funktioniert
9
PA10 - funktioniert nicht
10
PB0 - funktioniert
11
PB1 - funktioniert
12
PB6 - Funktioniert bei analogWrite kleiner als 128 nicht mehr
13
PB7 - Funktioniert bei analogWrite kleiner als 128 nicht mehr
14
PB8 - Funktioniert bei analogWrite kleiner als 128 nicht mehr
15
PB9 - Funktioniert bei analogWrite kleiner als 128 nicht mehr

Ich hoffe, das hilft dir und Du hast auch eine Idee zu meiner Frage?

Gruß

Kay

[Mod: Code-Tags eingefügt]

: Bearbeitet durch Moderator
von Ron-Hardy G. (ron-hardy)


Lesenswert?

vielleicht deswegen? Je nachdem was der Pin kann.
https://github.com/stm32duino/Arduino_Core_STM32/wiki/API#analog

- True analog output when using on pins with DAC capabilities and if 
HAL_DAC_MODULE_ENABLED is defined
- PWM on pins with timer (TIM) capabilities.
- GPIO toggling HIGH/LOW depending on requested value: HIGH if > 127 
else LOW

von Frank M. (ukw) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

Kay L. schrieb:
> Aber damit sich keiner überanstrengt beim lesen:

Weder das eine noch das andere Posting ist im Mobilmodus lesbar, siehe 
Screenshots 1.png und 2.png.

EDIT:

Ich habe jetzt beide Deiner Postings mit Code- bzw. C-Tags 
nachbearbeitet. Ergebnis siehe Bild 3.png. Sieht etwas besser aus, oder?

: Bearbeitet durch Moderator
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.