Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
light_dim [2020/01/06 18:00]
huwi [Test]
light_dim [2020/01/21 10:51] (aktuell)
huwi [Realisierung]
Zeile 1: Zeile 1:
 ====== Einen LED auf dem mySTM32 light Board dimmen ====== ====== Einen LED auf dem mySTM32 light Board dimmen ======
-...+Pulsweitenmodulation PWM ist eine wichtige Technik zum Erzeugen von Pseudo-AnalogwertenEs ist mit verhältnismäßig geringem Aufwand, zum Beispiel mit einem RC-Glied, auch möglich aus diesem Signal echte Analogwerte zu erzeugenMeist ist das jedoch gar nicht notwendig, wie wir an diesem Beispiel im wahrsten Sinne der Wortes **sehen** werden. Eigentlich müsste man sagen **nicht sehen** werden. Unser Auge wird nicht die einzelnen Impulse wahrnehmen aus denen das PWM-Signal besteht. Anwendung findet PWM nicht nur beim Ansteuern von LEDs sondern auch bei einfache Gleichstrommotoren,​ Schrittmotoren,​ Servomotoren,​ Wechselrichtern,​ Elektroheizungen,​ Magnetventilen,​ usw.. Die Liste der möglichen Anwendungsfälle ist recht lang. Deshalb haben auch alle modernen Mikrocontroller die Möglichkeit PWM-Signale mit Hardwarebausteinen generieren zu lassen. Prädestiniert für diese Aufgabe sind Timer
  
 ===== Die Aufgabe ===== ===== Die Aufgabe =====
-{{ :​anwendersichtleddim.jpg?​nolink&​400|}}Es ist eine Mikrocontrolleranwendung zu entwickeln, bei der ... +{{ :​anwendersichtleddim.jpg?​nolink&​400|}}Es ist eine Mikrocontrolleranwendung zu entwickeln, bei der eine LED für das menschliche Auge sanft auf und abblendet.
- +
-**Die Aufgabe lautet:**\\ //Der Anwender soll sehen, dass der Mikrocontroller funktioniert. Entwickeln Sie dafür ​eine Lösung die den Status des Mikrocontrollers durch blinken einer LED anzeigt. Diese StausLED soll an Port B0 angeschlossen werden.//+
  
 +**Anforderungen:​**\\ ​
 +  * die PWM-Frequenz muss flimmerfrei sein
 +  * das Auf- und Abblenden der LED soll gut wahrnehmbar sein
 +  * das Auf- und Abblenden kann auch nicht-liniear erfolgen
  
 ===== Vorbereitung ===== ===== Vorbereitung =====
Zeile 22: Zeile 24:
  
 ===== Lösungsansatz ===== ===== Lösungsansatz =====
-Die Aufgabe besteht darin ...+Die Aufgabe besteht darin eine LED für das menschliche Auge sanft Auf- und AbzublendenDazu soll ein entsprechendes PWM-Signal generiert werdenPWM ist kein analoges sondern ein digitales Signal in Form einer schnelle Folge von Impulsen mit unterschiedlicher Breiten. Jeder Impuls entspricht immer der gesamten verfügbare Spannung in unserem Fall 3,3V die Pausen zwischen den Impulsen sind 0V. Das Verhältnis zwischen High und Low ergibt die gewünschte Effektivspannung
  
-...+{{:pwm.png?​nolink&​1100|}}
  
-**__MERKE:​__ ​Systembaustein ​xxx**\\ +In faktisch allen modernen Mikrocontrollern haben Timer die Fähigkeit ein oder mehrere PWM-Signale zu erzeugen. Dazu muss der Entwickler der Hardware sich über die möglichen Timer, PWM-Kanäle und Pinbelegungen im Datenblatt informieren. Hardware-PWM ist nicht an jedem beliebigen Pin möglich. Wir können dazu die [[http://​shop.myavr.de/​index.php?​ws=download_file.ws.php&​dlid=314&​filename=produkte-mystm/​mystm32-board-light/​RK_mySTM32_light_de_en_2019-12.pdf|mySTM32 light Referenzkarte]] nutzen. 
 + 
 +{{::​tim3ch3b0.png?​nolink&​700|}} 
 + 
 +Für das Pin B0 ergibt sich die Möglichkeit TIMER 3 Channel 3 zu nutzen. Im PEC Framework steht uns der Bibliotheksbaustein PecPwmChannel zur Verfügung. Dieser Baustein hat alle nötigen Merkmale um unsere LED zu dimmen. 
 + 
 +{{:​stm32light:​pecpwmchannel.png?​direct&​400|}} 
 + 
 +Damit ergibt sich folgender Grobentwurf.  
 + 
 +{{:​stm32light:​grobpwm.png?​nolink&​600|}} 
 + 
 +Die konkrete Hardwareanbindung Timer3, Channel3, PinB0 muss in der Realisierung erfolgen. 
 + 
 +{{:​stm32light:​t3c3b0.png?​nolink&​160|}} 
 + 
 + 
 +**__MERKE:​__ ​PWM Timer + Channel + Pin**\\ 
  
  
Zeile 36: Zeile 55:
 ... ...
  
-{{ :​stm32light:​stml008a.png?​direct&​300|}}+{{ :​stm32light:​stml011a.png?​direct&​300|}}
 >​Controller::​onStart():​void <code c> >​Controller::​onStart():​void <code c>
 // boot sequence after start SysTick // boot sequence after start SysTick
-pwm.configHz(10000); +// Initialisierung PWM Channel 
-pwm.setDuty(100);+// startet Timer mit gewünschter PWM Frequenz 
 +pwm.configHz(1000);
 </​code>​ </​code>​
  
 ... ...
  
-{{ :​stm32light:​stml008b.png?​direct&​300|}}+{{ :​stm32light:​stml011b.png?​direct&​300|}}
 >​Controller::​onWork():​void <code c> >​Controller::​onWork():​void <code c>
-if(newDuty)+duty++; 
 +if (duty>​=1000)
 { {
- newDuty = false; +    ​duty=0;
- pwm.setDuty(duty);+
 } }
 +pwm.setDuty(duty);​
 +waitMs(1);
 </​code>​ </​code>​
  
-{{ :​stm32light:​stml008b.png?​direct&​300|}} +... 
->​Controller::​onTimer10ms():void <code c> + 
-duty+=dir+{{ :​stm32light:​stml011c.png?​direct&​300|}} 
-if(duty==0 || duty>=1000) +>​Controller::​onWork():void <code c> 
- dir*=-1+duty++
-newDuty=true;+if (duty<1000) { 
 +    ​pwm.setDuty(duty);​ 
 +
 +else if (duty<​2000) { 
 +    pwm.setDuty(2000-duty)
 +
 +else { 
 +    duty=0; 
 +
 +waitMs(1);
 </​code>​ </​code>​
  
 ... ...
 +
 +>​Controller::​onWork():​void <code c>
 +//​---------------------------------------------------------------
 +// atmende LED mit Exponentialfunktion pwm 0-1000 #include math.h
 +duty++;
 +if      (duty<​1000) pwm.setDuty( pow(1.00693,​duty) );
 +else if (duty<​2000) pwm.setDuty( pow(1.00693,​2000-duty) );
 +else                duty=0;
 +waitMs(1);
 +</​code>​
  
 ... ...
Zeile 76: Zeile 117:
 ====== Videozusammenfassung ====== ====== Videozusammenfassung ======
 Erlernte und gefestigte Arbeitsschritte:​ Erlernte und gefestigte Arbeitsschritte:​
-  ​- ...+ 
 +  ​Klassendiagramm anlegen und öffnen 
 +  - Diagrammvorlage für PEC Applikation auswählen, laden und Treiberpaket für STM32F4 einfügen 
 +  - Navigator auf UML Pakete umschalten 
 +  - gewünschte Klassen im Explorer/​Navigator suchen und ins Diagramm ziehen 
 +  - Klassen aggregieren 
 +  - Operationen einer Klasse anlegen 
 +  - Klassen und Templates zu Komponenten zusammenbauen 
 +  - den nötigen Quellcode in den Operationen erstellen 
 +  - Erstellen und Brennen einer ARM Applikation im Klassendiagramm 
 +  - **das SiSy-Controlcenter konfigurieren und anwenden** 
 + 
 +Und hier diesen Abschnitt wiederum als Videozusammenfassung. 
 + 
 +<<<<​ ACHTUNG VERALTETES VIDEO >>>>​  
 + 
 +<​html><​iframe width="​640"​ height="​400"​ src="​https://​www.youtube.com/​embed/​d_MV0dplWgI"​ frameborder="​0"​ allowfullscreen></​iframe></​html>​
  
 ====== Übung ====== ====== Übung ======