Brushless ESC als RC (Licht)schalter

dotpitch

Throttle Trottel
Ich glaube ich habe nen 6A Regler geschrottet. Der regiert nicht mehr aufs FlashTool. Kann man das irgendwie prüfen?

Gruß Christian
 

pete1990

Erfahrener Benutzer
Ich glaube ich habe nen 6A Regler geschrottet. Der regiert nicht mehr aufs FlashTool. Kann man das irgendwie prüfen?

Gruß Christian
Versuchst du die Verbindung über das Servokabel mit dem USBLinker oder über die ISP-Anschlüsse? Im ersteren Fall kann es sein, dass du dir den Bootloader überschrieben hast. Es ist meiner Meinung nach eh eher unwahrscheinlich das du dir den Prozessor gekillt hast, wenn dann die Fets und dann sollte der Prozessor noch ansprechbar sein. Direkt testen, hmm, ich würde im AVR-Studio (was du aber wohl nicht installiert hast...) versuchen ne verbindung aufzubauen (über ISP). Was ist denn die Fehlermeldung im KK-Tool?
Grüße
Pete
 

dotpitch

Throttle Trottel
Ist per ISP angeschlossen. Beim 2ten gabs keine Probleme.

Firmware Datei flashen.

/Applications/kkMulticopter Flash Tool.app/Contents/Resources/Java/lib/avrdude/mac/avrdude -C /Applications/kkMulticopter Flash Tool.app/Contents/Resources/Java/lib/avrdude/mac/avrdude.conf -p m8 -P usb -c usbasp -e -U lfuse:r:/Users/xxxxx/Library/Preferences/kkMulticopterFlashTool//lfuse.hex:r -U hfuse:r:/Users/xxxxx/Library/Preferences/kkMulticopterFlashTool//hfuse.hex:r

avrdude: error: programm enable: target doesn't answer. 1
avrdude: initialization failed, rc=-1
Double check connections and try again, or use -F to override
this check.


avrdude done. Thank you.

Fehler während dem lesen der high fuses.
Firmware flashen abgebrochen.
Der Regler hängt beim Flashen an 12V.

Danke & Gruß Christian
 
Zuletzt bearbeitet:

pete1990

Erfahrener Benutzer
hmm, avrdude kenn ich selber auch nicht so gut, aber soweit ich das interpretiere, hast du dich entweder über die Fuses vom Prozessor ausgesperrt oder der Atmel hat wirklichen nen Schlag weg...In letzerem Fall könnte man das Teil noch über High Voltage Programming retten, was aber wieder Equipment und feinfieselige Lötarbeit nach sich ziehen würde, lohnt bei dem 6A UBEC wohl eher nicht. Vielleicht sagt ein Anderer ja mal noch was dazu, aber ich für meinen Teil würde dann doch sagen das der doch hinüber ist. Die Verbindungen wirst du ja sicher doppelt überprüft haben, oder?
 

dotpitch

Throttle Trottel
Naja mal sehen.. Hab mir mal AVR Studio besorgt.
Werd erstmal auf dem anderen weiter rumhacken :)

Gruß Christian
 

pete1990

Erfahrener Benutzer
/* Selection of switched FET */
/* default is common anode (low-side-FET used) */
/* to use other direction, uncomment related line */
//#define CH1_GND
//#define CH2_GND
//#define CH3_GND
Also ohne das jetzt getestet zu haben, müsstest du das alles auskommentiert lassen und dafür in der setup-Funktion:

Code:
void setup() {
  // define Pins as in/out - DO NOT CHANGE
  pinMode(IN1, INPUT);
  pinMode(OUT1_VCC, OUTPUT);
  pinMode(OUT2_VCC, OUTPUT);
  pinMode(OUT3_VCC, OUTPUT);
  pinMode(OUT1_GND, OUTPUT);
  pinMode(OUT2_GND, OUTPUT);
  pinMode(OUT3_GND, OUTPUT);
  // init outpins all off  - DO NOT CHANGE
  digitalWrite(OUT1_VCC , LOW);
  digitalWrite(OUT2_VCC , LOW);        
  digitalWrite(OUT3_VCC , LOW);
  digitalWrite(OUT1_GND , LOW);
  digitalWrite(OUT2_GND , LOW);        
  digitalWrite(OUT3_GND , LOW);
}
Eine der GND Zeilen müsstest du verändern. Am Beispiel von Kanal1 ändern in:

Code:
  digitalWrite(OUT1_GND , HIGH);
Kanal 2+3 wird dann wie gehabt aktiviert und deaktiviert, Kanal1 darfst du dann nicht mehr aktivieren, sonst gibts nen Kurzschluss in den FETs, also diese Zeile ist dann tabu:

Code:
digitalWrite(OUT1 , HIGH);
Wie gesagt alles unter Vorbehalt und teste es an einem geregelten, strombegrenzten Netzteil!
 

tomm

Erfahrener Benutzer
perfekt. funkioniert prima.
2 kanäle für die powerleds an den enden der arme.
vorne und hinten getrennt ansteuerbar, einfach programmierbare blinksequenzen inkl. lipo-überwachung.
und das teuerste daran sind die leds.

jetzt nur noch die kabel ordentlich verlegen...

danke euch.
 

MarenB

Runter kommen sie immer!
Hat schon mal jemand versucht, einen ESC (für diesen Zweck, aber das ist ja im Grund egal, ob LEDs oder Motor) per S-Bus anzusteuern? Wenn ich das richtig sehe, geht beim HK 10A Regler die PPM-Leitung auf zwei Eingangspins, einer davon ist der UART-RX.
Man müsste das S-Bus-Signal vorher noch invertieren, dann sollte der µC das aber direkt lesen können!? Kanalzuordnung müsste dann wohl per Firmware-Update erfolgen, falls nicht zufällig auch noch jemand weiß, wie die Servochannel-Changer arbeiten. Für meinen Zweck wäre das aber zu verschmerzen.

Ich hab in meiner Twinstar bereits alle 8 PPM-Ausgänge belegt sowie schon einen S-Bus-PPM-Adapter im FPV-Canopy im Einsatz - einen weiteren möchte ich nicht verbauen, da da wohl erstmal nur ein Nutzer dranhängen soll - der Lichtschalter :)

Wenn ich also schon einen ESC mit Custom-Firmware nutze, dann könnte ich mir den Umweg über einen externen Konverter sparen, dachte ich mir. Mein größtes Problem dabei: ich hab kaum Plan von C oder Arduino - bin Bascom-User. Existierenden Code anpassen wird also erstmal schwierig für mich. Und da ich die Vollversion habe, möchte ich mir auch nix anderes beibringen ;)

Wäre schön, wenn ich damit kein Neuland betreten würde und den Code komplett neu schreiben müsste. Kann ich mir auch irgendwie kaum vorstellen, dass es das nicht schon gibt...


Edit: Erste Versuche zeigen, es geht (nur) per Software-UART. Nur, wegen 8E2 serial, beim Atmega8 ist die HW-UART auf 8N1 fest eingestellt. Netter Nebeneffekt ist dabei immerhin, dass man das Signal nicht vorher invertieren muss, das macht die SW.
Ich bekomme jetzt zwar Daten vom S-Bus rein, sinnvoll sieht das aber noch nicht aus :( Fies ist auch, dass die Channels Byte-übergreifend auszuwerten sind und das als Little Endian übertragen wird. Ich krieg da immer 'n Knoten im Kopf...

Edit2: Es geht! Es geht! Es geht!
:wow:

Endlich kann ich endlich wieder gut schlafen :)

Der Mega8 auf meinem Pollin-Board versteht jetzt S-Bus. Als nächstes schreibe ich die Tage ein kleines Testprogramm für die drei Ausgänge und dann wird das auf den ESC geflasht.

Interpretiere ich das richtig, beim HK 10A ESC ist

- PWM-Eingang auf Port D2

- P-Ausgang A auf Port D4
- P-Ausgang B auf Port C5
- P-Ausgang C auf Port C3

- N-Ausgang A auf Port D5
- N-Ausgang B auf Port C4
- N-Ausgang C auf Port B0

- Taktfrequenz 16 Mhz

?

Wäre super, wenn das mal jemand gegenprüfen könnte. Danke!

VG
Maren
 
Zuletzt bearbeitet:

MarenB

Runter kommen sie immer!
Alternative Firmware zur Ansteuerung per S-Bus

Edit2: So, letztes Update unten: LiPo-Überwachung geht auch, die Kalibrierung war verschoben.
Damit war's das für mich. Wer's brauchen kann, bitte. Wenn's keinen interessiert, entschuldigt den Spam ;)

Hallo zusammen,

ich denke, ich hab das jetzt so weit, dass es läuft. Auf meiner Entwicklungsumgebung, einem Atmel-Evaluationsboard von Pollin läuft es jedenfalls prima.

Frickler, ich hoffe, du bist mir nicht böse, wenn ich das hier in deinem Thread mit unterbringe. Da du meine Inspiration warst und es um das gleiche Thema geht, denke ich, dass das gut hier rein passt.

Vorab: Hardware-Anpassungen sind keine erforderlich!
Geschrieben habe ich in BASCOM, einem Basic-Dialekt für die AVR-Prozessoren. Die Demo-Version des Compilers kann kostenlos heruntergeladen werden und ist lediglich auf 4kB Code begrenzt. Ich muss gestehen, dass ich das nicht getestet habe, da ich die Vollversion besitze, aber die zeigt mir an, dass nur 22% der 8kB Flashspeicher benutzt werden, sollte also gehen.

Für das Flashen selbst und das setzen der Fuses gilt vermutlich nichts anderes, als hier im Thread beschrieben.

Programmiert habe ich ein Positionslicht, ein ACL und Landescheinwerfer. Die Einschaltschwellen können über Konstanten am Programmanfang leicht angepasst werden, genauso wie man wählen kann, ob man die HighSideDriver/P-Fets (geben Versorgungsspannung aus) oder die LowSideDriver/N-Fets (schalten gegen Masse) verwenden möchte.

Der LiPo wird auch überwacht. Beim Einschalten wird zunächst die Gesamtspannung gemessen und daraus auf die Anzahl der Zellen geschlossen. Diese Anzahl wird dann einmal über blinkende Positionsleuchten angezeigt. Das ist zuverlässig, außer bei 4S- und 5S-Akkus. Da können sehr leere Akkus schon mal zur Berechnung von 3 bzw. 4 Zellen führen. Wenn dann irgendwann die (errechnete) Zellspannung für eine einstellbare Anzahl von Sekunden unterschritten wird, fangen die Positionsleuchten im Sekundentakt an zu blinken.

Das ACL ist im Augenblick auf 970ms Aus-Zeit und 30ms Ein-Zeit "festverdrahtet", das kann ggf. in der ISR am Ende angepasst werden, in dem die Timer anders vorgeladen werden. Da ich die 970ms-Periode (=~1Sekunde) aber auch für den Countdown der LiPo-Unterspannungserkennung und den Blinktakt der Positionsleuchten bei leerem LiPo verwende, muss man da vorsichtig sein und ggf. weitere Anpassungen vornehmen.

Das Programm empfängt über eine Software-Serielle-Schnittstelle die Daten vom S-Bus und prüft diese auf Gültigkeit (Startbyte, Endbyte & Dauer der Übertragung eines Frames). Sind sie gültig, wird der Kanal ausgewertet, der als Konstante am Programm-Anfang eingetragen wurde. Die Kanäle 17 und 18 kann man zwar auch auswerten lassen, da diese aber nur zwei Stellungen (0/1) übertragen können, kann man die Lichter-Funktionen so nur alle gemeinsam aktivieren oder de-aktivieren. Für andere Zwecke könnte man das aber natürlich verwenden.
Die Flags "Failsave" und "Framelost" werden ausgelesen aber von mir z.Zt. nicht verwendet. Wer will, kann in der Hauptschleife Zeilen implementieren, die mit den Informationen irgendwas machen :)

Wer mit BASCOM nicht vertraut ist: Zeilen die mit "#" beginnen, werden nur vom Compiler ausgewertet. D.h. alles nicht benötigte wird gar nicht erst in das Hex-File übernommen. So wird also z.B. entweder für das Pollin-Board oder die ESC-Hardware compiliert und auch der Auswerte-Code für den RC-Kanal wird nur für den jeweilig einen übernommen. Das spart im Betrieb Rechenzeit und ermöglicht die Verwendung der BASCOM Demo-Version.

Viel Spaß damit!

Code:
                                                                          'Alternative firmware for HK Blueseries 6A/10A Brushless ESCs.
'Controls three outputs (Positionlights, ACL and Landlights) based on
'RC-Channel position transmitted via S-Bus. Includes LiPo low-voltage detection
'and alarm via blinking positionlights.
'After power-up, the LiPo-Voltage is measured intially and the number of cells
'is calculated and shown to the user by blinking positionlights.


'Copyright (C) <2014>  <marenb79 (at) gmx.de>

'This program is free software: you can redistribute it and/or modify
'it under the terms of the GNU General Public License as published by
'the Free Software Foundation, either version 3 of the License, or
' (at your option) any later version.

'This program is distributed in the hope that it will be useful,
'but WITHOUT ANY WARRANTY; without even the implied warranty of
'MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
'GNU General Public License for more details.

'You should have received a copy of the GNU General Public License
'along with this program.  If not, see <http://www.gnu.org/licenses/>.

'Any commercial use requires permission of the author.


'*****************************************
'Modify these constants for for your needs
'*****************************************
Const Vmin = 3600                                           'Zellspannungsuntergrenze für Erkennung leerer LiPo in mV
Const Vmin_time = 3                                         'Zeit in Sekunden für die Vmin unterschritten sein muss, bevor leerer LiPo erkannt wird (0-255)
Const Refchannel = 13                                       'Kanal auf den reagiert werden soll (1-16, Kanäle 17&18 erfordern Anpassung, da nur ein/aus)

'Const Board = "Pollin"                                      'für Betrieb auf dem ESC, diese Zeile deaktivieren.
                                                              'Testumgebung war ein Atmel-Evaluationsboard von Pollin, wird dies aktiviert, passt der Compiler Ein- und Ausgänge an
                                                                'und aktiviert das Debugging
Const Board = "ESC"                                             'für Betrieb auf dem ESC, diese Zeile aktivieren

Const Poslightdriver = "HSD"                                '"HSD" = P-Fets, Alternativ: "LSD" -> nutzt die n-Fets
Const Acldriver = "HSD"                                     '"HSD" = P-Fets, Alternativ: "LSD" -> nutzt die n-Fets
Const Landlightdriver = "HSD"                               '"HSD" = P-Fets, Alternativ: "LSD" -> nutzt die n-Fets

Const Poslight_threshold = 300                              'Kanalwert ab dem die Positionslampen eingeschaltet werden (Mitte ist 1024)
Const Acl_threshold = 1200                                  'Kanalwert ab dem das ACL eingeschaltet wird
Const Landlight_threshold = 1400                            'Kanalwert ab dem die Landescheinwerfer eingeschaltet werden



'**************************
'Eigentlicher Programmstart
'**************************

#if Board = "Pollin"                                        'auf dem Pollin-Board ist der
$regfile = "m8def.dat"                                      'µC ein Atmega8
$crystal = 8000000                                          'mit einer Taktfrequenz von 8Mhz
#elseif Board = "ESC"                                       'auf dem HK 10A ESC ist der
$regfile = "m8adef.dat"                                     'µC ein Atmega8a
$crystal = 16000000                                         'mit einer Taktfrequenz von 16Mhz
#endif

$hwstack = 40
$swstack = 16
$framesize = 32

'Serielle Schnitstelle(n) für S-Bus-Empfang und ggf. zum PC zum Debuggen konfigurieren
#if Board = "Pollin"
$baud #2 = 115200                                           'Baudrate für Serielle Debug-Schnittstelle zum PC (HW-Uart)
#endif

#if Board = "ESC"
Open "COMD.0:100000,8,E,2, inverted" For Input As #1        'Seriell Software-RX konfigurieren S-BUS (im ESC)
#endif

#if Board = "Pollin"
Open "COMD.5:100000,8,E,2, inverted" For Input As #1        'Seriell Software-RX konfigurieren S-BUS (auf Pollin-Board)
Open "COM1:115200,8,N,1" For Binary As #2                   'Seriell Hardware-Tx konfigurieren PC-Debugging
#endif

Echo Off

'ADC für Messung der Versorgungsspannung konfigurieren (LiPo-Überwachung)
Config Adc = Single , Prescaler = Auto , Reference = Avcc

'Timer1 für das ACL konfigurieren
Config Timer1 = Timer , Prescale = 1024                     'Timer1 für das Blitzen des ACL konfigurieren
On Timer1 Acl_isr                                           'bei Überlauf in die ACL-ISR springen
Enable Timer1                                               'Timer1-Interrupt aktivieren

'Timer2 als Stoppuhr für den S-Bus-Empfang konfigurieren
Config Timer2 = Timer , Prescale = 1024
Stop Timer2                                                 'anhalten
Timer2 = 0                                                  'und auf Null setzen für die erste Messung


'Ausgänge konfigurieren
#if Poslightdriver = "HSD"
Poslight Alias Portd.4                                      'HSD: Positionslichter auf PD4
Config Portd.5 = Output
Portd.5 = 0
#elseif Poslightdriver = "LSD"
Poslight Alias Portd.5                                      'LSD: Positionslichter auf PD5
Config Portd.4 = Output
Portd.4 = 0
#endif

#if Acldriver = "HSD"
Acl Alias Portc.5                                           'HSD: ACL auf PC5
Config Portc.4 = Output
Portc.4 = 0
#elseif Acldriver = "LSD"
Acl Alias Portc.4                                           'LSD: ACL auf PC4
Config Portc.5 = Output
Portc.5 = 0
#endif

#if Landlightdriver = "HSD"
Landlight Alias Portc.3
Config Portb.0 = Output
Portb.0 = 0                                                 'HSD: Landescheinwerfer auf PC3
#elseif Landlightdriver = "LSD"
Landlight Alias Portb.0                                     'LSD: Landescheinwerfer auf PB0
Config Portc.3 = Output
Portc.3 = 0
#endif

Config Landlight = Output                                   'als Ausgang definieren
Config Poslight = Output                                    'als Ausgang definieren
Config Acl = Output                                         'als Ausgang definieren


'Variablen für S-Bus-Frame definieren
Dim Startbyte As Byte                                       'Jeder S-Bus-Frame beginnt mit einem festen Startbyte
Dim Endbyte As Byte                                         'Jeder S-Bus-Frame endet mit einem festen Endbyte
Dim Databyte(23) As Byte                                    'Gesamtes Frame besteht aus Startbyte + 23 Datenbytes + Endbyte
Dim Bitmask As Byte                                         'Hilfvaribale für Zwischenoperationen
Dim Channel(18) As Integer                                  'Es werden 18 Kanäle übertragen

'Allgemeine Variablen
Dim Statusbyte As Byte                                      'Ein Byte als gemeinsamer Container für alle Statusflags
Newdata Alias Statusbyte.0                                  'Flag für "Es liegen neue, gültige Daten vom S-Bus vor"
Framelost Alias Statusbyte.1                                'wenn dem Empfänger ein Datenframe verloren gegangen ist
Failsave Alias Statusbyte.2                                 'Empfänger meldet, wenn er im Failsafe-Modus ist
Lowbatt Alias Statusbyte.3                                  'wenn niedrige Versorgungsspannung erkannt wurde (LiPo leer)
ACL_enable alias statusbyte.6                               'ACL aktiviert oder nicht
Long_period Alias Statusbyte.7                              'Flag zur Erkennung der vorangegenagenen Periode für das ACL

Dim I As Byte                                               'Zaehlervariable

dim vcells_raw as  Integer
Dim Vcells As single                                         'Zellenspannung in mV
Dim Lipo_cells As Integer                                   'Anzahl der erkannten LiPo-Zellen
Dim Lipo_timeout As Byte                                    'countdown für unterschrittene LiPo-Spannung
Lipo_timeout = Vmin_time                                    'Anfangs countdown resetten


'*****************
'Start-Up Prozedur
'*****************
Wait 2                                                      '2 Sek. warten bis System stabil (Stecker vollständig eingesteckt, etc.)
Lipo_cells = 1                                              'Zunächst auf eine Zelle setzen, damit vcells in Höhe der Gesamtspannung zurückgegeben wird
Gosub Get_vcells                                            'Einmal LiPo-Zellenspannung messen

Select Case Vcells                                          'Anzahl der LiPo-Zellen an Hand der Versorgungsspannung ermitteln
   Case 0 To 5500 : Lipo_cells = 1
   Case 5501 To 9000 : Lipo_cells = 2
   Case 9001 To 13000 : Lipo_cells = 3
   Case 13001 To 17000 : Lipo_cells = 4
   Case Else : Lipo_cells = 5
End Select

For I = 1 To Lipo_cells                                     'Pro erkannter LiPo-Zelle Ausgang A einmal blinken lassen
   Set Poslight
   Waitms 500
   Reset Poslight
   Waitms 500
Next


Enable Interrupts

'********************************
'*** BEGINN DER HAUPTSCHLEIFE ***
'********************************
Do


'*** Auswertung des Referenzkanals ***
If Timer1 < 65220 Then Gosub Read_sbus                      'wenn noch min. 20ms bis zum ACL-Interrupt übrig, dann S-Bus lesen

If Newdata = 1 Then Gosub Analyze_channel                   'den in der Konst. "Refchannel" angegebenen Kanal auswerten, falls neue, gültige Daten vorliegen


'*** Jetzt kommt die Reaktion auf die Kanalwerte ***
If Lipo_timeout > 0 Then
   If Channel(refchannel) > Poslight_threshold Then Poslight = 1 Else Poslight = 0
End If

If Channel(refchannel) > Acl_threshold Then Acl_enable = 1 Else Acl_enable = 0
If Channel(refchannel) > Landlight_threshold Then Landlight = 1 Else Landlight = 0


'*** LiPo-Überwachung ***
Gosub Get_vcells                                            'LiPo-Spannung messen

If Vcells < Vmin Then
   Set Lowbatt                                              'bei Zellspannung unter 3,6V Flag für leeren LiPo setzen
Else
   if lipo_timeout>0 then
   Reset Lowbatt                                            'sonst Flag zurücksetzen
   Lipo_timeout = Vmin_time
   end if                                    'und Countdown zurücksetzen
End If

#if Board = "Pollin"                                        'falls Pollin-Board, Kanalstellung auf HW-Uart zum Debug senden
If Timer1 < 65000 Then                                      'wenn noch genügend Zeit in einer langen Periode bleibt
Print #2 , Channel(refchannel)                              'aktuelle Kanalstellung an PC übertragen
End If
#endif


Loop





'******************
'Es folgen die Subs
'******************

'***ACL Blitzer***
Acl_isr:

#if Board = "Pollin"                                        'Das Pollinboard läuft nur auf 8Mhz, daher müssen die Timer-Werte angepasst werden
If Long_period = 1 Then                                     'falls vorangegangene Periode eine lange war
   If Acl_enable = 1 Then Acl = 1                           'nur falls ACL aktiviert ist, ACL-Ausgang einschalten
   Load Timer1 , 234                                     'timer für 30ms vorladen
   Long_period = 0                                          'ab jetzt folgt eine kurze Periode
Else                                                        'falls vorangegangene Periode eine kurze war
   Acl = 0                                                  'ACL-Ausgang so oder so ausschalten
   If Lipo_timeout = 0 Then Toggle Poslight                 'falls LiPo leer, Positionsleuchten toggeln
   If Lowbatt = 1 And Lipo_timeout > 0 Then Decr Lipo_timeout       'eins runterzählen, falls Unterspannung vorliegt
   Load Timer1 , 7585                                       'timer für 970ms vorladen
   Long_period = 1                                          'ab jetzt folgt eine lange Periode
End If
#endif

#if Board = "ESC"                                           'Der Esc läuft auf 16Mhz , daher zählt Timer2 In Der gleichen Zeit doppelt so weit
If Long_period = 1 Then                                     'falls vorangegangene Periode eine lange war
   If Acl_enable = 1 Then Acl = 1                           'nur falls ACL aktiviert ist, ACL-Ausgang einschalten
   Load Timer1 , 469                                        'timer für 30ms vorladen
   Long_period = 0                                          'ab jetzt folgt eine kurze Periode
Else                                                        'falls vorangegangene Periode eine kurze war
   Acl = 0                                                  'ACL-Ausgang so oder so ausschalten
   If Lipo_timeout = 0 Then Toggle Poslight                 'falls LiPo leer, Positionsleuchten toggeln
   If Lowbatt = 1 And Lipo_timeout > 0 Then Decr Lipo_timeout       'eins runterzählen, falls Unterspannung vorliegt
   Load Timer1 , 15169                                                      'timer für 970ms vorladen
   Long_period = 1                                             'ab jetzt folgt eine lange Periode
End If
#endif

Return


'*** Messen der Versorgungsspannung in mV ***
Get_vcells:
Vcells_raw = Getadc(2)                                          'ADC2 einlesen (=Versorgungsspannung über Teiler 220k/51k)
vcells=vcells_raw
Vcells = Vcells * 25.082
Vcells = Vcells + 955.61                                    'Umrechnung: U=ADC2*25.082+955,61 /mV
Vcells = Vcells / Lipo_cells                                'macht pro Zelle xy mV

Return


'*** Einlesen eines S-Bus-Frames ***
Read_sbus:                                                  'Sprungmarke
Inputbin #1 , Startbyte                                     'Ein Byte von der SW-UART abholen

#if Board = "Pollin"                                        'Das Pollinboard läuft nur auf 8Mhz, daher müssen die Timer-Werte angepasst werden
If Startbyte = 15 Then                                      'falls es sich um das Startbyte (0x0F)handelt...
   Timer2 = 0                                               'Stoppuhr zurücksetzen
   Start Timer2                                             'Stoppuhr starten
   Inputbin #1 , Databyte(1) , 23                           'Die 23 Datenbytes abholen
   Inputbin #1 , Endbyte                                    'Das letzte Byte im Frame = hoffentlich das Endbyte empfangen
   Stop Timer2
   If Endbyte = 0 And Timer2 > 19 And Timer2 < 28 Then      'wenn mehr als 2,5 und weniger als 3,5ms für die letzten 24 Bytes vergangen sind und
      Newdata = 1                                           'falls am Ende ein korrektes Endbyte (=0) empfangen wurde ist der neue Datenstream gültig!
   Else
      Newdata = 0                                           'andernfalls ist er nicht gültig und muss ignoriert werden
   End If
End If
#endif

#if Board = "ESC"                                           'Der ESC läuft auf 16Mhz, daher zählt Timer2 in der gleichen Zeit doppelt so weit
If Startbyte = 15 Then                                      'falls es sich um das Startbyte (0x0F)handelt...
   Timer2 = 0                                               'Stoppuhr zurücksetzen
   Start Timer2                                             'Stoppuhr starten
   Inputbin #1 , Databyte(1) , 23                           'Die 23 Datenbytes abholen
   Inputbin #1 , Endbyte                                    'Das letzte Byte im Frame = hoffentlich das Endbyte empfangen
   Stop Timer2
   If Endbyte = 0 And Timer2 > 38 And Timer2 < 56 Then      'wenn mehr als 2,5 und weniger als 3,5ms für die letzten 24 Bytes vergangen sind und
      Newdata = 1                                           'falls am Ende ein korrektes Endbyte (=0) empfangen wurde ist der neue Datenstream gültig!
   end if
Else
   Newdata = 0                                              'andernfalls ist er nicht gültig und muss ignoriert werden
End If
#endif

Return


'*** Auswertung der Kanäle ***
'Compiler implementiert nur den jeweiligen in der Konstanten "Refchannel" angegebenen Kanal,
'die übrigen Kanäle werden ignoriert, da nicht von Bedeutung
Analyze_channel:

#if Refchannel = 1
Channel(1) = Databyte(2) And &B00000111                     'Nur die Ersten Drei Bits Vom 2. Datenbyte
Shift Channel(1) , Left , 8                                 'Platz machen für die unteren 8 Bits, die vom 1. Datenbyte kommen
Channel(1) = Channel(1) + Databyte(1)                       'das 1. Datenbyte hinzuaddieren

#elseif Refchannel = 2
Channel(2) = Databyte(3) And &B00111111                     'nur die ersten 6 Bits vom 3. Datenbyte
Shift Channel(2) , Left , 5                                 'Platz machen für die verbliebenen 5 Bits vom 2. Datenbyte
Bitmask = Databyte(2) And &B11111000                        'nur die 5 Bits vom 2. Datenbyte
Shift Bitmask , Right , 3                                   'auf Anfang zurechtrücken
Channel(2) = Channel(2) + Bitmask                           'und alle addieren

#elseif Refchannel = 3
Channel(3) = Databyte(5) And &B00000001                     '....usw usf
Shift Channel(3) , Left , 8
Channel(3) = Channel(3) + Databyte(4)
Shift Channel(3) , Left , 2
Bitmask = Databyte(3) &B11000000
Shift Bitmask , Right , 6
Channel(3) = Channel(3) + Bitmask

#elseif Refchannel = 4
Channel(4) = Databyte(6) And &B00001111
Shift Channel(4) , Left , 7
Bitmask = Databyte(5) And &B11111110
Shift Bitmask , Right , 1
Channel(4) = Channel(4) + Bitmask

#elseif Refchannel = 5
Channel(5) = Databyte(7) And &B01111111
Shift Channel(5) , Left , 4
Bitmask = Databyte(6) And &B11110000
Shift Bitmask , Right , 4
Channel(5) = Channel(5) + Bitmask

#elseif Refchannel = 6
Channel(6) = Databyte(9) And &B00000011
Shift Channel(6) , Left , 8
Channel(6) = Channel(6) + Databyte(8)
Shift Channel(6) , Left , 1
Bitmask = Databyte(7) And &B10000000
Rotate Bitmask , Left , 1
Channel(6) = Channel(6) + Bitmask

#elseif Refchannel = 7
Channel(7) = Databyte(10) And &B00001111
Shift Channel(7) , Left , 7
Bitmask = Databyte(9) And &B11111100
Shift Bitmask , Right , 2
Channel(7) = Channel(7) + Bitmask

#elseif Refchannel = 8
Channel(8) = Databyte(11) And &B01111111
Shift Channel(8) , Left , 4
Bitmask = Databyte(10) And &B11110000
Shift Bitmask , Right , 4
Channel(8) = Channel(8) + Bitmask

#elseif Refchannel = 9
Channel(9) = Databyte(13) And &B00001111
Shift Channel(9) , Left , 7
Bitmask = Databyte(12) And &B01111111
Channel(9) = Channel(9) + Bitmask

#elseif Refchannel = 10
Channel(10) = Databyte(14) And &B01111111
Shift Channel(10) , Left , 4
Bitmask = Databyte(13) And &B11110000
Shift Bitmask , Right , 4
Channel(10) = Channel(10) + Bitmask

#elseif Refchannel = 11
Channel(11) = Databyte(16) And &B00000001
Shift , Channel(11) , Left , 8
Channel(11) = Channel(11) + Databyte(15)
Shift Channel(11) , Left , 1
Bitmask = Databyte(14) And &B10000000
Rotate Bitmask , Left , 1
Channel(11) = Channel(11) + Bitmask

#elseif Refchannel = 12
Channel(12) = Databyte(17) And &B00001111
Shift Channel(12) , Left , 7
Bitmask = Databyte(16) And &B11111110
Channel(12) = Channel(12) + Bitmask

#elseif Refchannel = 13
Channel(13) = Databyte(18) And &B01111111
Shift Channel(13) , Left , 4
Bitmask = Databyte(17) And &B11110000
Shift Bitmask , Right , 4
Channel(13) = Channel(13) + Bitmask

#elseif Refchannel = 14
Channel(14) = Databyte(20) And &B00000011
Shift Channel(14) , Left , 8
Channel(14) = Channel(14) + Databyte(19)
Shift Channel(14) , Left , 1
Bitmask = Databyte(18) And &B10000000
Rotate Bitmask , Left , 1
Channel(14) = Channel(14) + Bitmask

#elseif Refchannel = 15
Channel(15) = Databyte(21) And &B00011111
Shift Channel(15) , Left , 6
Bitmask = Databyte(20) And &B11111100
Shift , Bitmask , Right , 2
Channel(15) = Channel(15) + Bitmask

#elseif Refchannel = 16
Channel(16) = Databyte(22)
Shift Channel(16) , Left , 3
Bitmask = Databyte(21) And &B11100000
Rotate Bitmask , Left , 3
Channel(16) = Channel(16) + Bitmask

#elseif Refchannel = 17
Channel(17) = Databyte(23).7                                'Kanal 17 ist ein Flag auf Byte 23, Bit 7

#elseif Refchannel = 18
Channel(18) = Databyte(23).6                                'Kanal 18 ist ein Flag auf Byte 23, Bit 6

#endif

Framelost = Databyte(23).5                                  'Framelost-Flag liegt auf letztem Datenbyte vor dem Endbyte
Failsave = Databyte(23).4                                   'Failsave-Flag liegt auf letztem Datenbyte vor dem Endbyte

Newdata = 0

Return



End
 
Zuletzt bearbeitet:
Hey,

meine ersten Versuche mit der Spannungsüberwachung verliefen erfolgreich! Mit dem 6A UBEC läuft das auch so wie ich es mir vorstelle. Was anderes hab ich grad nicht da zum testen, das will aber VikiN morgen übernehmen.
Große Änderungen gibt es eigentlich nicht. Die Patterns habe ich mal in Funktionen ausgelagert und in der Config gibt es noch Einstellungsmöglichkeiten für den LiPo Alarm, sollte eigentlich selbsterklärend sein, wenn nicht einfach nachfragen.

viel Spaß damit,
Pete
Moin

Hab das nun auch mal probiert, aber bei mir scheiterts schon an compilieren....
D:\Arduino\hardware\tools\avr\bin\avr-g++ -c -g -Os -Wall -fno-exceptions -ffunction-sections -fdata-sections -mmcu=atmega32u4 -DF_CPU=16000000L -MMD -DUSB_VID=0x2341 -DUSB_PID=0x8036 -DARDUINO=105 -ID:\Arduino\hardware\arduino\cores\arduino -ID:\Arduino\hardware\arduino\variants\leonardo C:\Users\ApoC\AppData\Local\Temp\build7203953604952659863.tmp\ESC_Lightduino_1_1_beta.cpp -o C:\Users\ApoC\AppData\Local\Temp\build7203953604952659863.tmp\ESC_Lightduino_1_1_beta.cpp.o
ESC_Lightduino_1_1_beta.ino: In function 'void loop()':
ESC_Lightduino_1_1_beta:159: error: 'V_IN' was not declared in this scope
ESC_Lightduino_1_1_beta.ino: In function 'float getLiPoVol(int)':
ESC_Lightduino_1_1_beta:211: error: 'V_FACTOR' was not declared in this scope
Bin ich echt zu doof?

Die Arduino IDE bleibt dort stehen:

#ifdef LIPOALARM
//check LiPo Voltage
V_LIPO = getLiPoVol(V_IN);



EDIT: Vergesst das......

Normal macht man ein Define rein, damit was angeschaltet wird, hier jedoch, muss man es auskommentieren. Steht ja so auch daneben ;)
Leider fehlen die Defines für die Voltage Überwachung bei TP. Darum der Fehler...
 
Zuletzt bearbeitet:

pete1990

Erfahrener Benutzer
EDIT: Vergesst das......

Normal macht man ein Define rein, damit was angeschaltet wird, hier jedoch, muss man es auskommentieren. Steht ja so auch daneben ;)
Leider fehlen die Defines für die Voltage Überwachung bei TP. Darum der Fehler...
Nein, die LiPo Überwachung wird schon aktiv wenn der Define aktiv ist, also keine // davor sind. Du hast auch Recht das für TP das noch nicht implementiert ist, daher wird die Variable V_IN nicht definiert und der Fehler taucht auf.
Leider steht in der TP.inc beim SimonK zwar der Pin an dem die Spannung gemessen wird, leider aber nicht der Spannungsteiler, der benötigt wird um die korrekte Spannung zu berechnen. Wenn du es hinbekommst, die beiden Widerstände in deinem ESC (ist doch ein TP in SimonK gesprochen oder?) ausfindig zu machen und die Werte ermittelst, dann ist es kein Thema den Faktor auszurechnen und die paar Zeilen defines noch zu schreiben. Unter Umständen ist es der gleiche Teiler in der "TP70a.inc", das könnte man einfach mal testen. Aber sinnvoller wäre es den Spannungsteiler auszulesen. Alternativ könnte man auch die Spannung an Pin C7 des Controllers bei bekannter Versorgungsspannung messen.

grüße
 

MarenB

Runter kommen sie immer!

dotpitch

Throttle Trottel
Hey Hey, hab mal ne Frage:

Kann ich an einen Ausgang ne KSQ (für ne PowerLED) hängen und mit nem 2ten Ausgang die KSQ per PWM pulsen?

Danke & Gruß
Christian
 
Hallo zusammen,
vielen Dank erstmal an alle, die hier so fleißig gepostet haben. Ich habe es auch geschafft und mit dem kleinen HK 6A Regler einen Blitzer für meine Quad gebaut. Auf der Werkbank hat alles prima funktioniert, nur leider habe ich beim Versuch das ganze Einzubauen das Signalkabel bzw. das gesamte Lötpad der Servoleitung abgerissen.... :(

Ich kenn mich leider nicht gut damit aus und habe auch keine Ahnung in welchen Datenblättern ich suchen muss. Hat von euch jemand eine Idee, wo ich das Signal abgreifen kann?
http://0x.ca/sim/esc/HK_261000001/img_4498.jpg
http://0x.ca/sim/esc/HK_261000001/img_4489.jpg

Hier mal zwei gute Bilder aus der SimonK Regler Liste.
Würde mich freuen, wenn jemand eine Idee hat. :) Vielen Dank schonmal.
 

pete1990

Erfahrener Benutzer
Auf der Werkbank hat alles prima funktioniert, nur leider habe ich beim Versuch das ganze Einzubauen das Signalkabel bzw. das gesamte Lötpad der Servoleitung abgerissen.... :(

.
hey,

da bleibt dir dann wohl nur die Leitung an anderer Stelle anzulöten. Im ungünstigten Fall direkt am Prozessor, evtl. ist da aber noch ein Widerstand davor. Ich kann die Leiterbahn heute Abend mal zurückverfolgen und schauen wo du das am besten wieder anlöten kannst. Lötkenntisse in dieser größenordnung natürlich vorrausgesetzt.

bis dann,
Peter
 

konus123

Erfahrener Benutzer
hi, du hast da zweimal die Rückseite verlinkt ! aber mann weiss ja wo die andere seite zu finden ist :)
hab jetzt den gleichen nicht da , hab aber mal einen anderen durchgemessen. sollte der widerstand sein den ich eingezeichnet habe. wenn du dir das bild in der originalgröse anschaust und bissl reinzoomst wirst du auch die leiterbahn erkennen die dorthinführt . ich denke da kannst das Signal abgreifen.

Alex

img_4489.jpg
 

MarenB

Runter kommen sie immer!
Hi Max,

schau dir mal das Bild 4489 an. Oberhalb des Prozessors siehst du acht senkrecht stehende Bauteile. Ganz links, hellbraun, ist ein Kondensator. Rechts daneben, also das erste schwarze Bauteil von links in dieser Reihe ist ein (Vor-)Widerstand über den offenbar das Servo-Signal zum Prozessor geführt wird. Auf dem Foto sieht man ganz gut die überlackierte Leiterbahn. Sie führt vom Lötpad des weißen Kabels am Platinenrand entlang zu diesem Widerstand. An dessen oberes Ende, also zum Platinenrand hin, könntest du das Signal anlöten. Nimm aber bitte dünnen (!) Kupferlackdraht, den du irgendwo, z.B. an der Stelle des ehemaligren Lötpads anklebst, bevor zu das eigentliche Kabel anlötest. Ohne diese Zugentlastung hast du das gleiche Problem bald wieder...

Möglicherweise reicht es aber auch, einen Teil der lackierten Leiterbahn freizulegen? Kommt halt drauf an, wie weit du das Lötpad abgerissen hast...


Edit: Oh, da war der Alex schneller :)
 
FPV1

Banggood

Oben Unten