Spisu treści:

Mikrokontroler AVR. Modulacja szerokości impulsów. Kontroler silnika prądu stałego i natężenia światła LED.: 6 kroków
Mikrokontroler AVR. Modulacja szerokości impulsów. Kontroler silnika prądu stałego i natężenia światła LED.: 6 kroków

Wideo: Mikrokontroler AVR. Modulacja szerokości impulsów. Kontroler silnika prądu stałego i natężenia światła LED.: 6 kroków

Wideo: Mikrokontroler AVR. Modulacja szerokości impulsów. Kontroler silnika prądu stałego i natężenia światła LED.: 6 kroków
Wideo: Kurs STM32 #9 PWM z użyciem timerów 2024, Listopad
Anonim
Image
Image

Cześć wszystkim!

Modulacja szerokości impulsu (PWM) jest bardzo powszechną techniką w telekomunikacji i sterowaniu zasilaniem. jest powszechnie używany do sterowania mocą dostarczaną do urządzenia elektrycznego, niezależnie od tego, czy jest to silnik, dioda LED, głośniki itp. Jest to zasadniczo technika modulacji, w której szerokość impulsu nośnego zmienia się zgodnie z analogowym sygnałem wiadomości.

Wykonujemy prosty obwód elektryczny do sterowania prędkością obrotową silnika prądu stałego w zależności od natężenia światła. Zamierzamy użyć funkcji Light Dependent Resistor i mikrokontrolera AVR, takich jak konwersja analogowo-cyfrowa, aby zmierzyć natężenie światła. Zamierzamy również użyć modułu sterownika silnika z podwójnym mostkiem H-L298N. Jest zwykle używany do kontrolowania prędkości i kierunku silników, ale może być używany do innych projektów, takich jak sterowanie jasnością niektórych projektów oświetleniowych. Dodaliśmy również przycisk do naszego obwodu, aby zmienić kierunek obrotów silnika.

Krok 1: Opis

Opis
Opis
Opis
Opis

Każde ciało na tym świecie ma pewną bezwładność. Silnik obraca się, gdy jest włączony. Jak tylko zostanie wyłączony, będzie się zatrzymywać. Ale to nie kończy się natychmiast, zajmuje trochę czasu. Ale zanim całkowicie się zatrzyma, jest ponownie włączany! W ten sposób zaczyna się poruszać. Ale nawet teraz osiągnięcie pełnej prędkości zajmuje trochę czasu. Ale zanim to się stanie, jest wyłączany i tak dalej. Zatem całkowitym efektem tego działania jest to, że silnik obraca się w sposób ciągły, ale z mniejszą prędkością.

Modulacja szerokości impulsu (PWM) to stosunkowo nowa technika przełączania zasilania zapewniająca pośrednie ilości energii elektrycznej między poziomami pełnego włączenia i całkowitego wyłączenia. Zwykle impulsy cyfrowe mają taki sam czas włączania i wyłączania, ale w niektórych sytuacjach potrzebujemy, aby impuls cyfrowy miał więcej/mniej czasu/wyłączenia. W technice PWM tworzymy impulsy cyfrowe o nierównej ilości stanów włączenia i wyłączenia, aby uzyskać wymagane wartości napięcia pośredniego.

Cykl pracy jest określony przez procent czasu trwania wysokiego napięcia w pełnym impulsie cyfrowym. Można go obliczyć na podstawie:

% cyklu pracy = T on /T (czas okresu) x 100

Weźmy oświadczenie o problemie. Musimy wygenerować sygnał PWM 50 Hz z 45% współczynnikiem wypełnienia.

Częstotliwość = 50 Hz

Okres czasu, T = T(wł.) + T(wył.) = 1/50 = 0,02 s = 20 ms

Cykl pracy = 45%

W ten sposób, rozwiązując zgodnie z powyższym równaniem, otrzymujemy

T(on) = 9 ms

T(wył) = 11 ms

Krok 2: Timery AVR – tryb PWM

Zegary AVR – tryb PWM
Zegary AVR – tryb PWM
Zegary AVR – tryb PWM
Zegary AVR – tryb PWM

Do tworzenia PWM, AVR zawiera osobny sprzęt! Korzystając z tego, procesor instruuje sprzęt, aby wytworzył PWM o określonym cyklu pracy. ATmega328 posiada 6 wyjść PWM, 2 znajdują się na timerze/liczniku0 (8bit), 2 są zlokalizowane na timerze/liczniku1 (16bit), a 2 znajdują się na timerze/liczniku2 (8bit). Timer/Counter0 to najprostsze urządzenie PWM w ATmega328. Timer/Counter0 może działać w 3 trybach:

  • Szybki PWM
  • PWM z korekcją fazy i częstotliwości
  • PWM z korekcją fazową

każdy z tych trybów może być odwrócony lub nieodwrócony.

Zainicjuj Timer0 w trybie PWM:

TCCR0A |=(1 << WGM00)|(1 << WGM01) - ustaw WGM: Szybki PWM

TCCR0A |= (1 << COM0A1)|(1 << COM0B1) - ustaw tryb porównania wyjścia A, B

TCCR0B |= (1 << CS02) - ustaw timer z preskalerem = 256

Krok 3: Pomiar natężenia światła - ADC i LDR

Pomiar natężenia światła - ADC i LDR
Pomiar natężenia światła - ADC i LDR
Pomiar natężenia światła - ADC i LDR
Pomiar natężenia światła - ADC i LDR
Pomiar natężenia światła - ADC i LDR
Pomiar natężenia światła - ADC i LDR

Light Dependent Resistor (LDR) to przetwornik, który zmienia swoją rezystancję, gdy światło pada na jego powierzchnię.

LDR są wykonane z materiałów półprzewodnikowych, aby umożliwić im zachowanie właściwości światłoczułych. Te LDR lub FOTOREZYSTORY działają na zasadzie „fotoprzewodnictwa”. Ta zasada mówi, że za każdym razem, gdy światło pada na powierzchnię LDR (w tym przypadku), przewodność elementu wzrasta lub innymi słowy opór LDR maleje, gdy światło pada na powierzchnię LDR. Tę właściwość zmniejszenia rezystancji dla LDR osiąga się, ponieważ jest to właściwość materiału półprzewodnikowego stosowanego na powierzchni. LDR są najczęściej używane do wykrywania obecności światła lub do pomiaru natężenia światła.

Aby przenieść zewnętrzne informacje ciągłe (informacje analogowe) do systemu cyfrowego/obliczeniowego, musimy przekonwertować je na wartości całkowite (cyfrowe). Ten rodzaj konwersji jest realizowany przez konwerter analogowo-cyfrowy (ADC). Proces konwersji wartości analogowej na wartość cyfrową jest znany jako konwersja analogowo-cyfrowa. Krótko mówiąc, sygnały analogowe to sygnały z otaczającego nas świata rzeczywistego, takie jak dźwięk i światło.

Sygnały cyfrowe to analogowe odpowiedniki w formacie cyfrowym lub numerycznym, które są dobrze rozumiane przez systemy cyfrowe, takie jak mikrokontrolery. ADC jest jednym z takich urządzeń, które mierzą sygnały analogowe i wytwarzają cyfrowy odpowiednik tego samego sygnału. Mikrokontrolery AVR mają wbudowaną funkcję ADC do konwersji napięcia analogowego na liczbę całkowitą. AVR konwertuje go na 10-bitową liczbę z zakresu od 0 do 1023.

Do pomiaru natężenia światła wykorzystujemy analogowo-cyfrową konwersję poziomu napięcia z obwodu dzielnika z LDR.

Zainicjuj ADC:

TADCSRA |= (1<<ADEN) - Włącz ADC

ADCSRA |= (1<<ADPS2)| (1<<ADPS1)| (1ADPS0) - ustaw preskaler ADC = 128

ADMUX = (1 << REFS0) - ustaw napięcie odniesienia = AVCC; - ustaw kanał wejściowy = ADC0

Obejrzyj film ze szczegółowym opisem mikrokontrolera ADC AVR: Mikrokontroler AVR. Pomiar natężenia światła. ADC i LDR

Krok 4: Sterownik silnika prądu stałego i moduł sterownika silnika z podwójnym mostkiem H-L298N

Sterownik silnika prądu stałego i moduł sterownika silnika z podwójnym mostkiem H-L298N
Sterownik silnika prądu stałego i moduł sterownika silnika z podwójnym mostkiem H-L298N
Sterownik silnika prądu stałego i moduł sterownika silnika z podwójnym mostkiem H-L298N
Sterownik silnika prądu stałego i moduł sterownika silnika z podwójnym mostkiem H-L298N
Sterownik silnika prądu stałego i moduł sterownika silnika z podwójnym mostkiem H-L298N
Sterownik silnika prądu stałego i moduł sterownika silnika z podwójnym mostkiem H-L298N

Używamy sterowników silników prądu stałego, ponieważ mikrokontrolery generalnie nie są w stanie dostarczyć prądu nie większego niż 100 miliamperów. Mikrokontrolery są inteligentne, ale nie mocne; ten moduł doda trochę mięśni do mikrokontrolerów do napędzania silników prądu stałego o dużej mocy. Może sterować jednocześnie 2 silnikami prądu stałego do 2 A każdy lub jednym silnikiem krokowym. Możemy sterować prędkością za pomocą PWM, a także kierunkiem obrotów silników. Służy również do sterowania jasnością taśmy LED.

Opis pinezki:

Port OUT1 i OUT2, który służy do podłączenia silnika prądu stałego. OUT3 i OUT4 do podłączenia taśmy LED.

ENA i ENB są pinami aktywującymi: podłączając ENA do wysokiego (+5V) włącza port OUT1 i OUT2.

Jeśli podłączysz pin ENA do niskiego (GND), wyłączy to OUT1 i OUT2. Podobnie dla ENB i OUT3 i OUT4.

IN1 do IN4 to piny wejściowe, które zostaną podłączone do AVR.

Jeśli IN1-high(+5V), IN2-low(GND), OUT1 staje się wysokie, a OUT2 niskie, w ten sposób możemy napędzać silnik.

Jeśli IN3-high(+5V), IN4-low(GND), OUT4 ma stan wysoki, a OUT3 niski, co oznacza, że dioda LED świeci.

Jeśli chcesz odwrócić kierunek obrotów silnika, po prostu odwróć polaryzację IN1 i IN2, podobnie dla IN3 i IN4.

Poprzez zastosowanie sygnału PWM do ENA i ENB możesz kontrolować prędkość silników na dwóch różnych portach wyjściowych.

Płyta może przyjąć nominalnie od 7V do 12V.

Zworki:Istnieją trzy styki zworki; Zworka 1: Jeśli silnik potrzebuje więcej niż 12V zasilania, musisz odłączyć zworkę 1 i podać żądane napięcie (maks. 35V) na zacisku 12V. Podłącz kolejne zasilanie 5 V i wejście na zacisk 5 V. Tak, musisz podać 5 V, jeśli chcesz zastosować więcej niż 12 V (gdy zworka 1 jest usunięta).

Wejście 5V służy do prawidłowego funkcjonowania układu scalonego, ponieważ usunięcie zworki spowoduje wyłączenie wbudowanego regulatora 5V i ochronę przed wyższym napięciem wejściowym z zacisku 12V.

Terminal 5 V działa jako wyjście, jeśli napięcie zasilania wynosi od 7 V do 12 V i działa jako wejście, jeśli zastosujesz więcej niż 12 V, a zworka zostanie usunięta.

Zworka 2 i zworka 3: Jeśli usuniesz te dwie zworki, musisz wprowadzić sygnał włączenia i wyłączenia z mikrokontrolera, większość użytkowników woli usunąć dwie zworki i podać sygnał z mikrokontrolera.

Jeśli zachowasz dwie zworki, wyjścia OUT1 do OUT4 będą zawsze włączone. Zapamiętaj zworkę ENA dla OUT1 i OUT2. Zworka ENB dla OUT3 i OUT4.

Krok 5: Pisanie kodu programu w C. Ładowanie pliku HEX do pamięci Flash mikrokontrolera

Napisanie i zbudowanie aplikacji mikrokontrolera AVR w kodzie C z wykorzystaniem Zintegrowanej Platformy Programistycznej - Atmel Studio.

#ifndef F_CPU#define F_CPU 16000000UL // mówienie częstotliwości kryształu kontrolera (16 MHz AVR ATMega328P) #endif

#include //header, aby włączyć kontrolę przepływu danych przez piny. Definiuje piny, porty itp. #include //header, aby włączyć funkcję opóźnienia w programie

#define BUTTON1 2 // przełącznik przyciskowy podłączony do portu B pin 2 #define DEBOUNCE_TIME 25 // czas oczekiwania na przycisk "odbicia" #define LOCK_INPUT_TIME 300 // czas oczekiwania po naciśnięciu przycisku

// Timer0, inicjalizacja PWM void timer0_init() { // ustawienie timera OC0A, pin OC0B w trybie przełączania i trybu CTC TCCR0A |= (1 << COM0A1)|(1 << COM0B1)|(1 << WGM00)| (1 << WGM01); // ustaw timer z preskalerem = 256 TCCR0B |= (1 << CS02); // zainicjuj licznik TCNT0 = 0; // zainicjuj porównywaną wartość OCR0A = 0; }

// Inicjalizacja ADC void ADC_init() { // Włącz ADC, częstotliwość próbkowania=osc_freq/128 ustaw preskaler na maksymalną wartość, 128 ADCSRA |= (1<<ADEN) | (1<<ADPS2)| (1<< ADPS1)| (1<<ADPS0);

ADMUX = (1<<REFS0); // Wybierz napięcie odniesienia (AVCC)

// Status przełącznika przycisku unsigned char button_state() {

/* przycisk jest wciśnięty, gdy bit BUTTON1 jest wyczyszczony */

jeśli (!(PINB & (1<

{

_delay_ms (DEBOUNCE_TIME);

jeśli (!(PINB & (1<

}

zwróć 0;

}

// Inicjalizacja portów void port_init() { DDRB =0b00011011; //PB0-IN1, PB1-IN2, PB3-IN3, PB4-IN4, PB2 - BUTTON SWITCH BEZPOŚREDNI PORTB=0b00010110;

DDRD = 0b01100000; //PD5-ENB (OC0B), PD6-ENA (OC0A) PORTD=0b00000000;

DDRC = 0b00000000; // PC0-ADC PORTC=0b00000000; // Ustaw wszystkie piny PORTC w stan niski, co spowoduje jego wyłączenie. }

// Ta funkcja odczytuje wartość konwersji analogowo-cyfrowej. uint16_t get_LightLevel() { _delay_ms(10); // Poczekaj trochę czasu, aż kanał otrzyma wybrany ADCSRA |= (1<<ADSC); // Rozpocznij konwersję ADC, ustawiając bit ADSC. Napisz 1 do ADSC

while(ADCSRA & (1<<ADSC)); // Poczekaj na zakończenie konwersji

// ADSC ponownie staje się 0 do tego czasu, uruchom pętlę w sposób ciągły _delay_ms(10); powrót (ADC); // Zwróć wynik 10-bitowy

}

// Ta funkcja ponownie mapuje liczbę z jednego zakresu (0-1023) na inny (0-100). uint32_t map(uint32_t x, uint32_t in_min, uint32_t in_max, uint32_t out_min, uint32_t out_max) { return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; }

int główny (unieważniony)

{ uint16_t i1=0;

port_init();

timer0_init(); ADC_init(); // inicjalizacja ADC

gdy (1)

{ i1=mapa(get_LightLevel(), 0, 1023, 0, 100);

OCR0A=i1; // Ustaw wyjście porównaj rejestr kanał A OCR0B=100-i1; // Ustaw wyjście porównaj rejestr kanału B (odwrócone)

if (button_state()) // Jeśli przycisk jest wciśnięty, przełącz stan i opóźnienie diody LED o 300ms (#define LOCK_INPUT_TIME) { PORTB ^= (1<<0); // przełączanie aktualnego stanu pinu IN1. PORTB ^= (1<<1); // przełączanie aktualnego stanu pinu IN2. Odwróć kierunek obrotów silnika

PORTB ^= (1<<3); // przełączanie aktualnego stanu pinu IN3. PORTB ^= (1<<4); // przełączanie aktualnego stanu pinu IN4. Taśma LED jest wyłączona/włączona. _delay_ms (LOCK_INPUT_TIME); } }; powrót (0); }

Programowanie zakończone. Następnie zbuduj i skompiluj kod projektu do pliku hex.

Wgrywanie pliku HEX do pamięci flash mikrokontrolera: wpisz w okienku DOS polecenie:

avrdude –c [nazwa programisty] –p m328p –u –U flash:w:[nazwa pliku szesnastkowego]

W moim przypadku jest to:

avrdude –c ISPProgv1 –p m328p –u –U flash:w:PWM.hex

To polecenie zapisuje plik hex do pamięci mikrokontrolera. Obejrzyj film ze szczegółowym opisem wypalania pamięci flash mikrokontrolera: Wypalanie pamięci flash mikrokontrolera…

Ok! Teraz mikrokontroler pracuje zgodnie z instrukcjami naszego programu. Sprawdźmy to!

Krok 6: Obwód elektryczny

Obwód elektryczny
Obwód elektryczny
Obwód elektryczny
Obwód elektryczny

Połącz elementy zgodnie ze schematem ideowym.

Zalecana: