|
Конструкции на ATmega8 и ATmega16
Статьи публикуются по мере поступления. Для упорядоченного тематического
поиска воспользуйтесь блоком "Карта сайта"
Управление электродвигателем микроконтроллером ATmega8.
Рисунок 1 - Схема управления электродвигателем микроконтроллером ATmega8
Мост и система управления в схеме на рисунке 1 подключены к разным источникам с одинаковым напряжением 5В. Светодиоды VD1 -VD4 показывают какая пара транзисторов моста работает VT1 и VT4 или VT2 и VT3. В мостовой схеме из предыдущей статьи в цепях коллекторов транзисторов VT3 и VT4 были резисторы с сопротивлением 56 Ом, в этой схеме на рисунке 1 этих резисторов нет так как из за них уменьшается мощность передаваемая двигателю но резисторы в цепях коллекторов транзисторов VT1 и VT2 оставлены для ограничения тока. Ниже приведен исходный код программы на языке C++ для микроконтроллера:
#include <avr/io.h>
#include <avr/delay.h>
#define F_CPU 8000000UL // 8 MHz
int main(void) // начало основой программы
{
DDRD = 0xff; /* все выводы порта D сконфигурировать как выходы */
DDRC &= ~(1<<4); //вывод 4 порта С сконфигурировать как вход
while (1) // Бесконечный цикл
{
DDRD |= 1<<1;
DDRD |= 1<<2;
_delay_ms(250); // Ждем 250*8 мсек.
DDRD &= ~(1<<1);
DDRD &= ~(1<<2);
_delay_ms(250); // Ждем 250*8 мсек.
DDRD |= 1<<0;
DDRD |= 1<<3;
_delay_ms(250); // Ждем 250*8 мсек.
DDRD &= ~(1<<0);
DDRD &= ~(1<<3);
_delay_ms(500); // Ждем 500*8 мсек.
}
} // закрывающая скобка основной программы
Исходный код компилировался в среде WinAVR, hex файл прошивался в микроконтроллер с помощью программы ponyprog2000. В схеме на рисунке 1 транзистор какой либо оптопары должен открываться при подаче нуля в соответствующий порт но несмотря на это микроконтроллер работал как надо после прошивки в него приведенной программы.
Купить
Программаторы, средства разработки и отладки для DSP,
средства разработки и отладки для ПЛИС-ПАИС
Доработка схемы управления электродвигателем.
В схеме управления электродвигателем из предыдущей статьи используются четыре бита порта D микроконтроллера, количество используемых битов можно уменьшить что позволит управлять большим количеством двигателей, упростить программу и уменьшить занимаемый объем памяти в микроконтроллере. Если соединить последовательно диоды оптопар открывающих транзисторы на диагонали моста для каждой диагонали то подача сигнала с микроконтроллера на одну из последовательно соединенных пар диодов приведет к открытию транзисторов на одной из диагоналей. Таким образом можно использовать один бит порта для управления транзисторами на одной из диагоналей. Для управления электродвигателем можно использовать одну из схем на рисунке 1 или на рисунке 2.
Рисунок 1 - Схема управления электродвигателем микроконтроллером 1
Рисунок 2 - Схема управления электродвигателем микроконтроллером 2
По идее в первой схеме для открытия нужных транзисторов в соответствующий бит подается ноль, например для открытия транзисторов VT2 и VT3 в нулевой бит порта D (PD0) подается ноль следовательно напряжение на нем падает это приводит к тому что к диодам оптопар DD3 и DD5 прикладывается прямое напряжение в результате этого диоды оптопар светятся а их транзисторы открываются что приводит к открытию транзисторов VT2 и VT3. Во второй схеме открытие происходит при подаче единицы, например при подаче единицы в нулевой бит порта D открываются диоды оптопар DD3 и DD5.
Трансформаторный преобразователь напряжения
Транзисторный мост рассматриваемый, в предыдущих статьях, как схема для коммутации электродвигателя может использоваться как инвертор напряжения (преобразователь постоянного напряжения в переменное) если диагональные транзисторы включать поочерёдно с требуемой частотой. Используя трансформатор можно повысить или понизить это напряжение до требуемого уровня. Преобразованное напряжение можно выпрямить выпрямителем и получить преобразователь постоянного напряжения. Схема управления электродвигателем микроконтроллером дополнена транзисторами VT2, VT5, VT4, VT7 включенными как обратные диоды, в диагональ моста включена первичная обмотка повышающего напряжение трансформатора Т1. Схема представлена на рисунке 1.
Рисунок 1 - Схема преобразователя
Первичная обмотка w1 содержит около 21 витков алюминиевым проводом, вторичная w2 около 400 витков тонким медным проводом, сердечник использован от трансформатора строчной развёртки ТВС-110П3.
Напряжение на первичной обмотке составляло примерно 1.5 В.
Из за повышенной частоты видно что светодиоды светятся непрерывно, в принципе в этих светодиодах нет необходимости. Напряжение на вторичной обмотке около 31В.
Действующее напряжение трансформатор повышает примерно в 20 раз. Программа для управления электродвигателем микроконтроллером дополнена кодом для преобразователя напряжения. При нажатии на кнопку SB1 подключенную к четвёртому биту порта C срабатывает старый код который можно убрать. В коде для работы преобразователя напряжения, в отличии от кода для управления двигателем, используется функция _delay_us для создания задержки в микросекундах.
Ниже приведен исходный код программы на языке C++ для микроконтроллера:
#include <avr/io.h>
#include <avr/delay.h>
#define F_CPU 8000000UL // 8 MHz
int main(void) // начало основой программы
{
DDRD = 0xff; /* все выводы порта D сконфигурировать как выходы */
DDRC = 0x00; //выводы порта С сконфигурировать как входы
PORTC = 0xff; // установить "1" на всех выводах порта C,
//включаем подтягивающие резисторы
while (1) // Бесконечный цикл
{
if (!(PINC & (1<<PINC4)))
{
DDRD |= 1<<1;
DDRD |= 1<<2;
_delay_ms(250); // Ждем 250*8 мсек.
DDRD &= ~(1<<1);
DDRD &= ~(1<<2);
_delay_ms(250); // Ждем 250*8 мсек.
DDRD |= 1<<0;
DDRD |= 1<<3;
_delay_ms(250); // Ждем 250*8 мсек.
DDRD &= ~(1<<0);
DDRD &= ~(1<<3);
_delay_ms(500); // Ждем 500*8 мсек.
}
else
{
DDRD &= ~(1<<0);
DDRD &= ~(1<<3);
DDRD |= 1<<1;
DDRD |= 1<<2;
_delay_us(5); // Ждем 5*8 мксек.
DDRD &= ~(1<<1);
DDRD &= ~(1<<2);
DDRD |= 1<<0;
DDRD |= 1<<3;
_delay_us(5); // Ждем 5*8 мксек.
}
}
} // закрывающая скобка основной программы
Исходный код компилировался в среде WinAVR, hex файл прошивался в микроконтроллер с помощью программы ponyprog2000
Удвоитель для преобразователя напряжения.
Удвоитель напряжения осуществляет выпрямление и увеличение, в два раза, переменного напряжения. На рисунке 1 представлен трансформаторный преобразователь напряжения дополненный удвоителем напряжения на элементах VD5, VD6, C1, C2 и конденсатором С3 на выходе.
Рисунок 1 - Трансформаторный преобразователь напряжения с удвоителем.
При каждом полупериоде переменного напряжения, на обмотке w2, заряжается либо конденсатор C1 либо конденсатор C2. Конденсатор C3 заряжается суммой напряжений на конденсаторах C1 и C2. Положительное напряжение будет на выводе конденсатора C3 подсоединенном к катоду диода VD5, отрицательное на выводе подсоединенном к аноду диода VD6. Схема на рисунке 1 представляет собой преобразователь постоянного напряжения так как преобразует постоянное напряжение питания в повышенное постоянное напряжения на выходе к которому может быть подключена нагрузка.
Постоянное напряжение на выходе составило примерно 80В:
Использование удвоителя позволяет уменьшить количество витков вторичной обмотки повышающего трансформатора удвоитель также выпрямляет напряжение заменяя таким образом половину витков обмотки и выпрямитель, если на выходе требуется постоянное напряжение.
Умножитель ун9/27-1.3 в преобразователе напряжения.
Если напряжение на вторичной обмотке большое и/или напряжение требуется увеличить до большей величины то удобнее использовать готовый умножитель например ун9/27-1.3 из старого телевизора. Схема приведена на рисунке 1:
Рисунок 1 - Преобразователь напряжения с умножителем ун9/27-1.3
Вместо микроконтроллера, в данном случае, лучше использовать схему попроще например мультивибратор или какой нибудь генератор колебаний. Микроконтроллер удобен тем что можно: изменять частоту управляющих импульсов, их скважность, осуществлять модуляцию, запускать и останавливать преобразование напряжения по заданной программе и в общем по всякому управлять работой преобразователя не внося изменений в схему или совершая какие либо другие сложные действия. На рисунке ниже чёрными стрелочками показаны выводы умножителя на которые подавалось переменное напряжение, красной и синей показаны выводы с которых снималось выходное напряжение.
На изображении ниже показана собранная схема преобразователя с умножителем.
Напряжение на выходе составило примерно 150 В.
Светодиодная мигалка на микроконтроллере ATmega8.
Использование микроконтроллеров существенно упрощает построение светодиодных мигалок. Светодиодная мигалка - это, наверное, одно из самых подходящих устройств для изготовления новичками в области построения схем на микроконтроллерах. Здесь приведен пример построения мигалки и исходный код для микроконтроллера ATmega8 на языке C++. Рассмотрим схему приведенную на рисунке:
Пусть кнопка SB1 будет для переключения режима мигания, а кнопка SB2 для изменения частоты мигания. Исходный код приведен ниже:
int main(void)
{
DDRD = 0xff; /* все выводы порта D сконфигурировать как выходы */
DDRC = 0x00; //выводы порта С сконфигурировать как входы
PORTC = 0xff; // установить "1" на всех выводах порта C,
// включаем подтягивающие резисторы
int i=0; //для задержек
int j=0; //для смены битов порта D
int d=20; //для изменения периода миганий
int sw=0; //для изменения режимов миганий
while (1) // Бесконечный цикл
{
if (!(PINC & (1<<PINC4))) //если логический ноль на 4 бите порта С
{
sw++; //преключить режим миганий
if(sw>4)sw=0;
}
if (!(PINC & (1<<PINC3))) //если логический ноль на 3 бите порта С
{
d+=20; //увеличить период миганий
if(d>260)d=20;
}
switch(sw)
{
case 0:
DDRD |= 1<<j;
for(i=0;i<d;i++)_delay_us(50);
DDRD &= ~(1<<j);
for(i=0;i<d;i++)_delay_us(50);
j++;
if(j>3)j=0;
break;
case 1:
DDRD |= 1<<j;
for(i=0;i<d;i++)_delay_us(50);
DDRD &= ~(1<<j);
for(i=0;i<d;i++)_delay_us(50);
j--;
if(j<0)j=3;
break;
case 2:
DDRD &= ~(1<<j);
for(i=0;i<d;i++)_delay_us(50);
DDRD |= 1<<j;
for(i=0;i<d;i++)_delay_us(50);
j++;
if(j>3)j=0;
break;
case 3:
DDRD &= ~(1<<j);
for(i=0;i<d;i++)_delay_us(50);
DDRD |= 1<<j;
for(i=0;i<d;i++)_delay_us(50);
j--;
if(j<0)j=3;
break;
case 4:
DDRD=0xff;
for(i=0;i<d;i++)_delay_us(50);
DDRD=0x00;
for(i=0;i<d;i++)_delay_us(50);
break;
}
}
}
При каждой итерации цикла while проверяется нажатие кнопок. Если нажата кнопка SB1 то переменная sw инкрементируется. Если переменная sw равна нулю (это проверяет команда switch) то в нулевой бит порта D записывается единица, потом происходит задержка, после чего в этот бит записывается ноль, затем снова задержка, потом переменная j инкрементируется и, если кнопка SB1 не была нажата, то все повторяется для следующего бита и таким образом происходит "движение светодиода", когда переменная j становится больше трех, ей присваивается ноль и все повторяется. Если нажимается кнопка SB1 то sw увеличивается и если она была равна нулю то она становиться равной единице и тогда происходит тоже что и при sw равной нулю только j теперь не инкрементируется а декрементируется (за счёт этого "движение светодиода" происходит в другую сторону) а при становлении j меньше нуля ей присваивается 3 и всё повторяется. Если sw равно двум или трем то происходит тоже только "бегущий светодиод" инвертирован, потому что порядок записи нуля и единицы в биты портов изменен. Если sw равно четырем то мигают все светодиоды. Если нажата кнопка SB2 то переменная d увеличивается на 20 и т.о. увеличиваются все задержки, следовательно увеличивается период мигания светодиодов при всех режимах. Если d>260 то ей снова присваивается значение 20 и период миганий резко уменьшается (частота увеличивается).
Купить
Программаторы, средства разработки и отладки для DSP,
средства разработки и отладки для ПЛИС-ПАИС
Исходный код компилировался в hex файл программой WinAVR. hex файл записывался в микроконтроллер программой PonyProg
Счётчик на ATmega16.
Подсчёт количества импульсов может применяться для решения множества разных практических задач (например приём сигнала для управления чем либо (реле например) или определение показаний датчика). Для подсчёта количества импульсов и использования результатов, этого подсчёта, можно использовать микроконтроллер. Для начала можно попробовать сделать систему для подсчёта нажатий кнопки а в случае её работоспособности на её основе делать более сложные устройства. Схема простого счётчика нажатий кнопки приведена на рисунке 1:
Рисунок 1 - Счётчик на ATmega16
Резистор R1 и конденсатор C1 предназначены для сглаживания пульсаций напряжения возникающих в результате дребезга контактов при нажатии и отпускании кнопки SB1. Резистор R2 предназначен для ограничения вытекающего из микроконтроллера тока. На светодиоды VD1-VD8 должно выводиться двоичное число (светодиод горит это 1, светодиод не горит это 0).
В микроконтроллер записывалась программа:
#include <avr/io.h>//порты ввода-вывода
#include <avr/interrupt.h>//прерывания
#define F_CPU 8000000UL // 8 MHz тактовая частота
int i=0x00;
ISR(INT0_vect)//вызывается при возникновении прерывания по фронту int0
{
i++;
if(i>0xff)
{
i=0x00;
}
PORTA=i;
}
int main(void) // начало основой программы
{
//конфигурация портов ввода/вывода
DDRA = 0xff;//0xff = 0b11111111 все выводы порта A сконфигурировать как выходы
DDRD = 0x00;//0x00 = 0b00000000 все выводы порта D сконфигурировать как входы
PORTD = 0xff;//включить подтягивающие резисторы на все выводы порта D
//инициализация прерывания
GICR |= 0x40;//0x40 = 0b01000000 разрешить прерывания на int0
MCUCR |= 0x3;//0x3 = 0b00000011 прерывания по фронту int0
sei();//разрешить все прерывания, cli()- запретить
while (1)//основной цикл
{
}
}
Для подсчёта количества импульсов используется прерывание по фронту импульса напряжения на выводе INT0 для этого в регистр MCUCR записано шестнадцатеричное число являющееся результатом операции логического сложения числа 0x3 (3 - само число 0x - приставка обозначающая то что это число шестнадцатеричное) и числа которое там до этой записи было, а там, скорее всего, был ноль по умолчанию. В MCUCR можно было бы записать это число в двоичном виде (т.е. логического сложения) так: MCUCR = 0b00000011, это было было бы проще и нагляднее но так не принято делать. Так как прерывание возникает при приходе фронта импульса (т.е. при переходе из низкого (0) уровня напряжения в высокое (1)) а нажатие кнопки делает ноль на выводе INT0 то прерывание будет возникать при отпускании кнопки и в момент подачи питания на микроконтроллер (но это на данном этапе не очень важно), при возникновении этого прерывания вызывается функция ISR с параметром INT0_vect и выполняется код в её теле. Для того чтобы прерывание возникало при нажатии на кнопку можно в регистр MCUCR записать число 0b00000010 вот так:
MCUCR = 0b00000010;
или в шестнадцатеричном виде:
MCUCR = 0x2;
для реакции на любое изменение (по фронту и по спаду):
MCUCR = 0x1;
Можно использовать вывод INT1, при этом будет вызываться ISR с параметром INT1_vect, в этом случае:
для реакции на любое изменение (по фронту и по спаду (нажатие и отпускание)):
MCUCR = 0x4;
по спаду (нажатие кнопки):
MCUCR = 0x8;
по фронту (отпускание кнопки):
MCUCR = 0xс;
Если записать MCUCR = 0x0; то INT0 и INT1 будут реагировать на низкий уровень напряжения.
При использовании INT2 (ISR вызывается с параметром INT2_vect)
по спаду:
MCUCSR = 0x0;
по фронту:
MCUCSR = 0x40;
Можно настроить прерывания и на INT0 и на INT1 например для обоих по фронту:
MCUCR = 0x0;
MCUCR |= 0x3;
MCUCR |= 0xc;
INT0 по спаду, INT1 по фронту и спаду:
MCUCR = 0x0;
MCUCR |= 0x2;
MCUCR |= 0x4;
Регистр GICR для разрешения внешних прерываний или их запрещения.
Разрешить на INT0:
GICR = 0x40;
Разрешить на INT1:
GICR = 0x80;
Разрешить на INT2:
GICR = 0x20;
hex файл создавался программой WinAVR, записывался в микроконтроллер он программой PonyProg через LPT порт и программатор на резисторах.
По материалам
http://electe.blogspot.ru