PicoBasic Servosteuerung mit Tiny3216                      

Elektronik-Labor  Projekte  Mikrocontroller  PicoBasic         




Der neue USB/Seriell-Wandler CH340N  hat mich inspiriert, ein PicoBasic-System mit dem Tiny3216 besonders kompakt und stabil aufzubauen. Die Leitungen der seriellen Schnittstelle liegen nun unterhalb der Platinen. Der Widerstand mit 4,7 k für die UPDI-Programmierung kann im normalen Betrieb stecken bleiben. Wenn man einmal die Firmware ändern will, dürfen TXD und RXD am Controller verbunden bleiben. Es reicht ein Kabel von RX nach UPDI, um den Controller neu zu programmieren. Wichtig ist dabei nur, dass gerade kein PicoBasic-Programm läuft, das Print verwendet. Einmal programmiert, kann der Controller allein irgendwo eingebaut werden und zum Beispiel Servos steuern.



Zum Test des Systems habe ich eine Dreifarben-LED angeschlossen. Der direkte Betrieb ohne Vorwiderstände war möglich, weil die Ausgänge selbst den Strom begrenzen. Die LED war mir aber zu hell. Deshalb habe ich ein Programm geschrieben, das die drei Grundfarben allein über die Pullups ansteuert.

              REM Pullblink
0x0900  Pdir = 0
              L1:
0x0A01  Pullup = 1
0x1A01  Delay s = 1
0x0A02  Pullup = 2
0x1A01  Delay s = 1
0x0A04  Pullup = 4
0x1A01  Delay s = 1
0x2001  Goto L 1:

Was ich schon länger einmal testen wollte, ist eine Servo-Ansteuerung. Wegen der Motor-Impulsströme habe ich eine eigene Stromversorgung über einen kleinen Akku verwendet. Die Servo-Impulse im Bereich 1 ms bis 2 ms werden an P0 erzeugt und zur Vorsicht über 10 k an den Servo geleitet.




Es soll eine langsame, sinusförmige Bewegung entstehen. Deshalb wird mit der Erweiterungsfunktion Gosub L244 die Sinustabelle geladen. Die variable Impulslänge wird über eine C-Schleife gesteuert. Zusätzlich wird die Mindest-Impulslänge von 1 ms über viermal  Delay us 250 erzeugt. Warum denn nicht einfach Delay ms 1? Ja, darauf bin ich auch erst hereingefallen und musste lange nach dem Fehler suchen. Das Problem ist, dass alle Wartebefehle ab einer Millisekunde bis zur nächsten angefangenen Millisekunde warten. Damit würde die Impulslänge aber wieder auf ganze Millekunden glattgefeilt.

              REM Servo
0x09FF  Pdir = 255
0x21F4  Gosub L244:
              REM Sinus
              L1:
0x0800  Pout = 0
0x1914  Delay ms = 20
0x0801  Pout = 1
0x3A00  A = [B+]
0x3200  A = A Shr 1
0x18FA  Delay µs = 250
0x18FA  Delay µs = 250
0x18FA  Delay µs = 250
0x18FA  Delay µs = 250
0x3600  C = A
              L2:
0x250C  C*Goto L2:
0x0800  Pout = 0
0x2002  Goto L1:

Die Sinustabelle enthält Werte von 0 bis 255. Weil aber jede C-Schleife rund 6 µs braucht, käme man auf zusätzliche 1,5 ms. Der Servo geht damit an den Anschlag. Deshalb wurde die Aussteuerung mit einem Shift-Befehl A = A Shr 1 halbiert. Die Impulslänge variiert jetzt zwischen 1 ms und 1,75 ms.



Das Programm läuft ohne Änderungen auch auf dem Arduino Nano, diesmal mit einem kleineren Servo.


Elektronik-Labor  Projekte  Mikrocontroller  PicoBasic