Przykłady aplikacji z użyciem mikrokontrolerów z rodziny Atmega firmy Atmel.

Podczas pracy nad testowaniem i uruchamianiem układów z kontrolerami Atmega korzystam z następującego środowiska:

  • środowisko podstawowe
    • sprzęt
      • moduł uruchomieniowy AVR Atmega16 wersja 2
        • mikrokontroler Atmega (16 lub 32)
        • wyświetlacz 7-segmentowy, wyświetlacz LCD, diody LED, 
        • odbiornik podczerwieni TSOP4836, czujnik temperatury
        • ...
      • JTAGICE3
        • programator i debugger współpracujący z Atmel Studio 6
    • oprogramowanie
      • Atmel Studio 6.1
      • Eagle 6.5.0
  • środowisko pomocnicze i zapasowe
    • sprzęt
      • JTAGICE V2.0 programator & debugger dla procesorów Atmel AVR
        • współpracuje tylko z AVR Studio w wersji 4
      • Programator zgodny z USBasp
    • oprogramowanie
      • AVR Studio 4.17
      • Khazama AVR Programmer
      • Notepad++
      • Eclipse Kepler plus AVR Eclipse

Ciąg dalszy historii o enkoderach.

Jak napisałem w innym artykule, enkodery mechaniczne (pracujące na zasadzie stykowej) są nietrwałe (rzędu 15000 cykli) oraz mają niewielką ilość impulsów na obrót (rzędu 20-tu).

Można kupić profesjonalny enkoder magnetyczny lub optyczny, ale wtedy trzeba zapłacić kilkaset złotych.

Można też wykorzystać silnik krokowy wymontowany z dysku twardego, z drukarki, stacji dyskietek itd. 

Silniki krokowe są szeroko stosowane w urządzeniach peryferyjnych komputerów.

Ten artykuł będzie właśnie o wykorzystaniu silnika krokowego jako enkodera.

Opiszę konkretny przypadek. 

Silnik, który wykorzystałem, został wymontowany z dysku twardego z komputera Amstrad (były takie kiedyś).

Na dysku były następujące oznaczenia:

TYPE   103-4902-0320
10.5VDC  0.26A  0.9 DEG/STEP

Nie ma to specjalnego znaczenia, gdyż pewnie można wykorzystać nieomal dowolny silnik krokowy do wykonania enkodera (przyrostowego - incremental encoder).

Poza tym znaleźć taki silnik to pewnie marzenie ściętej głowy.

Silniki krokowe dzielą się w zależności od sposobu połączeń na bipolarne i unipolarne.

Ten silnik akurat jest unipolarny.

Schemat połączeń:

Schemat unipolarnego silnika krokowego

Jak widać wszystkie uzwojenia mają wyprowadzone wspólne połączenie na schemacie oznaczone jako W0.

Jeśli nie znamy wyprowadzeń konkretnego silnika, to punkt wspólny znajdujemy omomierzem (od wspólnego wyprowadzenia rezystancja do pozostałych wyprowadzeń jest jednakowa).

U mnie rezystancja poszczególnych uzwojeń wynosi 39 Ω.

Tak wygląda ten unipolarny silnik krokowy po wymontowaniu z dysku:

Unipolarny silnik krokowy

Ośka silnika ma średnicę 6,3 mm i idealnie pasuje do niektórych pokręteł.

Demonstracja działania enkodera:

Schemat układu:

Schemat enkodera z silnika krokowego

Rezystory R2 i R3 należy dobrać tak, aby spadek napięcia na uzwojeniach silnika krokowego wynosiło około 10mV.

Jest to bardzo ważne dla działania enkodera. Zbyt niski spadek napięcia będzie powodował niestabilną pracę komparatora LM393.

Natomiast zbyt wysoka wartość tego spadku spowoduje, że przy powolnym kręceniu pokrętłem na wyjściu nie pojawią się impulsy (komparator nie zadziała).

Projekt układu był inspirowany przez układ zaprojektowany przez OZ2CPU.

Onego czasu natrafiłem na płytkę (moduł) z układem DS3231 i postanowiłem go wykorzystać przy budowie zegara, który byłby na tyle stabilny, żeby nie trzeba go było zbyt często korygować.

Wybrane cechy układu DS3231:

  • ma wbudowany wewnętrzny generator kwarcowy skompensowany temperaturowo (TCXO)
    • stabilność w zakresie zmian temperatury od 0°C do 40°C wynosi 2 ppm
  • komunikacja z układem odbywa się po magistrali I²C
  • wbudowany mechanizm alarmów (do dwóch dziennie)
  • rejestr umożliwiający korektę częstotliwości generatora kwarcowego

 Układ zegara składa się z następujących elementów:

  • mikrokontrolera Atmega16A
    • taktowanego 16MHz
  • modułu RTC DS3231
  • wyświetlacza LCD 2x16 znaków
    • typ 1602A zgodny z HD44780
  • płytka uniwersalna PI25Z dwustronna 70x90mm
  • czterech przycisków
    • OK
    • góra (UP)
    • dół (DOWN)
    • RESET
  • złącza JTAG (do programowania i uruchamiania/debugowania)
  • osprzętu
    • podstawka pod mikrokontroler
    • gniazdo zasilania
    • złącza GoldPin do wyświetlacza i modułu RTC
  • drobne elementy elektroniki
    • potencjometr kontrastu wyświetlacza
    • kondensatory
    • rezystory

Zegar posiada następujące funkcjonalności:

  • pokazuje czas (godziny, minuty, sekundy)
  • pokazuje datę
  • pokazuje dzień tygodnia
  • przy pomocy trzech przycisków można ustawić bieżący czas oraz datę (wykorzystując menu)

 Zegar w całej okazałości:

dokładny zegar na bazie DS3231

Plik zawierający całość źródeł (projekt) oraz pliki do zaprogramowania:

DS3231.zip

W projekcie wykorzystałem:

  • biblioteki Tomasza Sklenarskiego do obsługi:
    • menu
    • wyświetlacza
    • klawiszy
  • pomysł funkcji Mirosława Kardasia do obsługi RTC DS3231
  • obsługę magistrali TWI (komunikacja procesora z DS3231) przy pomocy przerwań na podstawie notki Atmela AVR315

Płytka zasilana jest z przerobionego zasilacza Nokia (opisanego w dziale warsztatowym).

Schemat układu:

schemat dokładnego zegara z układem DS3231 i Atmega16A

Enkodery mechaniczne są często stosowane w układach z mikrokontrolerami do zmiany nastaw różnych wartości.

Zalety enkoderów mechanicznych (stykowych):

  • niska cena (kilka zł)
  • niewielkie rozmiary
  • duży wybór sposobów mocowania i osi

Wady enkoderów mechanicznych:

  • niewielka liczba impulsów na obrót (zazwyczaj 20 do 24)
  • niewielka trwałość (rzędu 15000 cykli)
  • drgania styków

Jeśli chodzi o drgania styków, to właśnie ten artykuł jest temu poświęcony.

Zbudowałem prototypową płytkę, na której wypróbowałem praktycznie oprogramowanie autorstwa Petera Danneggera.

Efekty działania obsługi enkodera widoczne są na wyświetlaczu LCD 2x16 znaków.

Oprogramowanie obsługujące wyświetlacz jest autorstwa Petera Fleury.

Enkoder debounce eliminacja drgań styków

 Plik z projektem w formacie Atmel Studio 6:

enkoder_debounce.zip

Mała demonstracja na żywo:

Schemat układu z enkoderem mechanicznym.

Schemat układu z enkoderem mechanicznym

Dekoder został oparty na dekoderze opisanym przez Sana Bergmansa (wersja dla protokołu NEC).

Reaguje na sygnał podczerwieni wysyłany przez pilota Samsung AH59-01644A od kina domowego HT-Q9.

pilot Samsung

Program dekoduje naciśnięcie klawisza i wyświetla jego kod na wyświetlaczu 7-segmentowym.

Przepisałem kod programu na mikrokontroler Atmega16A (oryginał był wykonany na bazie mikrokontrolera PIC16F84A).

Poniżej wykresy dla protokołu stosowanego w pilocie Samsung.

Protokół dla pilota Samsung

 

Poniżej schemat podłączenia wyświetlacza 7-segmentowego oraz odbiornika IR do mikrokontrolera Atmega16A.

schemat odbiornika IR Samsung

 Podłączenie wyświetlacza i odbiornika można zmienić pod warunkiem odpowiednich modyfikacji definicji na początku programu.

Tutaj znajduje się listing programu w asemblerze (jest sporo komentarzy, które mogą ułatwić analizę algorytmu działania dekodera).