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