
Witajcie moi drodzy
Dziś przedstawię moją płytkę startową pod 16-bitowy mikrokontroler dsPIC33EP512GM304 wykonaną w technologii SMD. Płytkę bazowałem na źródłach Eagle od Arduino, więc wygląda do niego niewątpliwie podobnie.
Projekt płytki
Projekt płytki bazuje na jednej z wersji Arduino Uno, ale zmienione są praktycznie wszystkie komponenty. Oryginalny został w zasadzie tylko kształt:

Wszystkie elementy (za wyjątkiem pinów, które chciałem mieć możliwość łatwo lutować i montować z obu stron) są w obudowach SMD (montażu powierzchniowego).
Pinout płytki nie miał być i nie jest zgodny z Arduino, zresztą tych pinów byłoby troszkę na to za dużo.
Piny '5V-tolerant' (pozwalające na wejście rzędu 5V) na płytce opisane są pogrubioną czcionką, pozostałe znoszą napięcia tylko raczej do 3.3V.
Na płytce znajduje się:
- mikrokontroler dsPIC33EP512GM304 wraz z rezonatorem kwarcowym 8MHz
- konwerter USB-UART MCP2221 do komunikacji UART i zdalnego resetowania PICa, z dodatkowymi pinami wyprowadzonymi na PCB
- stabilizator MIC2940A zamontowany powierzchniowo (LDO 3.3V)
- układ resetowania PICa (ostatecznie zrealizowany na DTC114EM3)
Schemat umieszczam tutaj, lecz nie jest to finalna wersja i może zawierać błędy:
Poniżej omówię dokładnie każdą z sekcji płytki.
Mikrokontroler dsPIC33EP512GM304
Sercem płytki jest 16-bitowy mikrokontroler dsPIC33EP512GM304 od Microchipa w obudowie TQFP44:

Normalnie zasilany jest napięciem 3.3V. Jego piny przedstawia schemat (piny 5V-tolerant zaznaczone są na szaro):

dsPIC33EP512GM304 posiada 512 kilobajtów pamięci Flash, 48 kilobajtów RAM i bogate sprzętowe peryferia, obejmujące 4 moduły UART, 3 SPI, 2 I2C, 9 timerów 16-bitowych, 4 timery 32-bitowe i o wiele więcej. Oferuje on też m. in. funkcjonalność PPS (Peripheral Pin Select) która pozwala wedle uznania zmapować funkcje takie jak UART/SPI/I2C na wybrane jego piny.
Znajduje się oczywiście w centrum płytki:

Do tej płytki można też użyć pokrewnego PICa, o ile ma zgodny pinout. W przyszłości będzie to też zapewne wymagać rekompilacji bootloadera (o ile taki powstanie) pod nowego, wybranego PICa.
Datasheet dsPIC33EP512GM304:
Regulator LDO MIC2940A
O dobre i stabilne 3.3V zasilania dla dsPICa na płytce dba potężny regulator LDO (Low Dropout Voltage) MIC2940A od Microchipa (kiedyś Micrela):

Maksymalne napięcie wejścia płytki to aż 26V, chociaż wtedy oczywiście troszkę ciepła wydzieli się na stabilizatorze.

Zgodnie z notą katalogową stabilizator ten jest w stanie znieść ponad jeden amper!
A nawet w samej nocie katalogowej producent określa ten LDO mianem "bulletproof":

MIC2940A rezyduje w bloku zasilania wraz z dwoma diodami schotkiego MBRA140:

MBRA140 tutaj chroni wzajemnie od siebie źródła zasilania i pozwala podłączyć USB jednocześnie przy użyciu zewnętrznego zasilacza.
Datasheet MIC2940A:
Konwerter USB-UART MCP2221
Do projektu użyłem konwertera USB-UART MCP2221 w obudowie SOIC:

Oferuje on:
- wirtualny port COM (UART)
- wirtualną magistralę I2C (piny SCL i SDA)
- dwie diody LED pokazujące aktywność UART
- dodatkowe piny GPIO którymi można sterować z komputera
MCP2221 znajduje się w rogu płytki, podłączony jest do złącza mini USB:

Jego piny RXLED/TXLED są na stałe podłączone do LEDów oznaczających aktywność UART.
MCP2221 ma na PCB wyprowadzone niektóre swoje piny:

Do tego na warstwie bottom ma podprowadzone sygnały swoich pinów RX/TX do wybranych pinów dsPIC, tak by można było w wybranym miejscu zrobić zworkę z pomocą kropelki cyny. Mikrokontroler nie ma swojego UART na wybranych pinach, można mu wybrać którym pinom nadamy rolę U1TX/U1RX z pomocą PPS (Peripheral Pin Select):

Nota katalogowa MCP2221 do pobrania:
Układ resetowania płytki z poziomu komputera
Na płytce znajduje się układ zdalnego resetowania PICa z poziomu komputera.
Sterowanie resetem odbywa się z pomocą wolnego pinu GPIO z MCP2221.
Oczywiście można też resetować PICa przyciskiem który jest na płytce.
Zrealizowany jest (docelowo) na tranzystorze DTC114EM3:

DTC114EM3 to tzw. Digital Transistor (BRT). Składa się on z tranzystora i dwóch rezystorów, a wszystko to znajduje się w malutkiej obudowie SOT−723.

Tutaj jego cała nota katalogowa do pobrania:
Początkowo nie zamierzałem z niego korzystać, dlatego schemat/PCB przedstawia troszkę co innego, ale na szczęście jego pinout zgadza się z tym co użyłem i wszystko działa też z nim.

Sam układ resetowania jak na ten moment testowałem z pomocą MCP2221 Utility od Microchipa na systemie Windows 10:

Na powyższym zrzucie ekranu funkcją odpowiedzialną za resetowanie PICa jest pin GP2 w trybie GPIO:
- ustawiony w tryb niski (Logical Low) pozwala PICowi na działanie
- ustawiony w tryb wysoki (Logical High) wprowadza PIC w stan RESET
Krótki filmik (z trudem nagrany tak, by złapać ostrość) przedstawia, że to rzeczywiście działa (na PICa jest wgrany blink LED):
Lutowanie płytki
Całość samodzielnie zlutowałem z pomocą mojej lutownicy:

Tutaj umieszczę zdjęcia z poszczególnych etapów lutowania.
Przygotowane elementy:

Pierwsze postępy:

Po przylutowaniu złącz:

W trakcie pierwszego testu na szybko czy programator (użyłem PICKIT3) widzi dsPICa:

Gotowy (bez LEDów), oczyszczony z topnika projekt:



Proste przykłady kodów dla Mikro C PRO for dsPIC
Umieszczam tutaj do pobrania proste przykładowe kody dla tej płytki napisane w MikroC PRO for dsPIC. Sporządziłem je konkretnie pod tą płytkę na podstawie dokumentacji i noty katalogowej PICa.
Wszystkie one używają zewnętrznego rezonatora 8MHz.
Przykład 1: Blink LED
Jest to najprostszy Blink LED który miga diodami na portach A, B i C. Całość była testowana w ten sposób:

Załącznik do pobrania (kod, projekt MikroC, skompilowany hex):
Przykład 2: Wydruk danych na UART
Jest to przykład użycia UART i siłą rzeczy też PPS (Peripheral Pin Select), gdyż w jakiś sposób trzeba przypisać funkcję U1TX do wybranego pinu RP*. Do odbierania danych tutaj użyłem MCP2221 z płytki. Całość była testowana w takiej konfiguracji (na zdjęciu zaznaczyłem kabelek od U1TX):

Rezultat w RealTerm:

Załącznik do pobrania (kod, projekt MikroC, skompilowany hex):
Przykład 3: Blink LED - Timer 1
Efekt tego przykładu jest taki sam jak w przypadku pierwszego, ale tutaj zrealizowany jest z pomocą przerwania i Timera 1.
Załącznik do pobrania (kod, projekt MikroC, skompilowany hex):
Przykład 4: Blink LED - Timer 2
Efekt tego przykładu jest taki sam jak w przypadku pierwszego, ale tutaj zrealizowany jest z pomocą przerwania i Timera 2.
Załącznik do pobrania (kod, projekt MikroC, skompilowany hex):
Przykład 5: Blink LED - Timer 3
Efekt tego przykładu jest taki sam jak w przypadku pierwszego, ale tutaj zrealizowany jest z pomocą przerwania i Timera 3.
Załącznik do pobrania (kod, projekt MikroC, skompilowany hex):
Przykład 6: Odczyt ADC i wydruk na UART
Program ten odczytuje wartość napięcia za pomocą ADC (a dokładnie to z pinu AN1) i wysyła ją na UART. Wartość jest z zakresu 0-1023. Na wejście AN1 podłączony jest potencjometr, a dokładniej to jego środkowy pin. Jego skrajne piny są podłączone na masę i zasilanie, dzięki czemu całość tworzy dzielnik napięcia. Napis wysyłany na UART jest formatowany z pomocą funkcji scanf.
Układ testowy wygląda tak:


Rezultat w konsoli (wartość zmienia się w trakcie obracania potencjometru):

Załącznik do pobrania (kod, projekt MikroC, skompilowany hex):
Przykład 7: Dwa PWM i wydruk na UART
Ten program demonstruje użycie dwóch wyjść PWM z dsPIC33EP512GM304. Niezbędne w tym celu jest zmapowanie ich za pomocą PPS na wybrane dwa piny RP*, w tym przypadku wybrałem RB11 i RB10. Program zmienia płynnie w czasie wypełnienie obu wyjść, jednego szybciej, drugiego wolniej, wypisuje ich bieżącą wartość na UART, a w ramach testu do nich podłączone są dwie diody LED.
Testowy układ (tylko żółta i niebieska dioda są podłączone, potencjometr nieużywany):

Rezultat działania w terminalu:

Filmik z działania:
Załącznik do pobrania (kod, projekt MikroC, skompilowany hex):
Dalszy rozwój projektu
Płytka w swojej bieżącej formie jest funkcjonalna i można na niej rozwijać projekty, ale i tak pozostało kilka rzeczy do zrobienia. Przede wszystkim:
- planuję zrobić dla niej bootloader, który pozwoli ją programować tak jak Arduino UNO. Płytka będzie resetowana przez MCP2221 a potem przez UART wysyłany będzie nowy wsad
- trzeba poprawić dla niej układ resetowania PICa na PCB, usunąć zbędne rezystory, bo w bieżącej formie ze schematu jest nieco nieprzemyślany (i docelowo używać już DTC114EM3)
- trzeba poprawić drobne błędy na warstwie opisowej, np. napis "7-15V" przy wejściu zasilania
- można by pewnie przerobić tak by piny były chociaż troszkę zgodne z shieldami od Arduino, zwłaszcza że ten dsPIC oferuje PPS (mozna sobie wybrać funkcje dla pinów w miarę możliwości), ale naprawdę nie wiem czy znajdę na to czas, a shieldów Arduino i tak sam nie używam... może jakby było większe zainteresowanie projektem...
Podsumowanie
Projekt był składany i uruchamiany "na raty" przez olbrzymi brak czasu, ale wreszcie udało się zakończyć pomyślnie jego podstawowy etap. dsPIC33EP512GM304 działa poprawnie na mojej płytce, mogę się z nim komunikować poprzez MCP2221, jak również zdalnie go resetować. Całość na ten moment programuje przez PICKIT3, ale w przyszłości może to być możliwe za pomocą bootloadera, bez wymogu zewnętrznego programatora.
Zostało mi trochę płytek pod ten projekt, więc jak ktoś jest zainteresowany to proszę dać znać.
Cool? Ranking DIY