- zawiera kontroler typu PCA9685 sterowany poprzez magistralę I2C,
- 16 niezależnych kanałów PWM o rozdzielczości 12 bitów,
- wydajność prądowa wyjść pozwala na sterowanie prądem do 25 mA,
- możliwość wyboru konfiguracji wyjść (open-drain lub totem-pole).
Moduł bazuje na specjalizowanym generatorze PWM typu PCA9685 sterowanym poprzez magistralę I2C. Ma on 16 niezależnych kanałów o rozdzielczości 12 bitów. Wydajność prądowa wyjść pozwala na sterowanie prądem do 25 mA (otwarty dren OD), co umożliwia bezpośrednie zasilanie np. diod RGB. Częstotliwość PWM może zostać wybrana z zakresu od 24 do 1526 Hz poprzez zmianę podziału częstotliwości wbudowanego oscylatora. Wyjścia Ln mają możliwość wyboru konfiguracji pomiędzy open drain lub totem pole przydatnej przy współpracy z zewnętrznymi driverami. Schemat wewnętrzny układu PCA9685 został pokazany na rysunku 1.
Budowa i działanie
Schemat modułu został pokazany na rysunku 2. Układ zasilany jest zewnętrznym napięciem 5 V doprowadzonym do złącza PWR. Zwora V50 umożliwia zasilanie Raspberry Pi napięciem zasilającym moduł. W przypadku współpracy z serwomechanizmami należy zapewnić odpowiednia jakość i wydajność źródła zasilania, aby Raspberry Pi pracowało niezawodnie. Napięcie 5 V doprowadzone jest do złączy VS oraz SA...SD, gdzie służy do zasilania podłączonych elementów wykonawczych.
Układ U1 jest odpowiedzialny za generowanie sygnałów PWM, które doprowadzone są do dwóch grup złączy: PWM typu SIP2,54 (sygnały PWM0...7) umożliwiających podłączenie standardowych serwomechanizmów z przewodem 3-żyłowym oraz do złączy SA...SD (sygnały PWM8...15) w standardzie Grove. Do złączy Grove doprowadzone są po dwa sygnały PWM, standardowy serwomechanizm w wersji mini wykorzystuje tylko jeden sygnał, aby wykorzystać oba wyprowadzone PWM, należy użyć kabla rozdzielającego.
Każdy z sygnałów PWM0...15 ma rezystor szeregowy 220 Ω, co nie zakłóca sterowania serwomechanizmem, a upraszcza bezpośrednie sterowanie LED i stanowi także podstawowe zabezpieczenie wyjść PCA9685. Układ U2 typu PCA9306 jest konwerterem poziomów logicznych pomiędzy PCA9685 zasilanym z 5 V, a magistralą I2C Raspberry Pi pracującą w standardzie 3,3 V. Układ uzupełniają zwory A0, A1 umożliwiające ustawienie czterech adresów bazowych modułu, co umożliwia generowanie do 64 kanałów PWM.
Montaż i uruchomienie
Moduł został zmontowany na dwustronnej płytce drukowanej o wymiarach zgodnych z Raspberry Pi Zero, ale oczywiście może być stosowany także w pozostałych wersjach. Schemat płytki wraz z rozmieszczeniem elementów został pokazany na rysunku 3. Montaż jest typowy, należy tylko zwrócić uwagę na przylutowanie padu termicznego układu U1, który zapewnia prawidłowe odprowadzanie ciepła. Na koniec należy ustawić adres układu na magistrali I2C za pomocą zworek A1, A0.
Sterowanie wyjściami Ln odbywa się poprzez odpowiednią konfigurację generatorów PWM układu PCA9685. W sieci można znaleźć wiele bibliotek ułatwiających sterowanie układem, ale do sprawdzenia działania wystarczy odpowiednia konfiguracja rejestrów układu. Strukturę rejestrów konfiguracyjnych układu zestawiono w tabeli 1.
W zależności od potrzeb możliwa jest komunikacja z poszczególnymi rejestrami poprzez adresowanie indywidualne, zgodnie z rysunkiem 4 lub adresowanie grupowe, co zostało pokazane na rysunku 5. Odczyt odbywa się podobnie. Dokładniejsze informacje i dodatkowe tryby adresowania zamieszczone są w nocie katalogowej.
Podstawowe rejestry konfiguracyjne dla zastosowanego w module trybu pracy zostały umieszczone w tabeli 2.
Po włączeniu zasilania i uruchomieniu systemu obecność układu na magistrali sprawdzamy poleceniem:
Powinien zostać wskazany adres PCA9685 z zakresu 0x50...0x53 odpowiadający ustawieniu zwór A1, A0. Dla sprawdzenia działania modułu do złącza PWM0 oraz VS podłączamy diodę LED. Poleceniem:
ustawiamy tryb sleep. Teraz możemy skonfigurować prescaler na 1562 Hz poleceniem:
Następnie wracamy do normalnego trybu pracy układu, wpisując:
Ustawiamy wyjścia zanegowane (bezpośrednie sterowanie LED) oraz konfigurację wyjścia typu otwarty dren:
Inicjujemy rejestry cykli PWM:
i2cset -y 1 0x50 0x06 0x00
i2cset -y 1 0x50 0x07 0x00
i2cset -y 1 0x50 0x08 0x00
i2cset -y 1 0x50 0x09 0x00
Sprawdzamy załączenie LED0, bez generatora PWM:
i2cset -y 1 0x50 0x07 0x00
Sprawdzamy wyłączenie LED0, bez generatora PWM:
i2cset -y 1 0x50 0x09 0x00
Sterowanie sygnałem PWM odbywa się przez dwa 12-bitowe rejestry. Pierwszy – LEDn_ON określa czas załączenia, drugi – LEDn_OFF czas wyłączenia wyjścia Ln. Długości cyklu ustawione w rejestrach są porównywane z 12-bitowym licznikiem, co umożliwia elastyczne sterowanie wyjściem (rysunek 6).
Wygenerowanie sygnału PWM z wypełnieniem 50%, bez początkowego przesunięcia cyklu wymaga następujących zapisów do rejestrów:
cykl załączenia ON: 2048,
cykl wyłączenia OFF: 2047 (2048 – 1).
Po rozbiciu na wartości 8-bitowe wpisujemy do rejestrów odpowiednio:
LED0_ON_H = 0x00,
LED0_ON_L = 0x00,
LED0_OFF_H = 0x07,
LED0_OFF_L = 0xFF.
Realizujemy to poleceniami:
i2cset -y 1 0x50 0x07 0x00
i2cset -y 1 0x50 0x08 0xFF
i2cset -y 1 0x50 0x09 0x07
Dobierając odpowiednio ustawienia preskalera i generatorów PWM, tak aby okres przebiegu wynosił 20 ms, a czas załączenia wyjścia zależnie od kąta obrotu 1...2 ms oraz ustawiając wyjścia jako totem pole otrzymujemy możliwość precyzyjnego sterowania do 16 serwomechanizmów.
Adam Tatuś, EP
- R1, R2: 2,2 kΩ SMD0603
- R3, R4: 4,7 kΩ SMD0603
- R5: 200 kΩ SMD0603
- RP1…RP4: 220 Ω drabinka rezystorowa
- C1…C3, C6: 4,7 µF SMD0603
- C4, C5, C7: 0,1 µF SMD0603
- CE1…CE3: 100 µF/10 V elektrolityczny SMD 6,3 mm
- U1: PCA9685BS (QFN28)
- U2: PCA9306DCT (SSOP8)
- GND, PWM, VS: złącze SIP8 (1×8 pinów) 2,54 mm
- GPIO: złącze IDC40 żeńskie (2×20 pinów) 2,54 mm
- PWR: złącze śrubowe DG381-3,5-2
- V50: złącze SIP2 (1×2 piny) 2,54 mm