millis-Funktion stört PWM-Funktion. Warum?

Hallo Leute,
ich arbeite gerade an einem neuen Projekt und möchte bereits von Anfang an
möglichst auf die Delay-Funktion verzichten um das Programm nicht zu stoppen.

Ich bin zwar noch relativ frisch was das Thema Arduino angeht,
doch ich denke die Funktionsweise der millis-Auswertung habe ich durchaus verstanden.

Ziel bei dem Projekt soll es sein, eine 7-Segment-Anzeige anzusteuern und Ziffern anzuzeigen.
Über einen Transistor wird die Helligkeit geregelt, welcher an den gemeinsamen Kathoden angeschlossen ist.
Das ganze funktioniert auch wie vorgesehen, jedenfalls solange ich nicht auf "millis" zugreife.

Ich habe eine kleine Startanimation erstellt, welche noch durch "delay" verzögert wird,
währenddessen funktioniert die Dimmung noch tadellos,
direkt danach nutze ich nur noch millis zur Verzögerung, was dann sofort dazu führt,
dass die Dimmung nicht mehr arbeitet und in voller Helligkeit angezeigt wird. (255)

Ich habe testweise die millis-Funktion mal auskommentiert und per delay verzögert,
dann ist das Problem behoben und die vorgesehene Dimmung bleibt erhalten.
Weiterhin habe ich auch schon den Pin für die Ansteuerung des Transistors geändert,
um von ADC2 auf ADC1 zu wechseln, das hat aber auch nichts gebracht, gleiches Ergebnis.

Ich verwende für das Projekt einen ESP32, der Transistor hängt an GPIO4 und wurde testweise auf GPIO33 verlegt ohne Änderung.

Kann mir vielleicht jemand sagen warum das so ist und wie ich es umgehen kann?

Hier zumindest ein wenig Code der Interessant sein könnte......

// ------- Variablendimensionierung ------------------

bool neuStart = true;                              // System neu gestartet? (Startanimation)
const int startanimationVerzoegerung = 300;        // Wie schnell soll die Startanimation angezeigt werden?

int unsigned long messTimer_Start = 0;              // enthält die millis-Werte zu Beginn der Messung
const int messIntervall = 1000;                      // Auswertung des Gangsignals alle XX Millisekunden
const int helligkeitTag = 255;                      // Helligkeit des Display bei Tag
const int helligkeitNacht = 10;                      // Helligkeit des Display bei Nacht

// --- Pinbelegung 7-Segment-Anzeige---

int segment_a = 23;                                 // Pins als Variablen angelegt (Ganzzahlen)
int segment_b = 22;
int segment_c = 21;
int segment_d = 19;
int segment_e = 18;
int segment_f = 17;
int segment_g = 16;
int segment_dot = 32;

int dimmer = 4;                                     // Transistor für Helligkeitsregelung

//########### Setup ############
void setup() {

  Serial.begin(9600);                               // Seriellen Monitor starten

  // ------- Pins konfigurieren ---------------
  pinMode(segment_a, OUTPUT);
  pinMode(segment_b, OUTPUT);
  pinMode(segment_c, OUTPUT);
  pinMode(segment_d, OUTPUT);
  pinMode(segment_e, OUTPUT);
  pinMode(segment_f, OUTPUT);
  pinMode(segment_g, OUTPUT);
  pinMode(segment_dot, OUTPUT);
  pinMode(dimmer, OUTPUT);
  
}
//########## Beginn Hauptschleife ###########

void loop() {

  analogWrite(dimmer,helligkeitNacht);                 // Helligkeit für Display festlegen
  
  // -------------- Systemneustart ------------

  if (neuStart == true) {                              // Wenn System neu gestartet wurde
    neustartAnimation();                               // Startanimation durchführen
    neuStart = false;                                  // Neustart wurde abgeschlossen
  }

  if (millis() - messTimer_Start >= messIntervall) {

  //   Ansteuerung des Displays........


     messTimer_Start = millis();                   // neuen Startwert für Verzögerung setzen
  }


Bitte den ganzen Code zeigen. Am besten beide Versionen

Hallo,
falls das eiin UNO ist , der pin 4 ist nicht pwm fähig

Es ist ein ESP32, bei dem sollen ja alle OUT-Pins PWM-fähig sein.

Sorry habs gerade gelesen ESP32

da ist das ein Wenig Umfangreicher

hier lesen

Blockzitat[quote="Rentner, post:6, topic:1239109, full:true"]
Sorry habs gerade gelesen ESP32

da ist das ein Wenig Umfangreicher

hier lesen
[/quote]

Vielen Dank für den Link.
Ich werde mir das nochmal genau durchlesen und mein Programm entsprechend umbauen.
Warum funktioniert das dimmen aber anfangs und erst durch Nutzung von millis wird der Code zerballert?
Ich weiß dass der ESP32 kein Standard-Arduino-Board ist und es auch abweichungen bei ADC-Ports gibt was die Messgenauigkeit angeht, aber ist das auch ein Grund dass ich andere Befehle nutzen muss für eine Umsetzung von PWM?

Wie kann das ohne delay funktionieren?

Wie ich im Eröffnungspost schrieb....... während der Startanimation arbeite ich noch mit delay, erst danach soll millis übernehmen und dann funktioniert es nicht mehr wie es soll.

@zahlendreher

PWM bzw. ledcWrite funktioniert mit millis() auf einem ESP32.

mach mal einen vollständigen Sketch mit PWM und einen millis-ablauf und poste einen vollständig kompilierbaren Sketch. Dann kann man sich dein Problem auch ansehen.

Na ja ein ESP32 ist halt ein wenig komplexer, man sollte sich schon an die Doku halten. Es geht hier ja um die Aufbereitung der pwm Signale. Da wird es beim Arduino einiges geben was voreingestellt ist , das muss man beim ESP32 eben händich machen.

So einige andere hier im Forum und ich nutze das auch mit millist zusammen und es klappt.

Fertig ist ein kompletter Sketch.
Meine Frage: in den ersten 5 sekunden ist dimmer auf dem Nacht-Wert, hast du gesagt.
Und danach ?
Wenn dieser Sketch nicht dein Problem zeigt, hast du eben eins eingebaut. :slight_smile:

Vielen Dank für die Zahlreichen Antworten innerhalb kürzester Zeit zu meiner Problematik.
Der Hinweis auf die Funktion "ledcwrite " war die passende Lösung.
Ich habe nun meinen sketch umgestrickt und jetzt funktioniert das auch wie es soll.
der vorgegebene PWM-Wert wird auch nach der Startanimation beibehalten
und auch die Millis-Auswertung funktioniert weiterhin.
Vielen Dank für die Unterstützung.
Auf geht es zur nächsten Herausforderung :slight_smile:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.