Elektroda.pl
Elektroda.pl
X
Computer ControlsComputer Controls
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Moja płytka startowa dla dsPIC33EP512GM304 wzorowana na Arduino

p.kaczmarek2 07 Sty 2020 12:14 1503 10
  • Moja płytka startowa dla dsPIC33EP512GM304 wzorowana na Arduino
    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:
    Moja płytka startowa dla dsPIC33EP512GM304 wzorowana na Arduino
    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:
    dsPIC33_br...ino_20.pdf Download (109.5 kB)Punkty: 3 dla użytkownika
    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:
    Moja płytka startowa dla dsPIC33EP512GM304 wzorowana na Arduino
    Normalnie zasilany jest napięciem 3.3V. Jego piny przedstawia schemat (piny 5V-tolerant zaznaczone są na szaro):
    Moja płytka startowa dla dsPIC33EP512GM304 wzorowana na Arduino
    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:
    Moja płytka startowa dla dsPIC33EP512GM304 wzorowana na Arduino
    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:
    dsPIC33EP5...asheet.pdf Download (4.27 MB)

    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):
    Moja płytka startowa dla dsPIC33EP512GM304 wzorowana na Arduino
    Maksymalne napięcie wejścia płytki to aż 26V, chociaż wtedy oczywiście troszkę ciepła wydzieli się na stabilizatorze.
    Moja płytka startowa dla dsPIC33EP512GM304 wzorowana na Arduino
    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":
    Moja płytka startowa dla dsPIC33EP512GM304 wzorowana na Arduino
    MIC2940A rezyduje w bloku zasilania wraz z dwoma diodami schotkiego MBRA140:
    Moja płytka startowa dla dsPIC33EP512GM304 wzorowana na Arduino
    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:
    MIC2940A_d...asheet.pdf Download (326.61 kB)

    Konwerter USB-UART MCP2221
    Do projektu użyłem konwertera USB-UART MCP2221 w obudowie SOIC:
    Moja płytka startowa dla dsPIC33EP512GM304 wzorowana na Arduino
    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:
    Moja płytka startowa dla dsPIC33EP512GM304 wzorowana na Arduino
    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:
    Moja płytka startowa dla dsPIC33EP512GM304 wzorowana na Arduino
    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):
    Moja płytka startowa dla dsPIC33EP512GM304 wzorowana na Arduino
    Nota katalogowa MCP2221 do pobrania:
    MCP2221_da...asheet.pdf Download (1.19 MB)

    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:
    Moja płytka startowa dla dsPIC33EP512GM304 wzorowana na Arduino
    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.
    Moja płytka startowa dla dsPIC33EP512GM304 wzorowana na Arduino
    Tutaj jego cała nota katalogowa do pobrania:
    DTC114EM3_...asheet.pdf Download (132.58 kB)
    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.
    Moja płytka startowa dla dsPIC33EP512GM304 wzorowana na Arduino
    Sam układ resetowania jak na ten moment testowałem z pomocą MCP2221 Utility od Microchipa na systemie Windows 10:
    Moja płytka startowa dla dsPIC33EP512GM304 wzorowana na Arduino
    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:
    Moja płytka startowa dla dsPIC33EP512GM304 wzorowana na Arduino
    Tutaj umieszczę zdjęcia z poszczególnych etapów lutowania.
    Przygotowane elementy:
    Moja płytka startowa dla dsPIC33EP512GM304 wzorowana na Arduino
    Pierwsze postępy:
    Moja płytka startowa dla dsPIC33EP512GM304 wzorowana na Arduino
    Po przylutowaniu złącz:
    Moja płytka startowa dla dsPIC33EP512GM304 wzorowana na Arduino
    W trakcie pierwszego testu na szybko czy programator (użyłem PICKIT3) widzi dsPICa:
    Moja płytka startowa dla dsPIC33EP512GM304 wzorowana na Arduino
    Gotowy (bez LEDów), oczyszczony z topnika projekt:
    Moja płytka startowa dla dsPIC33EP512GM304 wzorowana na Arduino Moja płytka startowa dla dsPIC33EP512GM304 wzorowana na Arduino Moja płytka startowa dla dsPIC33EP512GM304 wzorowana na Arduino

    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:
    Moja płytka startowa dla dsPIC33EP512GM304 wzorowana na Arduino
    Załącznik do pobrania (kod, projekt MikroC, skompilowany hex):
    dsPIC33EP5...k_8MHz.zip Download (94.19 kB)Punkty: 3 dla użytkownika
    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):
    Moja płytka startowa dla dsPIC33EP512GM304 wzorowana na Arduino
    Rezultat w RealTerm:
    Moja płytka startowa dla dsPIC33EP512GM304 wzorowana na Arduino
    Załącznik do pobrania (kod, projekt MikroC, skompilowany hex):
    dsPIC33EP5...e_8MHz.zip Download (115.02 kB)Punkty: 3 dla użytkownika
    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):
    dsPIC33EP5...1_8MHz.zip Download (96.49 kB)Punkty: 3 dla użytkownika
    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):
    dsPIC33EP5...2_8MHz.zip Download (96.5 kB)Punkty: 3 dla użytkownika
    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):
    dsPIC33EP5...3_8MHz.zip Download (95.62 kB)Punkty: 3 dla użytkownika
    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:
    Moja płytka startowa dla dsPIC33EP512GM304 wzorowana na Arduino
    Moja płytka startowa dla dsPIC33EP512GM304 wzorowana na Arduino
    Rezultat w konsoli (wartość zmienia się w trakcie obracania potencjometru):
    Moja płytka startowa dla dsPIC33EP512GM304 wzorowana na Arduino
    Załącznik do pobrania (kod, projekt MikroC, skompilowany hex):
    dsPIC33EP5...C_8MHz.zip Download (181.3 kB)Punkty: 3 dla użytkownika
    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):
    Moja płytka startowa dla dsPIC33EP512GM304 wzorowana na Arduino
    Rezultat działania w terminalu:
    Moja płytka startowa dla dsPIC33EP512GM304 wzorowana na Arduino
    Filmik z działania:

    Załącznik do pobrania (kod, projekt MikroC, skompilowany hex):
    dsPIC33EP5...M_8MHz.zip Download (185.43 kB)Punkty: 3 dla użytkownika

    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ć.

    Fajne! Ranking DIY
    Potrafisz napisać podobny artykuł? Wyślij do mnie a otrzymasz kartę SD 64GB.
  • Computer ControlsComputer Controls
  • #2
    khoam
    Specjalista - ESP32, ESP8266
    p.kaczmarek2 napisał:
    Pinout płytki nie miał być i nie jest zgodny z Arduino, zresztą tych pinów byłoby troszkę na to za dużo.

    To widać :) Jaka była motywacja, aby akurat taki "niechlubny" wzorzec przyjąć? ;) Wykonanie jest super. Więcej takich DIY.
  • Computer ControlsComputer Controls
  • #3
    p.kaczmarek2
    Poziom 24  
    khoam napisał:

    To widać :) Jaka była motywacja, aby akurat taki "niechlubny" wzorzec przyjąć? ;) Wykonanie jest super. Więcej takich DIY.

    Ogólnie z tym projektem bym celował w coś w stylu takiego Arduino, teraz trzeba tylko zrobić bootloader, a potem można pomyśleć o prostym preprocesingu kodu by otrzymać wsparcie języka w stylu ino, z tym ich całym prostym "pinMode", "digitalWrite", itp.
    Ale to tylko pomysł, w tej chwili nawet nie wiem w czym bym docelowo miał to kompilować... SDCC chyba nie ma wsparcia dsPIC33.
    Piny są ułożone tak jak mi było wygodnie je wyprowadzić. Do tego zadbałem by było dużo wyprowadzonych 3.3V / GND bo zawsze jak coś robiłem (nawet z Arduino) to mi ich brakowało.

    khoam napisał:
    Wykonanie jest super. Więcej takich DIY.

    Cieszę się, że się podoba, choć akurat tutaj luty są dość słabe i większość projektu była lutowana z rok temu, od tego czasu troszkę jednak polepszyłem swoje lutowanie.
  • #5
    p.kaczmarek2
    Poziom 24  
    khoam napisał:

    Nie ma, ale to niewiele by zmieniło. Potrzebny byłby kompilator C++.

    Nie byłby koniecznie potrzebny kompilator C++. Chociażby Pinguino dla PIC18F dobrze mimikuje Arduino (podstawowe rzeczy typu digitalWrite, pinMode) a korzysta właśnie z SDCC i języka C.

    Ale tak, zdaję sobie sprawę, że nie byłoby to 1:1 to samo, chociażby pewnie ze względu na błahostki typu:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Jak ktoś zna różnice między C++ a C to wie co mam na myśli.

    A i dla jasności - napisałem w poprzednim poście "w stylu ino", a nie identyczny tak jak w Arduino.
  • #6
    khoam
    Specjalista - ESP32, ESP8266
    p.kaczmarek2 napisał:
    Jak ktoś zna różnice między C++ a C to wie co mam na myśli.

    Różnice są znacznie większe. Core API w Pinguino napisane jest w stylu "węgierskim", w C: serial1clearrxerror(), I2C2_writeChar(), list_free_item_with_check() itd. Pinguino HAL to zupełnie inny "ekosystem", który z Arduino HAL praktycznie nie ma nic wspólnego, poza wspólnym nazewnictwem kilkunastu funkcji globalnych takich, jak np. digitalWrite(). Ale lepszy wróbel w garści, niż kanarek na dachu ;)
  • #7
    zgierzman
    Poziom 24  
    p.kaczmarek2 napisał:
    Pinout płytki nie miał być i nie jest zgodny z Arduino, zresztą tych pinów byłoby troszkę na to za dużo.


    Gdybym to ja projektował, to postarałbym się o jak największą zgodność, a nadmiarowe piny umieścił tak, żeby nie kolidowały...
    Do Arduino jest mnóstwo gotowych nakładek, "shieldów", od całkiem prostych, do mocno rozbudowanych.
    Mieszając piny pozbawiłeś się możliwości (prostego) wykorzystania tych rozszerzeń...
  • #8
    khoam
    Specjalista - ESP32, ESP8266
    zgierzman napisał:
    Gdybym to ja projektował, to postarałbym się o jak największą zgodność, a nadmiarowe piny umieścił tak, żeby nie kolidowały...

    W sumie to można byłoby wykonać teraz specjalny shield do tej płytki, który emulowałby "od góry" oryginalny układ pinów w Uno oraz Nano jednocześnie :)
  • #9
    p.kaczmarek2
    Poziom 24  
    khoam napisał:

    Różnice są znacznie większe. Core API w Pinguino napisane jest w stylu "węgierskim", w C: serial1clearrxerror(), I2C2_writeChar()


    Core API tak, ale ja nie o tym mówiłem - mowa była o tym co widzi użytkownik-laik.

    Pinguino mimo wszystkie wspiera taki zapis:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    O ile dobrze kojarzę to oni preprocesują to i do kompilatora idzie już Serial_begin(9600), ale użytkownik tego nie widzi. Dla typowego użytkownika jest "podobnie jak w Arduino, z kropeczką".

    zgierzman napisał:

    Gdybym to ja projektował, to postarałbym się o jak największą zgodność, a nadmiarowe piny umieścił tak, żeby nie kolidowały...
    Do Arduino jest mnóstwo gotowych nakładek, "shieldów", od całkiem prostych, do mocno rozbudowanych.
    Mieszając piny pozbawiłeś się możliwości (prostego) wykorzystania tych rozszerzeń...

    A to słuszna uwaga i całkiem możliwe, że jak już opracuję bootloader to jednak finalna wersja płytki będzie miała piny zgodne z Arduino. To PCB bieżące i tak wymaga poprawek, i na silkscreen, i w jednym miejscu brakuje ścieżki, i układ RESETu zmieniałem względem tego ze schematu.
  • #10
    khoam
    Specjalista - ESP32, ESP8266
    p.kaczmarek2 napisał:
    o jednak finalna wersja płytki będzie miała piny zgodne z Arduino

    Stabilizator 5V też się znajdzie? Tak, żeby było co najmniej 500mA dla potrzeb nakładek.

    Dodano po 1 [godziny]:

    p.kaczmarek2 napisał:
    Do projektu użyłem konwertera USB-UART MCP2221 w obudowie SOIC

    Czy ten konwerter jest zasilany tylko przez port USB? W Uno konwerter jest zasilany albo z USB, albo ze stabilizatora 5V. Daje to możliwość pracy monitora portu szeregowego przy "zewnętrznym" zasilaniu, kiedy zasilanie z USB jest automatycznie odcięte.
  • #11
    p.kaczmarek2
    Poziom 24  
    khoam napisał:

    Stabilizator 5V też się znajdzie? Tak, żeby było co najmniej 500mA dla potrzeb nakładek.

    Myślę, że dałoby się go zmieścić na PCB.
    Trochę miejsca się też zwolni, rezystory od tranzystora RESET można usunąć (po to się stosuje DTC114EM3 by nie trzeba było rezystorów na płytce).
    Bieżący layout też nie jest jakiś wybitny, można by go zoptymalizować.


    khoam napisał:

    Czy ten konwerter jest zasilany tylko przez port USB? W Uno konwerter jest zasilany albo z USB, albo ze stabilizatora 5V. Daje to możliwość pracy monitora portu szeregowego przy "zewnętrznym" zasilaniu, kiedy zasilanie z USB jest automatycznie odcięte.

    Jest zasilany tylko z USB, ale nie ma problemów z użyciem dwóch źródeł zasilania na raz. Po to tam są diody.