Съдържание:
- Стъпка 1: Описание
- Стъпка 2: AVR таймери - PWM режим
- Стъпка 3: Измерване на интензитета на светлината - ADC и LDR
- Стъпка 4: DC мотор на контролера и модул за задвижване на мотор с двоен H-мост-L298N
- Стъпка 5: Писане на код за програма на C. Качване на HEX файл във флаш паметта на микроконтролера
- Стъпка 6: Електрическата верига
Видео: AVR микроконтролер. Широчинно импулсна модулация. Контролер на DC двигател и интензивност на LED светлината .: 6 стъпки
2024 Автор: John Day | [email protected]. Последно модифициран: 2024-01-30 07:52
Здравейте всички!
Импулсно -широчинна модулация (PWM) е много често срещана техника в телекомуникациите и управлението на мощността. обикновено се използва за управление на захранването, подавано към електрическо устройство, независимо дали е двигател, светодиод, високоговорители и т.н. Това е основно техника за модулация, при която ширината на носещия импулс се променя в съответствие с аналоговия сигнал на съобщението.
Ние правим проста електрическа верига за управление на скоростта на въртене на DC двигателя в зависимост от интензитета на светлината. Ще използваме функции, зависещи от светлината, и функции на микроконтролера AVR, като аналогово -цифрово преобразуване за измерване на интензитета на светлината. Също така ще използваме модул за двигател с двоен H-мост-L298N. Обикновено се използва за контрол на скоростта и посоката на двигателите, но може да се използва и за други проекти, като например увеличаване на яркостта на определени проекти за осветление. Също така, добавихме бутон към нашата верига за превключване на посоката на въртене на двигателя.
Стъпка 1: Описание
Всяко тяло на този свят има някаква инерция. Двигателят се върти, когато е включен. Веднага след като бъде изключен, той ще има тенденция да спре. Но това не спира веднага, отнема известно време. Но преди да спре напълно, той се включва отново! Така той започва да се движи. Но дори и сега отнема известно време, за да достигне пълната си скорост. Но преди да се случи, той се изключва и т.н. По този начин общият ефект от това действие е, че двигателят се върти непрекъснато, но с по -ниска скорост.
Pulm Width Modulation (PWM) е сравнително нова техника за превключване на захранването за осигуряване на междинни количества електрическа енергия между напълно включени и напълно изключени нива. Обикновено цифровите импулси имат еднакъв период на включване и изключване, но в някои ситуации се нуждаем от цифровия импулс, за да имаме повече/по -малко време/извън работно време. В PWM техниката ние създаваме цифрови импулси с неравномерно състояние на включване и изключване, за да получим необходимите стойности на междинно напрежение.
Работният цикъл се определя от процента на продължителността на високо напрежение в пълен цифров импулс. Тя може да бъде изчислена чрез:
% от работния цикъл = T включено /T (период на време) x 100
Нека вземем твърдение за проблем. Трябва да генерираме 50 Hz PWM сигнал с 45% работен цикъл.
Честота = 50 Hz
Период от време, T = T (включен) + T (изключен) = 1/50 = 0,02 s = 20 ms
Работен цикъл = 45%
По този начин, решавайки съгласно уравнението, дадено по -горе, получаваме
T (включено) = 9 ms
T (изключено) = 11 ms
Стъпка 2: AVR таймери - PWM режим
За направата на PWM, AVR съдържа отделен хардуер! Използвайки това, процесорът инструктира хардуера да произвежда PWM за определен работен цикъл. ATmega328 има 6 PWM изхода, 2 са разположени на таймер/брояч 0 (8 бита), 2 са разположени на таймер/брояч 1 (16 бита) и 2 са разположени на таймер/брояч 2 (8 бита). Timer/Counter0 е най -простото PWM устройство на ATmega328. Таймер/брояч 0 може да работи в 3 режима:
- Бърз ШИМ
- ШИМ с корекция на фаза и честота
- Фазово коригиран ШИМ
всеки от тези режими може да бъде обърнат или неинвертиран.
Инициализирайте Timer0 в PWM режим:
TCCR0A | = (1 << WGM00) | (1 << WGM01) - настройка на WGM: Бърза ШИМ
TCCR0A | = (1 << COM0A1) | (1 << COM0B1) - настройте изходния режим за сравнение A, B
TCCR0B | = (1 << CS02) - настройка на таймер с предусилвател = 256
Стъпка 3: Измерване на интензитета на светлината - ADC и LDR
Светлозависим резистор (LDR) е преобразувател, който променя съпротивлението си, когато светлината пада върху повърхността му.
LDR са направени от полупроводникови материали, за да им позволят да имат своите чувствителни към светлина свойства. Тези LDR или ФОТО РЕЗИСТОРИ работят на принципа на „Фотопроводимост“. Този принцип казва, че когато светлината падне върху повърхността на LDR (в този случай) проводимостта на елемента се увеличава или с други думи съпротивлението на LDR намалява, когато светлината пада върху повърхността на LDR. Това свойство на намаляване на съпротивлението за LDR се постига, защото е свойство на полупроводников материал, използван на повърхността. LDR се използват най -често за откриване на наличие на светлина или за измерване на интензитета на светлината.
За прехвърляне на външна непрекъсната информация (аналогова информация) в цифрова/изчислителна система, ние трябва да ги преобразуваме в цели (цифрови) стойности. Този тип преобразуване се извършва от аналогово -цифров преобразувател (ADC). Процесът на преобразуване на аналогова стойност в цифрова стойност е известен като аналогово -цифрово преобразуване. Накратко, аналоговите сигнали са сигнали от реалния свят около нас като звук и светлина.
Цифровите сигнали са аналогови еквиваленти в цифров или цифров формат, които се разбират добре от цифровите системи като микроконтролери. ADC е един такъв хардуер, който измерва аналогови сигнали и произвежда цифров еквивалент на същия сигнал. AVR микроконтролерите имат вградено ADC устройство за преобразуване на аналогово напрежение в цяло число. AVR го преобразува в 10-битов номер от диапазон от 0 до 1023.
Използваме аналогово -цифрово преобразуване на нивото на напрежение от делителната верига с LDR за измерване на интензитета на светлината.
Инициализирайте ADC:
TADCSRA | = (1 << ADEN) - Активиране на ADC
ADCSRA | = (1 << ADPS2) | (1 << ADPS1) | (1ADPS0) - настройте ADC предсказващо устройство = 128
ADMUX = (1 << REFS0) - настройка на напрежение = AVCC; - настройте входния канал = ADC0
Гледайте видеото с подробно описание на ADC AVR микроконтролера: AVR Microcontroller. Измерване на интензитета на светлината. ADC и LDR
Стъпка 4: DC мотор на контролера и модул за задвижване на мотор с двоен H-мост-L298N
Използваме драйвери с постоянен ток, тъй като микроконтролерите не могат да подават ток не повече от 100 милиампера като цяло. Микроконтролерите са умни, но не са силни; този модул ще добави мускули към микроконтролерите, за да задвижва DC мотори с висока мощност. Той може да управлява 2 DC двигателя едновременно до 2 ампера всеки или един стъпков двигател. Можем да контролираме скоростта с помощта на ШИМ, а също и нейната посока на въртене на двигателите. Също така, той се използва за увеличаване на яркостта на LED лентата.
Описание на щифт:
OUT1 и OUT2 порт, който е за свързване на DC мотор. OUT3 и OUT4 за свързване на LED лента.
ENA и ENB са разрешаващи щифтове: чрез свързване на ENA към висок (+5V) той дава възможност на порта OUT1 и OUT2.
Ако свържете щифта ENA към нисък (GND), той деактивира OUT1 и OUT2. По същия начин, за ENB и OUT3 и OUT4.
IN1 до IN4 са входните щифтове, които ще бъдат свързани към AVR.
Ако IN1-висок (+5V), IN2-нисък (GND), OUT1 става висок, а OUT2 нисък, по този начин можем да задвижваме двигателя.
Ако IN3-висок (+5V), IN4-нисък (GND), OUT4 става висок, а OUT3 нисък, поради което светлината на LED лентата свети.
Ако искате да обърнете посоката на въртене на двигателя, просто обърнете полярността IN1 и IN2, подобно на IN3 и IN4.
Чрез прилагане на PWM сигнал към ENA и ENB можете да контролирате скоростта на двигателите на два различни изходни порта.
Платката може да приема от 7V до 12V номинално.
Джъмпери: Има три джъмперни щифта; Jumper 1: Ако вашият двигател се нуждае от повече от 12V захранване, трябва да изключите Jumper 1 и да приложите желаното напрежение (max 35V) към 12V терминала. Донесете още 5V захранване и вход към 5V терминал. Да, трябва да въведете 5V, ако трябва да приложите повече от 12V (когато е премахнат джъмпер 1).
5V входът е за правилното функциониране на IC, тъй като премахването на джъмпера ще деактивира вградения 5V регулатор и ще предпази от по-високо входно напрежение от 12V терминала.
5V терминалът действа като изход, ако захранването ви е между 7V до 12V и действа като вход, ако приложите повече от 12V и джъмперът е премахнат.
Jumper 2 и Jumper 3: Ако премахнете тези два джъмпера, трябва да въведете сигнала за активиране и деактивиране от микроконтролера, повечето потребители предпочитат да премахнат двата джъмпера и да подадат сигнала от микроконтролера.
Ако задържите двата джъмпера, OUT1 до OUT4 винаги ще бъдат активирани. Запомнете джъмпера ENA за OUT1 и OUT2. ENB джъмпер за OUT3 и OUT4.
Стъпка 5: Писане на код за програма на C. Качване на HEX файл във флаш паметта на микроконтролера
Писане и изграждане на приложението за микроконтролер AVR в C Code с помощта на интегрираната платформа за развитие - Atmel Studio.
#ifndef F_CPU #определи F_CPU 16000000UL // казваща кристална честота на кристала (16 MHz AVR ATMega328P) #endif
#include // заглавка за активиране на контрола на потока от данни върху щифтове. Определя пинове, портове и т.н. #include // header за активиране на функцията за забавяне в програмата
#define BUTTON1 2 // бутон превключвател, свързан към порт B pin 2 #define DEBOUNCE_TIME 25 // време за изчакване, докато бутонът "de-bouncing" #define LOCK_INPUT_TIME 300 // време за изчакване след натискане на бутон
// Timer0, PWM Initialization void timer0_init () {// настройка на таймер OC0A, OC0B щифт в режим на превключване и режим CTC TCCR0A | = (1 << COM0A1) | (1 << COM0B1) | (1 << WGM00) | (1 << WGM01); // настройка на таймер с предусилвател = 256 TCCR0B | = (1 << CS02); // инициализираме брояча TCNT0 = 0; // инициализираме стойността за сравнение OCR0A = 0; }
// ADC Initialization void ADC_init () {// Активиране на ADC, честота на извадката = osc_freq/128 задаване на прескалиране на максимална стойност, 128 ADCSRA | = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);
ADMUX = (1 << REFS0); // Избор на референтно напрежение (AVCC)
// Състояние на превключвателя на бутоните без знак char button_state () {
/ * бутонът се натиска, когато бутонът BUTTON1 е ясен */
ако (! (PINB & (1 <
{
_ закъснение_ms (DEBOUNCE_TIME);
ако (! (PINB & (1 <
}
връщане 0;
}
// Инициализация на портове void port_init () {DDRB = 0b00011011; // PB0-IN1, PB1-IN2, PB3-IN3, PB4-IN4, PB2-ПЪТЕН ПЕРЕН ПЕРЕКЛЮЧАТЕЛ НА БУТОНА = 0b00010110;
DDRD = 0b01100000; // PD5-ENB (OC0B), PD6-ENA (OC0A) PORTD = 0b00000000;
DDRC = 0b00000000; // PC0-ADC PORTC = 0b00000000; // Задайте ниски всички щифтове на PORTC, което го изключва. }
// Тази функция чете стойността на аналоговия към цифров преобразувател. uint16_t get_LightLevel () {_delay_ms (10); // Изчакайте известно време каналът да избере ADCSRA | = (1 << ADSC); // Стартирайте преобразуването на ADC, като зададете бит ADSC. Напишете 1 на ADSC
while (ADCSRA & (1 << ADSC)); // Изчакайте завършването на преобразуването
// ADSC става 0 отново дотогава, непрекъснато изпълнява цикъл _delay_ms (10); връщане (ADC); // Връща 10-битовия резултат
}
// Тази функция пренасочва число от един диапазон (0-1023) към друг (0-100). uint32_t карта (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 main (void)
{uint16_t i1 = 0;
port_init ();
timer0_init (); ADC_init (); // инициализиране на ADC
докато (1)
{i1 = map (get_LightLevel (), 0, 1023, 0, 100);
OCR0A = i1; // Задайте изходен регистър канал за сравнение A OCR0B = 100-i1; // Задайте регистър за сравнение на изходния канал B (обърнат)
if (button_state ()) // Ако бутонът е натиснат, превключете състоянието на светодиода и забавете за 300ms (#define LOCK_INPUT_TIME) {PORTB ^= (1 << 0); // превключване на текущото състояние на щифта IN1. PORTB ^= (1 << 1); // превключване на текущото състояние на щифта IN2. Обърнете посоката на въртене на двигателя
PORTB ^= (1 << 3); // превключване на текущото състояние на щифта IN3. PORTB ^= (1 << 4); // превключване на текущото състояние на щифта IN4. LED лентата е изключена/включена. _ закъснение_ms (LOCK_INPUT_TIME); }}; return (0); }
Програмирането е завършено. След това изграждане и компилиране на код на проект в шестнадесетичен файл.
Качване на HEX файл във флаш паметта на микроконтролера: въведете в прозореца на DOS подкана командата:
avrdude –c [име на програмист] –p m328p –u –U флаш: w: [име на вашия шестнадесетичен файл]
В моя случай е следното:
avrdude –c ISPProgv1 –p m328p –u –U флаш: w: PWM.hex
Тази команда записва шестнадесетичен файл в паметта на микроконтролера. Гледайте видеоклипа с подробно описание на изгарянето на флаш паметта на микроконтролера: Изгарянето на флаш паметта на микроконтролера …
Добре! Сега микроконтролерът работи в съответствие с инструкциите на нашата програма. Нека го проверим!
Стъпка 6: Електрическата верига
Свържете компонентите в съответствие със схематична диаграма.
Препоръчано:
Стъпков двигател Контролиран стъпков двигател без микроконтролер!: 6 стъпки
Стъпков двигател, управляван от стъпков двигател без микроконтролер !: В тази бърза инструкция ще направим прост контролер за стъпков двигател, използващ стъпков двигател. Този проект не изисква сложни схеми или микроконтролер. Така че, без да се замисляме, нека започнем
Стъпков двигател Контролиран стъпков двигател без микроконтролер (V2): 9 стъпки (със снимки)
Стъпков двигател, управляван от стъпков двигател без микроконтролер (V2): В една от предишните ми инструкции, аз ви показах как да управлявате стъпков двигател, използвайки стъпков двигател без микроконтролер. Това беше бърз и забавен проект, но той дойде с два проблема, които ще бъдат решени в тази инструкция. И така, остроумие
Как да конвертирате 8Ch PWM в импулсна позиция модулация: 4 стъпки
Как да преобразуваме 8Ch PWM в модулация на импулсна позиция: Ще прегледаме 2 формата на изходния сигнал на радиоприемници за радиоуправляеми модели (или RC модели). Традиционният и най -често срещаният тип приемник е PWM и обикновено PWM изисква само един проводник на канал. PPM сигнализацията вече става
Стъпков двигател Контролиран стъпков двигател - Стъпков двигател като въртящ се енкодер: 11 стъпки (със снимки)
Стъпков двигател Контролиран стъпков двигател | Стъпков двигател като въртящ се енкодер: Имате ли няколко стъпкови двигателя, които лежат наоколо и искат да направят нещо? В тази инструкция нека използваме стъпков двигател като въртящ се енкодер, за да контролираме позицията на друг стъпков двигател, използвайки микроконтролер Arduino. Така че без да се замисляме, нека да
Visuino RAMPS за модулация на импулсна ширина (PWM) с помощта на LED: 8 стъпки
Visuino RAMPS за Pulme Width Modulation (PWM) Използване на LED: В този урок ще използваме LED, свързан към Arduino UNO и Visuino, за да намалим светодиода, използвайки Pulme Width Modulation (PWM) и Ramps компонент. Гледайте демонстрационен видеоклип