Zakres laboratorium:
  1. Wyświetlacz LCD – interfejs I2C – program “Hello World”
  2. Zegarek z budzikiem na LCD – podstawa czasu z przerwania
  3. Przetwornik ADC – pomiar napięcia
  4. Cykliczny pomiar napięcia z wykorzystaniem przerwań, uśrednianie pomiaru

 

1. Wyświetlacz LCD – interfejs I2C – program “Hello World”

Zapoznać się z obsługa wyświetlacza LCD. Ściągnąć paczkę z przykładowym programem: LCD_I2C

Jak wyświetlać napisy, liczby, obsługiwać dwie linie itd.

Utworzyć program, który ma podłączone dwa przyciski:

  • pierwszy przycisk zwiększa liczbę o 1
  • drugi przycisk zmniejsza liczbę o 1
  • liczba jest z zakresu -100 – 100
  • liczba ma być wyświetlana na wyświetlaczu LCD
  • przyciski powinny działać płynnie i przewidywalnie (drgania styków)

 

2. Zegarek z budzikiem na LCD – podstawa czasu z przerwania

Utworzyć program, który będzie realizował funkcje budzika:

  • w pierwszej linii wyświetlacza prezentowany jest aktualny czas (czas zapisujemy w kodzie programu) w formacie: 12:05:19
  • czas, sekundy są odliczane precyzyjnie z wykorzystaniem przerwania wewnętrznego od układu licznikowego(wybrać i skonfigurować Timer, obsłużyć przerwanie)
  • w drugiej linii wyświetlacza pokazywany jest czas budzika, jeśli czas budzika pokryje się z czasem aktualnym to uruchamiany jest sygnał alarmowy
  • sygnał alarmowy działa na buzerze (do testów można wykorzystać diodę LED), wyłączenie budzika następuje z użyciem przycisku
  • czas budzika możemy ustawiać za pomocą przycisków lub impulsatora (do wyboru jedna forma)
3. Przetwornik ADC – pomiar napięcia

Co to jest przetwornik ADC? Jak działa? Co oznacza, że przetwornik jest 10-bitowy? Co to jest napięcie referencyjne przetwornika?

Potencjometr jako regulowany zadajnik napięcia.

Wykonać kolejne polecenia:

  • podłączyć zadajnik napięcia pin”A_Pot1″do pinu pomiarowego mikrokontrolera PC0 (kanał pomiarowy ADC0)
  • przygotować funkcję “ADC_init()” w której dokonana będzie konfiguracja przetwornika A/D na podstawie dokumentacji mikrokontrolera:
    • Rejestr ADMUX bity: REFS0:1 – konfiguracja napięcia referencyjnego – wybrać napięcie AVCC
    • Rejestr ADCSRA bity: ADPS0:2 – konfiguracja podzielnika częstotliwości dla układu przetwornika (częstotliwość sygnału taktującego) – ustawić aby częstotliwość była mniejsza
      niż 150KHz
    • Rejestr ADCSRA bit: ADEN – uruchomienie układu przetwornika
    • Rejestr ADMUX bity: MUX0:4 – konfiguracja/wybór kanału/pinu na którym będzie dokonywany pomiar – wybrać ADC0 – odpowiada pinowi PC0
  • przygotować funkcję “uint16_t ADC_10bit()” – zwraca zmierzone napięcie:
    • Rejestr ADCSRA bit: ADSC – uruchomienie pojedynczego pomiaru – ustawienie bitu
    • Rejestr ADCSRA bit: ADSC – oczekiwanie na zakończenie pomiaru – oczekiwanie na wyzerowanie bitu – np. “loop_until_bit_is_set”
    • Rejestr ADC – przechowuje wynik pomiaru – wartość jaką ma zwrócić funkcja

Funkcja “ADC_10bit()” zwraca liczbę z zakresu 0-1023 odpowiadającą zmierzonemu napięciu zgodnie z działaniem przetwornika A/D. 0 to napięcie 0V a 1023 to napięcie “AVCC”, czyli 5V, więc dokładność pomiaru wynosi  około 5V/1023= 0.00488V. Inne wartości napięcia są proporcjonalne.

 

Uruchomić funkcje i sprawdzić czy wszystko działa:

  • wartość zmierzonego napięcia (wartość zwracaną przez funkcję “ADC_10bit()”) wyświetlić na wyświetlaczu LCD w pierwszej linii
  • przeliczyć wartość z przetwornika ADC na V i wyświetlić w drugiej linii wyświetlacza w postaci: Napięcie: 2.56V
  • funkcja sprintf z Arduino nie wyświetla liczby zmiennoprzecinkowych, należy zaproponować własne rozwiązanie problemu

 

4. Pomiar napięcia  z większej liczby kanałów, czujnik natężenia światła -automatyczny włącznik zmierzchowy

Zadania I:

  • podłączyć sygnał analogowy z czujnika natężenia światła (fotorezystor) “A_photo” do pinu mikrokontrolera PC1 (kanał pomiarowy ADC1)
  • zmodyfikować program tak aby obsługiwał pomiar z dwóch kanałów, utworzyć funkcję adcChannel1() i adcChannel1() , które dokonują pomiaru i zwracają wyniki pomiarów
  • pomiary wyświetlić w pierwszej linii wyświetlacza

Zadanie II – automatyczny włącznik zmierzchowy:

  • napisać program, który realizuje funkcję  automatycznego włącznika zmierzchowego
  • wykorzystać fotorezystor, który będzie pełnił funkcję czujnika światła
  • próg działa/włączenia światła ustawiamy przy użyciu potencjometru 1
  • symulatorem światła jest włączenie/wyłączenie diody LED i wyświetlenie odpowiedniego napisu na wyświetlaczu LCD w drugiej linii
  • załączenie/wyłączenie światła powinno odbywać się przy użyciu wyłącznika z histerezą (opis jak działa histereza można znaleźć na stronie link)

 

 

 

 

 

Zakres laboratorium 2017-2021 (nie aktualne)

Zakres laboratorium:
  1. Wyświetlacz  7-segmenowy
  2. Przetwornik A/D
  3. Wykorzystanie przerwań wewnętrznych
Zadania do wykonania:
  • Zadanie 1.1
  • Zadanie 2.1
  • Zadanie 2.3
  • Zadanie 3.1
  • Zadanie domowe

 

1. Wyświetlacz  7-segmenowy

Zadanie 1.1

Podłączyć wyświetlacz 7-segmentowy według schematu z poprzedniego laboratorium i zaprezentować działanie funkcji odpowiadającej za wyświetlanie liczby z zakresu 0-9999.

2. Przetwornik A/D

Przetwornik analogowy cyfrowy służy do zamiany sygnału analogowego na cyfrowy. W mikrokontrolerach jest używany do mierzenia napięcia, działa jak woltomierz. Mikrokontroler Atmega32A posiada tylko jeden przetwornik 10-bitowy, jednak dzięki wykorzystaniu multipleksera możemy dokonywać pomiaru na 8 wyprowadzeniach (PORTA). Do poprawnej pracy tego przetwornika należy skonfigurować odpowiednie rejestry. Do testowania poprawnej pracy należy generować różnie napięcie, w tym celu należy wykorzystać zewnętrzny potencjometr.

Pierwsze kroki:

  • podłączyć potencjometr zgodnie z rysunkiem – pomiar na nóżce PA0 (nie należy odłączać wyświetlacza 7-segmentowego)

    Podłączenie potencjometru do płytki EDU
    Podłączenie potencjometru do płytki EDU

 

Zadanie 2.1

  •  przygotować funkcję “ADC_init()” w której dokonana będzie konfiguracja przetwornika A/D na podstawie dokumentacji mikrokontrolera:
    • Rejestr ADMUX bity: REFS0:1 – konfiguracja napięcia referencyjnego – wybrać napięcie AVCC
    • Rejestr ADCSRA bity: ADPS0:2 – konfiguracja podzielnika częstotliwości dla układu przetwornika (częstotliwość sygnału taktującego) – ustawić aby częstotliwość była mniejsza
      niż 100KHz
    • Rejestr ADCSRA bit: ADEN – uruchomienie układu przetwornika
    • Rejestr ADMUX bity: MUX0:4 – konfiguracja/wybór kanału/pinu na którym będzie dokonywany pomiar – wybrać ADC0 – odpowiada pinowi PA0
  • przygotować funkcję “uint16_t ADC_10bit()” – zwraca zmierzone napięcie:
    • Rejestr ADCSRA bit: ADSC – uruchomienie pojedynczego pomiaru – ustawienie bitu
    • Rejestr ADCSRA bit: ADSC – oczekiwanie na zakończenie pomiaru – oczekiwanie na wyzerowanie bitu
    • Rejestr ADC – przechowuje wynik pomiaru – wartość jaką ma zwrócić funkcja
  • wartość zmierzonego napięcia (wartość zwracaną przez funkcję “ADC_10bit()”) wyświetlić na wyświetlaczu 7-segmentowym

Funkcja “ADC_10bit()” zwraca liczbę z zakresu 0-1023 odpowiadającą zmierzonemu napięciu zgodnie z działaniem przetwornika A/D. 0 to napięcie 0V a 1023 to napięcie “AVCC”, czyli 5V, więc dokładność pomiaru wynosi  około 5V/1023= 0.00488V. Inne wartości napięcia są proporcjonalne.

Zadanie 2.2

  • zapisać wzór na przeliczenie wartości zwracanej przez funkcję “ADC_10bit()” na wartość napięcia w V
  • zaimplementować funkcję która będzie zwracała napięcie w V z dokładnością do dwóch miejsc po przecinku i przeskalowaną do liczby całkowitych (np. 2,59 to 259, 3,95 to 393), wyświetlić na wyświetlaczu napięcie
  • podłączyć do układu miernik uniwersalny i porównać wskazania dla 10 różnych napięć + napięć skrajnych – wyniki zapisać na kartę w postaci tabeli
3. Wykorzystanie przerwań wewnętrznych

Wykorzystać kod z wcześniejszego laboratorium do uruchomienia przerwania wewnętrznego.

Zadanie 3.1

  • dodać do pętli głównej programu opóźnienie 1000ms – jak działa wyświetlacz?
  • skonfigurować przerwanie aby wywoływało się z częstotliwością 100Hz
  • w funkcji przerwania uruchamiać funkcję odpowiedzialną za obsługę wyświetlacza 7-segmentowego “seg7Show4Cyfry()” – funkcję należy przerobić tak aby działała w przerwaniu (usunąć opóźnienia i jedno wywołanie to wyświetlenie jednej cyfry)
  • czy wyświetlane wartości są czytelne? jak zmniejszyć ten niepożądany efekt?
  • dodać do pętli głównej programu opóźnienie 2000ms – jak teraz działa wyświetlacz?

Taka konfiguracja pozwala wykonywać długie zadania w pętli głównej i jednoczesne poprawne wyświetlanie wartości na wyświetlaczu 7-segmentowym z wykorzystaniem multipleksowania.

 

4. Zadanie domowe
  • narysować schemat urządzenia z zadania 2.2 (mikrokontroler, zadajnik napięcia, wyświetlacz 7-segmetowy)

 

Zagadnienia na przyszłe zajęcia:
  • sygnał PWM
  • serwo modelarskie – sterowanie