Hits: 10043

...die Alternative, wenn nichts anderes mehr bleibt

ELSE 

Nach den Erfahrungen mit den Pro-Control-Reparaturen habe ich den Entschluß gefasst, selbst ein paar Platinen zu machen - so einfach wie möglich. Unbedingt erforderlich ist im Prinzip eine CPU und einige Schaltmodule. Zuerst wollte ich Lowside-Treiber nehmen. Allerdings fielen die dann wieder der Vernunft zum Opfer. Wenn man weiß was man tut und nur LEDs ansteuern will, reichen auch N-Kanal-FETs. Diese sind billig und können dank niedrigem Einschaltwiderstand richtig viel Strom ab. 

Die Stromversorgung für den Prozessor nehme ich aus dem Empfänger (Servokanal). Gleichzeitig kann über diese Verbindung das Leuchtverhalten der LED beeinflusst werden.

 

 

 Die Stromversorgung für die LED ist separat gestaltet und erfolgt direkt aus dem Antriebsakku. Damit können, ohne das BEC unnötig zu belasten auch LEDs mit größerer Helligkeit und "Cluster-LEDs", also LEDs mit mehreren LEDs in einem Gehäuse betrieben werden. Als Beispiel für eine dieser LEDs sei die unglaublich helle CREE-LED MK-R (12,2V, 1,25A, 1665lm) genannt sein.

Das Rumpfprogramm habe ich aus der Pro-Control-Reparatur übernommen und weiterentwickelt. Es entstanden drei Schaltpläne für drei unterschiedliche Module:

 

Schlüssel-Bauteile

Die Schlüssel-Bauteile legen unter anderem die Eckdaten der Platine fest:

ATTiny 25/45/85 SU20 (Atmel)

Der ATTiny 25 ist zwar möglich, aber vom RAM gesehen schon sehr eng!

 

IRLML0030TRPbF (International Rectifier)

(Worst Case Werte)

 

 

Der Schaltplan

Schalplan von ELSEmini      

Schalplan von ELSE

Schaltplan von ELSEctrl

Die Qualität der Bilder ist sehr schlecht, deshalb hier noch einmal leserliche Versionen:

Download Schaltpläne (ElseSCH.zip)

Schaltplan in PDF

 

 

Das Layout

Hier die Layouts der Module:

Layout von ELSEmini Layout von ELSEctrl

Download Leiterplattenverbund (ElseBRD.zip)

Das Leiterplattenlayout habe ich zu PCBPool geschickt und nach 10Arbeitstage das zurückbekommen:

Vorderseite des Leiterplattenverbunds  Rückseite des Leiterplattenverbundes

 Die Leiterplatten werden neustens bei PCBPool in vergoldeter Oberfläche ohne Aufpreis geliefert. das sieht edel aus und lässt sich super löten. Auf den Bestückungsdruck habe ich bewusst verzichtet. Dagegen empfinde ich Lötstopp-Lack als muss. In die Lötstopp-Maske kann übrigens auch Schrift integriert werden.

Nach dem zersägen mit einer Dekupiersäge (=Feinsäge) sind hier die einzelnen Leiterplatten zu sehen. Die Erste Reihe zeigt 6 Schaltnetzteilplatinen für ein anderes Projekt. In der zweiten Reihe sind links vier ELSEmini-Platinen zu sehen, daneben, rechts vier ELSE-Platinen. Im vorderen Bereich sind links zwei Platinen für Lineare-Stromquellen zu sehen (Anderes Projekt) und rechts zwei ELSEctrl-Platinen

Vereinzelte Platinen

ELSEmini (Vorderseite)ELSEmini (Rückseite)

 

Stückliste:

 ElseMini

ID  Beszeichnung   z.B. Reichelt z.B. Conrad 
 IC11

ATTiny25 SU20
ATTiny85 SU20
ATTiny45 SU20

 ATTiny 85-20 SU  154232 - 62 
 T11

 IRLML0030TRPbF (30V,5,3A)
 IRLML0060TRPbF (60V,2,7A)

 IRLML 0030
 IRLML 0060

 161180 - 62
 161182 - 62 

 T12  IRLML0030TRPbF (30V,5,3A)
 IRLML0060TRPbF (60V,2,7A)
 IRLML 0030
 IRLML 0060
 161180 - 62
 161182 - 62 
 T13  IRLML0030TRPbF (30V,5,3A)
 IRLML0060TRPbF (60V,2,7A)
 IRLML 0030
 IRLML 0060
 161180 - 62
 161182 - 62 
 T14  IRLML0030TRPbF (30V,5,3A)
 IRLML0060TRPbF (60V,2,7A)
 IRLML 0030
 IRLML 0060
 161180 - 62
 161182 - 62 
 R11  2k7 Bauform 0402  SMD-0402 2k7  x
 C11  Kerko 100nF 0603  X7R-G0603 100N  x
 JP11 Kabel. Servobuchse
Lindinger.at: 51200 od.
18276
 x  x
 JP12  Buchsenleiste 2x10 1,27mm  BL 2X10G 1,27  x
   Steckerleiste 2x10 1,27mm  SL 2X10G 1,27  x

 

 Else

ID  Beszeichnung   z.B. Reichelt  z.B. Conrad
 IC12

ATTiny25 SU20
ATTiny85 SU20
ATTiny45 SU20

   154232 - 62
 T11 IRLML0030TRPbF (30V,5,3A)
 IRLML0060TRPbF (60V,2,7A)
 IRLML 0030
 IRLML 0060
 161180 - 62
 161182 - 62 
 T12  IRLML0030TRPbF (30V,5,3A)
 IRLML0060TRPbF (60V,2,7A)
 IRLML 0030
 IRLML 0060
 161180 - 62
 161182 - 62 
 T13  IRLML0030TRPbF (30V,5,3A)
 IRLML0060TRPbF (60V,2,7A)
 IRLML 0030
 IRLML 0060
 161180 - 62
 161182 - 62 
 T14  IRLML0030TRPbF (30V,5,3A)
 IRLML0060TRPbF (60V,2,7A)
 IRLML 0030
 IRLML 0060
 161180 - 62
 161182 - 62 
 R11  2k7 Bauform 0402  SMD-0402 2k7  x
 R22  2k7 Bauform 0402  SMD-0402 2k7  x
 C11  Kerko 100nF 0603  X7R-G0603 100N  x
 JP11  Kabel. Servobuchse
Lindinger.at: 51200 od.
18276
 x  x
 JP12  Buchsenleiste 2x10 2,54mm  BL 2X10G 2,54    x
   Steckerleiste 2x10 2,54mm  L 2X10G 2,54  x

 

 

BOM:

 Posten Preis 
Leiterplatte (anteilig)  8,62
ATtiny 85-20SU  1,30
IRLML0030  0,48
Widerstände  0,20
Kondensatoren

 0,05

Stecker  0,09
Buchse 0,27 
Kabel, Zinn, ...  0,50
 Summe  11,51

 Wie man unschwer erkennen kann, ist das teuerste Bauteil NICHT der Prozessor sondern die Leiterplatte. Eines der am meißten unterschätzten und vergessenen Faktoren einer Elektronikentwicklung. Eine weitere Erkenntnis: Auch wenn die einzelnen Komponenten sehr wenig kosten, "läppert" sich das ganze doch zu einem nennenswerten Preis. Wenn man noch die Entwicklungszeit und die Programmierzeit dazu rechnet, kommt man schnell zur Erkenntnis, dass ein gekauftes Lichtmodul für unter 50EUR das gut ist, sein Geld wert ist - wenn man es kaufen kann. Falls nicht: ELSE.

 

Zusammenbau

 Der Zusammenbau ist unproblematisch, wenn man etwas Löterfahrung hat. Als Requisiten genügen: Lötzinn 1mm Durchmesser, eine mittelpreisige Lötstation und gutes Flussmittel. Dann lötet sich die Platine fast von selbst. Die Pads für den Mikroprozessor habe ich etwas kurz gemacht. Das werde ich in Zukunft verbessern.

ELSE (Vorderseite) ELSE (Rückseite)

ELSEmini (Vorderseite) ELSEmini (Rückseite)

Größenvergleich ELSE und ELSEmini

  

Bestückte ELSEctrl

 Buchsenbelegungen

Hier ist die Buchsen-Belegung und die Codierung von ELSE zu sehen:

 

und hier die Buchsen-Belegung von ELSEmini:

 

Die Software

Wie bereits erwähnt, habe ich da meine "Reparaturcode" von der Pro-Control weiter entwickelt.

Download der Sourcen und des HEX-Files: (ELSE140316_Code.zip)

WICHTIG: Beim Programmieren des Prozessors ist unbedingt darauf zu achten, dass die "FUSE" für die Taktteilung "CKDIV8" deaktiviert werden muss, sonst läuft alles den Faktor 8 langsamer ab. Als Taktgenerator habe ich die intern generierten 8Mhz eingestellt. Alle anderen Einstellungen bleiben auf "Default". Für einen besseren Zugriff bei Softwareänderungen habe ich beim Brennen der Fuses gleich auf "Debug-Wire" eingestellt. Damit kann anschließend einfach über die Reset-Leitung programmiert werden.

Bei der Erläuterung des Sourcecodes habe ich hier etwas von meinem letzten Artikel kopiert - ist ja prinzipell der gleiche Code.

Das Verhalten des Moduls ist an drei Stellen eingestellt: 1. Definitionsteil, 2. Funktion "LED_init" und dem Hauptprogrammteil.

1. Definitionsteil:

Festlegung für das System:
#define
LED_max 4//Anzahl der LED-Kanäle
#define PWM_max 1//Anzahl der PWMs
#define PWM_software 1//Flag, dass die PWM ohne Hardwareunterstützung ausgewertet wird (ist ungenauer, aber es wird keine Hardware benötigt)
#define PWM_hardware 1//Flag, dass die PWM mit Hardwareunterstützung ausgewertet wird. Das ist genauer und braucht weniger Rechenzeit. Allerdings ist ein zweiter Timer nötig.

#define Flash_max 3 //Es werden maximal Dreifachblitzer benötigt (jeder Blitz ist frei definierbar)

 

Hier wird nun der ganze Zeitrahmen festgelegt:
#define
Clock_Speed 8000000//8MHz CPU-Frequenz
#define Zyklus_Interrupt 240//Abtastrate 30us/33,3kHz --->Wie schnell die PWM abgetastet wird
#define blinktimer_max 0x0040//tmin=3,7ms, Fmax=133Hz --->Wie kurz ein Blitz sein kann, hier 3,7ms

Pinbelegung:
#define
port_PWM1 4 //Bedeutet hier z.B. die PWM1 ist mit PB4 verbunden.
//#define port_Pegel1 4 //Es kann hier ein Pegel an einem CPU-Pin ausgewertet werden hier inaktiv

#define port_PWM2 4
#define port_LED1 0
#define port_LED2 1
#define port_LED3 2
#define port_LED4 3

 

2. LED_init(void)-Teil

index=0; //hier wird die LED0 angesprochen
//ACL-Dreifachblitz
LED[index].Funktion=2;// Durchlaufen der Timing-Sequenzen, d.h. Blinken, Blitzen. eine "0" schaltet die LED aus, eine "1" erzeugt Dauerlicht.
LED[index].Port_pin=port_LED1;//Zuweisen des Ausgangspins
LED[index].State=0;//Rücksetzen der State-Machine. Hier können Blitzer synchronisiert oder de-synchronisiert werden, wenn das Timing gleich ist.
//folgende Angaben definieren die Blink/Blitzfunktion:
LED[index].Timing[0].time_cnt=0;
LED[index].Timing[0].time_max=540;//Off 540*3,7ms=1998ms
LED[index].Timing[1].time_cnt=0;
LED[index].Timing[1].time_max=30;//On 30*3,7ms=111ms
LED[index].Timing[2].time_cnt=0;
LED[index].Timing[2].time_max=120;//Off
LED[index].Timing[3].time_cnt=0;
LED[index].Timing[3].time_max=20;//On
LED[index].Timing[4].time_cnt=0;
LED[index].Timing[4].time_max=60;//Off
LED[index].Timing[5].time_cnt=0;
LED[index].Timing[5].time_max=10;//On

Die LED macht also erst einmal 2s Pause, Blitzt dann für 111ms und so fort. Mit dem Timing kann nun auch die Einschaltdauer berechnet werden: (30+20+10)*3,7ms=222ms. Die Aus-Zeit ist dagegen 720*3,7ms=2664ms. Das Impuls/Pause-Verhältnis ist damit 1/12, das bedeutet, gegenüber einer dauernd leuchtenden LED verbraucht der Blitzer 1/12 der Leistung und die LED wird auch nur 1/12 so heiß. Bei gleichen Verhältnissen können damit (Datenblatt beachten) 12mal höhere Ströme ohne/mit schlechtem Kühlkörper verarbeitet werden. Das ist eine gute Nachricht.

 

3. Hauptprogramm

Da alle Funktionen Interrupt-getrieben im Hintergrund ablaufen, stellt das Hauptprogramm lediglich die Funktionen der LEDs in Abhängigkeit zum PWM-Eingang um.

Mit etwas Elan/Fleiß könnte auch dies im Hintergrund passieren. Nachfolgend ein Code-Schnipsel, aus dem sich die ganze Logik ableitet:

 

if(PWM[0].Tick_value>0x37)//wenn  die PWM größer als Hex(37)=55*30us=1650us=1,65ms ist, was 65% PWM entspricht, dann:
            {LED[0].Funktion=2;//LED1 blitzen
            
LED[1].Funktion=1;//LED2 einschalten
            
LED[2].Funktion=1;//LED3 einschalten
            
LED[3].Funktion=2;//LED4 blitzen
            
}

Der Hintergrund sei vielleicht noch erwähnt: Das PWM-Signal das aus dem Empfänger kommt hat eine Einschaltdauer von 1ms...2ms, wobei die (Knüppel-)mitte 1,5ms ist. die 1,65ms die gemessen wurden müssen also erst einmal mit dem Minialbetrag von 1ms subtrahiert werden. Es bleiben 0,65ms in einem Bereich von (2ms-1ms=)1ms. Das sind 65% vom Knüppelausschlag.

 

So sieht ein PWM-Signal aus wenn es vom Empfänger heraus kommt. 1,56ms - wobei der Knüppel in der Mitte stand.

PWM-Signal vom Empfänger

 

Messung und Test

Bei der Inbetriebnahme habe ich umfangreiche Test und Messungen durchgeführt. Die Ergebnisse waren sehr zufriedenstellend.

Hier ist ein kleiner Testadapter zum Prüfen einer ELSE-Platine zu sehen. Adapter dieser Art habe ich einige gebaut.

Hier 3,7mS-Signal (blinktimer_max), gemessen an einem Pin.

 

Zeitkontingente:

Aus Messungen mit dem Oszilloskop ergeben sich folgende CPU-Zeiten für die einzelnen Funktionen:

Task  CPU-Zeit
Blinktimer in T0-Interrupt 2,7%
PWM 0,1%
LED Behandlung in T0-Interrupt 3,3%
Idle-Task-Behandlung in
T0-Interrupt (Option)
9,7%

Daraus ergibt sich, dass mit einem anderen Atmel-Prozessor aus der gleichen Familie, etwas Codeanpassung und genügend Ausgangspins auch 26 unabhängige LED-Ausgänge realisierbar wären.

 

Stromverbrauch:

Der Strom aus Messung zeigt 12mA (ließe sich durch Sleep-Moden noch deutlich verbessern) 

Praxistest:

Die ersten Flüge sind mit den Modulen gut abgelaufen. Ein anderes ELSE-Modul verrichtet in einem Heli eines Vereinskollegen gute Dienste.

 

 

Nachtrag (20.3.2015): Ich habe nun schon einige ELSE im Einsatz, doch meine Eurofighter hat noch eine Schwachstelle aufgezeigt: Beim Brennen der Fuses sollte die Brownout-Detection aktiviert werden. Wer Ganz sicher gehen will, brennt die Schwelle auf 4,3V. Damit läuft dann die ELSE auch in schwierigstem Umfeld.

 

 

 

 

No comments