Четверг, 18.04.2024, 22:27
Приветствую Вас Гость | RSS
Главная | Каталог статей | Регистрация | Вход
Меню сайта
Реклама Google
Форма входа
Категории раздела
Это нужно знать! [17]
Изучаем AVR [30]
Программаторы [12]
Необходимое ПО [8]
Готовые устройства [73]
Справочная [38]
Инструмент [0]
Технология [8]
Литература [0]
Arduino скетчи [18]
Поиск
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Микроконтроллеры - это просто!
Главная » Статьи » Изучаем AVR

ШИМ для двигателя постоянного тока (avr+L293D)
Так, начинаем разбираться.



Это мостовая схема включения электродвигателя.
На схеме есть 4 управляющих ключа, состояния которых определяют работу электродвигателя.
a)  запрещенные комбинации: { 1-отк,2-зак,3-отк,4-зак}  { 1-зак,2-отк,3-зак,4-отк}(еще ряд комбинаций)  (короткое замыкание)
б) ротор электродвигателя не вращается: { 1-отк,2-отк,3-зак,4-зак}  { 1-зак,2-зак,3-отк,4-отк} (не будет разницы потенциалов на выводах электродвигателя)
в) вращение двигателя : { 1-отк,2-зак,3-зак,4-отк}
г)вращение двигателя в другую сторону: { 1-зак,2-отк,3-отк,4-зак}

Наша микросхема L293D(L293DD) имеет две мостовых схемы для подключения двух электродвигателей.


 

Входы ENABLE1 и ENABLE2 отвечают за включение каждого из драйверов, входящих в состав микросхемы.(это те самые входы для ШИМ сигнала)
Входы INPUT1 и INPUT2 управляют двигателем, подключенным к выходам OUTPUT1 и OUTPUT2.
Входы INPUT3 и INPUT4 управляют двигателем, подключенным к выходам OUTPUT3 и OUTPUT4.
Контакт Vs соединяют с положительным полюсом источника электропитания двигателей или просто с положительным полюсом питания, если питание схемы и двигателей единое. Проще говоря, этот контакт отвечает за питание электродвигателей.
Контакт Vss соединяют с положительным полюсом источника питания. Этот контакт обеспечивает питание самой микросхемы.
Четыре контакта GND соединяют с «землей» (общим проводом или отрицательным полюсом источника питания). Кроме того, с помощью этих контактов обычно обеспечивают теплоотвод от микросхемы, поэтому их лучше всего распаивать на достаточно широкую контактную площадку.
 

Работу нашей микросхемы можно представить в виде таблицы:

EN1 IN1 IN2 OUT1 OUT2
1 0 0 0 0
1 1 0 1 0
1 0 1 0 1
1 1 1 1 1
Характеристики микросхемы L293D

напряжение питания двигателей (Vs) — 4,5…36V
напряжение питания микросхемы (Vss) — 5V
допустимый ток нагрузки — 600mA (на каждый канал)
пиковый (максимальный) ток на выходе — 1,2A (на каждый канал)
логический «0″ входного напряжения — до 1,5V
логическая «1″ входного напряжения — 2,3…7V
скорость переключений до 5 kHz.
защита от перегрева
Теперь пару слов о ШИМ)))). Так у нас есть двигатель и он подключен к источнику питания через ключи (мостовая схема). Теперь открываем ключи по диагонали и наш электродвигатель начинает вращаться, но нам этого мало мы хотим регулировать скорость вращения двигателя. Для этого мы начинаем включать эти ключи на время Х  и выключать на времяY с большой скоростью.




Из рисунка видно, что мы используя цифровые сигналы (лог «0″ и лог «1″) мы можем получать своеобразное эквивалентное напряжение отличное от напряжения логических уровней.
Регулируя скважность -[определяющий отношение его периода следования (повторения) к длительности импульса] мы регулируем скорость вращения нашего электродвигателя.

Так теперь осталось разобраться как же сделать управляемый шим сигнал на основе МК.
Посмотрим на наш МК


 

Выделенные ножки являются специализированными для формирования шим сигналов, так как эти ножки привязаны к встроенным таймерам счетчикам нашего МК. Есть множество режимов работы таймеров счетчиков, в этой статье мы расмотрим один из них  Fast PWM («Быстродействующий ШИМ») позволяет генерировать высокочастотный сигнал с широтно-импульсной модуляцией. Для наших целей подходит еще один режим  Phase Correct PWM («ШИМ с точной фазой»), как и режим Fast PWM, предназначен для генерации сигналов с широтноимпульсной модуляцией. Однако в этом режиме счетный регист функционирует как реверсивный счетчик, состояние которого сначала изменяется от 0×0000 до максимального значения, а затем обратно до 0×0000. Соответственно, максимальная частота сигнала в этом режиме в 2 раза ниже максимальной частоты сигнала в режиме Fast PWM.

Понять разницу этих режимов легче взглянув на рисунок ниже:



У нас нет необходимости следить за фазой, поэтому мы будем использовать выделенный режим FAST PWM

Посмотрим на электрическую схему подключения электродвигателя к МК через L293D.



Так немного по схеме. Кнопки добавлены в схему для управления электродвигателем. Важно что они подключены с использованием внешних подтягивающих резисторов номиналом 10КОМ. Это сделано для повышения помехоустойчивости. Если использовать внутренние резисторы (100КОМ) то из за столь большого номинала сопротивления возможны ложные срабатывания кнопок во время работы электродвигателя.
Кнопки:
1) старт/стоп (запуск/остановка)
2) реверс (заставить вращаться двигатель в другую сторону)
3) увеличение значения сравнения для нашего таймера счетчика (OCR0)
4) уменьшение значения сравнения для нашего таймера счетчика (OCR0)

OC0 — эта ножка управляется 8-ми битным таймером счетчиком.

ТАК  Начинаем настраивать таймер счетчик.
Первый регистр с которого начнем :  TCCR0



WGM00 и WGM01 : эти биты определяют режим работы нашего счетчика.



TCCR0|=(1<<WGM00)|(1<<WGM01); // установка режима Fast PWM

COM00 и COM01 : эти биты определяют как будет вести себя ножка при соответствии счетного регистра с регистром сравнения. Важно что для разных режимов будут разные таблици состояний ножки ниже приведена для нашго режима Fast PWM.



TCCR0|=(1<<COM01); // сбрасываем в «0″  при совпадении и устанавливаем в «1″ при обнулении.

CS00 и CS01 и CS02 : эти биты определяют предделитель нашего счетчика (если предделитель например 8 значит счетчик считает каждый 8ой импульс). Также  источником тактирования может служить ножка T1. ВАЖНО что после установки этих битов наш таймер начинает работать.



TCCR0 |=(1<<CS00); // нет предделителя. Счетчик начинает считать.

Вот собственно наша функция инициализации таймера счетчика:

void timer_init (void)
{
TCCR0|=(1<<WGM00)|(1<<WGM01);  // устанавливаем режим шим
TCCR0|=(1<<COM01);  // определяем механизм изм сост ножки
OCR0 = 255;  // определяем число сравнения
TCCR0 |=(1<<CS00);  //запуск таймера без предделителя
}

 

Весь код:
#define F_CPU 1000000UL
#include <avr/io.h>
#include <util/delay.h>

void Port_init (void)
{
DDRB =0b00001011;        //2-е первые ножки на выход так как они управляют двигателем
PORTB=0b00000000;    // 4ую ножку тоже на выход(ножка OC0)
}

void timer_init (void)
{
TCCR0|=(1<<WGM00)|(1<<WGM01);  // устанавливаем режим шим
TCCR0|=(1<<COM01);  // определяем механизм изм сост ножки
OCR0 = 255;  // определяем число сравнения
TCCR0 |=(1<<CS00);  //запуск таймера без предделителя
}

int main(void)
{
Port_init();
timer_init();

char Flag1=0,Flag2=0,Flag3=0,Flag4=0;

while(1)
{
//старт стоп
if(!(PINB&4)) 
{ Flag2=1; _delay_ms(10); }
if(( Flag2==1 )&&(PINB&4))
{PORTB^=1; Flag2=0; } 

//реверс
if(!(PINB&16))
{ Flag1=1; _delay_ms(10); }
if(( Flag1==1 )&&(PINB&16))
{PORTB^=3; Flag1=0; }

//скорость +
if(!(PINB&32))
{ Flag3=1; _delay_ms(10); }
if(( Flag3==1 )&&(PINB&32))
{ if (OCR0!=255) OCR0+=15; Flag3=0; } 

//скорость -
if(!(PINB&64))
{ Flag4=1; _delay_ms(10); }
if(( Flag4==1 )&&(PINB&64))
{ if (OCR0!=0)OCR0-=15; Flag4=0; } 
}
}
Категория: Изучаем AVR | Добавил: Alex (20.01.2014)
Просмотров: 5803 | Рейтинг: 5.0/1
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Copyright MyCorp © 2024