Dienstag, 28. Juni 2016

Die Controllerauswahl

Vorwort

Wie so oft bin ich der Zeit am grübeln, was man noch anders und besser machen kann bei den Motorreglern. Der größte Punkt ist hier bei für mich eine maximal saubere Strommessung. Bisher bin ich mit den ACS Sensoren von Allegro wie auch der Lowside Shuntmessung nicht zufrieden.

Bei der Lowside-Messung stört es mich, dass ich nur einen Messwert pro PWM-Periode zur Verfügung habe und darauf angewiesen bin, dass zum Zeitpunkt der Messung der OP auch auf die korrekte Ausgangsspannung eingeschwungen ist. (Stichwort: settling time / slew rate)

Bei den ACS Sensoren kann ich zwar mehrere Messwerte pro Periode aufnehmen, aber diese Sensoren haben gerade bei Strömen um 0A herum das Problem einer Hysterese. Der Sensor kann quasi keine 0A ausgeben sondern er gibt entweder -0,1A oder +0,1A aus. Bei einem Nulldurchgang des Stromes von negativ nach positiv bleibt der Sensor erst auf -0.1A kleben und springt auf 0.1A wenn der Strom auf 0,1A gestiegen ist. Im Mittel geht sich das meißt aus für langsame Signale. Jedoch hört man die Verformung des Stroms bei höheren Drehzahlen.

Da ich die Motorregler ohne kommerziellen Hintergrund baue und beim Hobby immer gilt: Wie kann ich mit möglichst viel Aufwand Zeit und Geld verbrennen, will ich mich mit diesen Lösungen nicht zufrieden geben auch wenn sie gut funktionieren.

Lange Rede kurzer Sinn: Die STM32 sind mir zu General Purpose. Ich suche einen Motor Control spezifischeren µC mit Cortex M Kern und Floating Point Unit um das portieren und die Einarbeitung möglichst einfach zu halten.

2 Interessante Kandidaten sind hier für mich der ADSP-CM403 von Analog Devices und der XMC4700 von Infineon.


ADSP-CM403

  • ARM Cortex M4 Core with Floating Point Unit to support advanced programming models and complex algorithms with speed grades of 100 to 240 MHz.
  • Dual 16 bit SAR ADCs with no missing codes, 13+ ENOB, 380ns conversion speed for high precision closed loop control.
  • 128 to 384KB SRAM and 256KB to 2MB flash memory options for a wide range of program and data memory requirements.
  • Advanced PWM and timer functions for improved PV inverter and motor drive performance.
  • Two CAN interfaces, three UARTS, two SPIs, two SPORTs, eight 32-bit timers, two two-wire interfaces and four quadrature encoder interfaces.
  • SINC filters for glueless connection to AD74xx isolated converters.
  • Harmonic Analysis Engine for compliant grid connection.
  • 14x14 120 lead LQFP package with 40 GPIO pins, 24 ADC input pins and 2 DAC output pins optimized for PV inverter applications.
  • Up to 105C ambient operating temperature for support of industrial applications.

XMC4700

  • ARM ® Cortex ®-M4 @ 144MHz
  • 1536kB Flash, 276kB RAM
  • Data and IP Protection on Flash
  • 6 x CAN nodes
  • EthernetMAC, USB-OTG, SD/MMC
  • 6 channel USIC (configurable to SPI, UART, IIC, IIS)
  • External Bus Unit
  • 4 x 12-bit ADC, 18 input channels, 4 x parallel sampling and conversion
  • 2 channel 12bit DAC
  • 4 channel ∆Σ Demodulator
  • 24 x 16-bit special purpose timers, dead time generation
  • 2 x Position Interface
  • Watch Dog Timer, Real Time Clock
  • XMC4000 Functional Safety Package
  • LQFP100
  • -40 - 85°C
Der ADSP ist ein ziemliches Monster mit 240MHz und 16Bit ADCs die eine effektive Auflösung von mehr als 13Bit liefern. Der Infineon stellt quasi den vernüftigen Mittelweg dar, aber der ADC ist nicht wirklich besser als der des STM32. Nur die Timer sind vielfältger.

Wenn man einmal genau überlegt was Analog mit dem ADSP für einen Proze baut bin ich tief beeindruckt. Auch wenn die Dinger doppelt so teuer sind. Der STM32 kommt auf eine ENOB von 10,8Bit bei einem 12Bit ADC ist das meiner Meinung nach schon sehr hingelogen. Aber Analog gibt mehr als 13Bit ENOB für den SAR ADC des ADSP an. Das bedeutet eine um mindestens 4mal (fast 8mal) höhere Auflösung als der STM32 liefern kann.

Ich hatte ursprünglich gedacht ich nehme für den Pitchregler des Constant Speed Prop einen XMC1100 aber irgendwie nervt es, sich für so ein im Vergleich kleines Projekt in einen anderen Prozessortyp einzuarbeiten. Ich hatte eigentlich gehofft das DAVE von Infineon mit seinen konfigurierbaren Peripherieblöcken mir die Arbeit bei der Konfiguration der Timer usw. abnimmt. Aber diese Blöcke sind quasi nicht zu gebrauchen. Ein LED Blinky ist damit zu machen, vllt. auch eine LED dimmen und das war es dann auch schon. Für so eine elementare Funktion wie ein Capture für PPM-Eingänge gibt es nicht. Das ist echt schade. Sonst wäre DAVE eine echte Alternative um schnell die Peripheriekonfiguration zusammen zu kloppen und sich dann um die Applikation zu kümmern.

Deshalb gehe ich wieder auf dem STM32F3 für den Pitchregler und die nächste Ausbaustufe für den ThunderDrive wird dann mit dem ADSP-CM4xx implementiert. Leider bietet Analog nur Beispiele und Code-Unterstützung für IAR an. Ich müsste also für eine freie IDE den Startup Code und das Linkerstript für den Prozessor erstellen. Das sollte aber kein allzu großes Hindernis sein. Vor der Konfiguration des Caches des Prozessors habe ich mehr Respekt. Was solls das ist ja schließlich Hobby. Wenn ich so eine voll Inbetriebnahme mit neuer Toolchain in Angriff nehme ist es denke ich auch gleich sinnvoll nicht auf den betagten GCC zu setzen sonder auf cLang zu gehen. Aber da muss ich mich erstmal weiter belesen, wie die cLang Integration mit Eclipse und dem GDB funktioniert.


Mittwoch, 15. Juni 2016

Automatische Schub und Drehzahlregelung bei einem Constant Speed Prop

Im RC-Network wird aktuell ein Thread über den Bau eines Constant Speed Propeller, diskutiert.

Weil das Thema eine interessante Anwendung für einen Umrichter wie den ThunderDrive ist, hatte ich vorgeschlagen die Automatisierung des Props zu übernehmen. Darauf hin kam Jüge, der Threadstarter, auf mich mit ein paar Anforderungen zu.

Im wesentlichen geht es um folgende Betriebsmodi:

  • Normal / CUT: Keine Regelung. Motor über Knüppel und Pitch/Verstellung über Slider.
  • Idle 2 / FLIGHT IDLE: Hier ist das gleiche, nur dass die Drehzahl bei 12000rpm liegt.
  • Idle 1 / GROUND IDLE: Regelung mit Begrenzung bei z.B. 4000rpm. Solange nicht genügend Gas gegeben wird, bleibt der Pitch auf Minimum, um das Moment so klein wie möglich zu halten, damit der Prop auf die gesetzte Drehzahl beschleunigen kann. Hat der Propeller 4000rpm erreicht und es wird mehr Gas gegeben, so erhöht der Regelkreis den Pitch, um das Moment zu überhöhen.

Zu erst dachte ich, das wirt simpel. Drehzahl messen und regeln mit dem Pitch als Stellgröße. Ein simpler PI-Regler würde das schon tun. Aber so einfach wie es auf den 1. Blick wirkt ist das Thema aber gar nicht. Was ich nicht bedacht hatte, war das unterschiedliche Verhalten der Antriebe. Ein Verbrennungsantrieb (Egal ob Zerknalltreibling oder Turbine) ist leistungsgesteuert, Mehr Gas ergibt mehr Leistung, aber bei konstantem Gas bricht bei Belastung die Drehzahl ein. Das ergibt sich aus der Gleichung für die mechanische Leistung.

Leistung = Drehmoment * Drehzahl

Ersetzt man den Verbrennungsantrieb durch einen BLDC-Motor mit einem Standard BLDC-Regler, hat man keinen leistungsgesteuerten Antrieb mehr sondern einen drehzahlgesteuerten Antrieb. Das ergibt sich einfach gesagt aus der Drehzahlkonstante Kv die üblicherweise in rpm/V angegeben wird und der Arbeitsweise der BLDC-Regler. Denn diese "Regler" stellen abhängig von ihrem Sollwert (0% - 100%) eine Spannung von 0 - Akkuspannung ein. Im Leerlauf entspricht die Drehzahl des Motors

Drehzahl = Sollwert * Kv * Akkuspannung

Jetzt mag man geneigt sein zu sagen, dass die Drehzahl unter Belastung auf bei E-Motor absinkt und das stimmt auch aber nur um einen sehr geringen Teil:

Drehzahl = Sollwert * Kv * Akkuspannung - Rs * Wicklungsstrom

Rs ist der Innenwiderstand der Wicklung (Der wird sogar bei Modellbaumotoren oft angegeben). Der Strom durch die Wicklung welcher sich durch die Belastung des Motors ergibt sorgt somit für einen Spannungsabfall in der Wicklung. Das hat zur Folge das die Spannung die der Motor in Drehzahl umsetzen kann sinkt und folglich auch die Drehzahl an der Welle. ABER der Rs ist so gering, dass man diese Spannung auch vernachlässigen kann. Übliche Werte für Rs liegen je nach Leistungsklasse des Motors bei 100mOhm bis runter zu 10mOhm. Die Drehzahl sinkt so unter Volllast nur um gut 10% ab.

Selbst wenn man den Innenwiderstand der Motor- und Akkuzuleitungen sowie den Innenwiderstand des Akkus selbst mit einbezieht kommen nicht mehr als 20% Drehzahleinbruch zusammen.

Long story short: Wenn der Gasknüppel so steht das der Prop an die eingestellte Drehzahl des Pitchreglers kommt, dann würden 2 Rasten mehr am Knüppel dazuführen das der Motor überlastet wird weil der Pitchregler versucht die Drehzahl mit mehr Pitch zu halten und der Motor der höheren Spannung des Reglers folgt. Die einzige Variable Größe ist hier der Strom und der steigt soweit an des entweder der Motor oder der Regler stirbt.

Deshalb braucht der Pitchregler nicht nur die Drehzahl sondern auch den Strom des Motors um die Motorleistung zu messen. Damit kann dann auf den Gasknüppel eine Antriebsleistung von 0%-100% gelegt werden.

So glaube ich ließe sich zum einen ein Scale-Verhalten des gesamten Antriebs erreichen und eine maximale Feinfühligkeit für den Schub am Knüppel. Außerdem kann der Pitchregler so immer sicherstellen, dass Motor und Regler nicht überlastet werden.

Und all das will ich fürs erste in ein XMC2Go packen.