On-Board-MCU¶
Der Robot HAT ist mit einem AT32F415CBT7 Mikrocontroller von Artery ausgestattet. Es handelt sich um einen ARM Cortex-M4 Prozessor mit einer maximalen Taktfrequenz von 150MHz. Der Mikrocontroller verfügt über 256KB Flash-Speicher und 32KB SRAM.
Das Onboard-PWM und ADC werden vom Mikrocontroller gesteuert. Die Kommunikation zwischen dem Raspberry Pi und dem Mikrocontroller erfolgt über die I2C-Schnittstelle. Die für die Kommunikation verwendete I2C-Adresse ist 0x14 (7-Bit-Adressformat).
Einführung¶
Der RESET-Pin des Onboard-MCU ist mit dem Raspberry Pi GPIO 5 oder MCURST
für robot_hat.Pin
verbunden. Der MCU verwendet die 7-Bit-Adresse 0x14
.
ADC¶
Registeradressen sind 3 Byte, von 0x170000 bis 0x140000 sind es ADC-Kanäle 0 bis 3. Die ADC-Präzision beträgt 12 Bit, und der Wert liegt zwischen 0 und 4095. Weitere Einzelheiten finden Sie in robot_hat.ADC
.
Adresse |
Beschreibung |
---|---|
|
ADC-Kanal 0 |
|
ADC-Kanal 1 |
|
ADC-Kanal 2 |
|
ADC-Kanal 3 |
|
ADC-Kanal 4 (Batteriestand) |
Beispiel:
ADC-Wert des Kanals 0 lesen:
from smbus import SMBus
bus = SMBus(1)
# smbus only support 8 bit register address, so write 2 byte 0 first
bus.write_word_data(0x14, 0x17, 0)
msb = bus.read_byte(0x14)
lsb = bus.read_byte(0x14)
value = (msb << 8) | lsb
PWM¶
PWM hat ein 1-Byte-Register mit 2-Byte-Werten.
Ändern der PWM-Frequenz¶
Die Frequenz wird mit Vorwähler und Periode definiert.
Um die Frequenz einzustellen, müssen Sie zuerst die gewünschte Periode definieren. Wie bei Arduino ist dies normalerweise 255, oder wie bei PCA9685 4095.
Die CPU-Taktfrequenz beträgt 72 MHz. Dann können Sie den Vorwähler aus Ihrer gewünschten Frequenz berechnen
Vorwähler = 72MHz / (Periode + 1) / Frequenz - 1
Wenn Ihnen die Periode egal ist, gibt es eine Möglichkeit, sowohl die Periode als auch den Vorwähler aus der Frequenz zu berechnen. Siehe robot_hat.PWM.freq()
.
Pulsbreite¶
Die Kontrolle der Pulsbreite des Kanals ist recht einfach, schreiben Sie einfach den Wert in das Register.
Aber was ist der Wert? Wenn Sie die PWM auf eine 50%-Pulsbreite einstellen möchten, müssen Sie genau wissen, was die Periode ist. Basierend auf der oben genannten Berechnung, wenn Sie die Periode auf 4095 einstellen, dann entspricht das Setzen des Puls-Wertes auf 2048 ungefähr einer 50%-Pulsbreite.
Adresse |
Beschreibung |
---|---|
|
PWM-Kanal 0 Einschaltwert einstellen |
|
PWM-Kanal 1 Einschaltwert einstellen |
|
PWM-Kanal 2 Einschaltwert einstellen |
|
PWM-Kanal 3 Einschaltwert einstellen |
|
PWM-Kanal 4 Einschaltwert einstellen |
|
PWM-Kanal 5 Einschaltwert einstellen |
|
PWM-Kanal 6 Einschaltwert einstellen |
|
PWM-Kanal 7 Einschaltwert einstellen |
|
PWM-Kanal 8 Einschaltwert einstellen |
|
PWM-Kanal 9 Einschaltwert einstellen |
|
PWM-Kanal 10 Einschaltwert einstellen |
|
PWM-Kanal 11 Einschaltwert einstellen |
|
Geschwindigkeit von Motor 2 Einschaltwert einstellen |
|
Geschwindigkeit von Motor 1 Einschaltwert einstellen |
Vorteiler¶
Register ab 0x40 dienen zur Einstellung des PWM-Vorteilers. Der Bereich umfasst 0~65535. Es gibt nur 4 Timer für alle 14 Kanäle. Siehe PWM Timer(WICHTIG)
Adresse |
Beschreibung |
---|---|
|
Timer 0 Vorteiler einstellen |
|
Timer 1 Vorteiler einstellen |
|
Timer 2 Vorteiler einstellen |
|
Timer 3 Vorteiler einstellen |
Periode¶
Register ab 0x44 dienen zur Einstellung der PWM-Periode. Der Bereich umfasst 0~65535. Es gibt nur 4 Timer für alle 14 Kanäle. Siehe PWM Timer(WICHTIG)
Adresse |
Beschreibung |
---|---|
|
Timer 0 Periode einstellen |
|
Timer 1 Periode einstellen |
|
Timer 2 Periode einstellen |
|
Timer 3 Periode einstellen |
PWM-Timer(WICHTIG)¶
Was ist ein PWM-Timer? Der PWM-Timer ist ein Werkzeug, um den PWM-Kanal für Sie ein- und auszuschalten.
Der MCU hat nur 4 Timer für PWM: Das bedeutet, Sie können die Frequenz nicht für verschiedene Kanäle mit demselben Timer einstellen.
Beispiel: Wenn Sie die Frequenz auf Kanal 0 einstellen, werden die Kanäle 1, 2, 3 beeinflusst. Wenn Sie die Frequenz von Kanal 2 ändern, werden die Kanäle 0, 1, 3 überschrieben.
Dies geschieht beispielsweise, wenn Sie sowohl einen passiven Summer (der ständig die Frequenz ändert) als auch einen Servo (der eine feste Frequenz von 50 Hz benötigt) steuern möchten. Dann sollten Sie diese auf zwei verschiedene Timer aufteilen.
Timer |
PWM-Kanal |
---|---|
Timer 0 |
0, 1, 2, 3 |
Timer 1 |
4, 5, 6, 7 |
Timer 2 |
8, 9, 10, 11 |
Timer 3 |
12, 13 (für Motoren) |
Beispiel¶
from smbus import SMBus
bus = SMBus(1)
# Set timer 0 period to 4095
bus.write_word_data(0x14, 0x44, 4095)
# Set frequency to 50Hz,
freq = 50
# Calculate prescaler
prescaler = int(72000000 / (4095 + 1) / freq) - 1
# Set prescaler
bus.write_word_data(0x14, 0x40, prescaler)
# Set channel 0 to 50% pulse width
bus.write_word_data(0x14, 0x20, 2048)
MCU zurücksetzen¶
Derzeit liest die Firmware einen festen 3-Byte-Wert, dann kann sie ADC-Werte zurückgeben oder PWM steuern. Deshalb benötigt das ADC-Register 3 Byte, wobei die letzten 2 Byte 0 sind.
Wenn Ihr Programm mitten in der Kommunikation unterbrochen wird, kann die Firmware hängen bleiben und die Daten verschieben. Selbst wenn wir ein Timeout beim Warten auf 3-Byte-Daten haben.
Wenn dies der Fall ist, müssen Sie den MCU zurücksetzen. Um ihn zurückzusetzen, können Sie den Befehl robot_hat verwenden:
robot_hat reset_mcu
Oder Sie können es in Ihrem Python-Code tun:
from robot_hat import reset_mcu
reset_mcu()
Oder Sie können einfach den Reset-Pin (GPIO 5) für 10 ms herunterziehen und dann für weitere 10 ms wieder hochziehen, denn das ist es, was reset_mcu
macht.
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(5, GPIO.OUT)
GPIO.output(5, GPIO.LOW)
time.sleep(0.01)
GPIO.output(5, GPIO.HIGH)
time.sleep(0.01)