Показать содержимое по тегу: atmega8

Когда делаешь какую-либо схему или проект, задумываешься как максимум экономить батарейку, где задача выполняется по нажатию кнопки (выключатели с пультом управления) и тут родилась простая и эффективная схема. Ее задача чтобы  кнопка работала  не только вызывать  функцию, но и подавать питание на микроконтроллер. Таким образом потребление напряжение схемы в  режиме ожидание падает до нуля , так как батарейка  полностью отключенной от схемы.

Экономия электричества

 Такой алгоритм  реализуется на кнопках с несколькими парами контактных групп, чаще же в проектах используется обычная тактовая кнопка, которая умеет замыкать только два контакта между собой. Поэтому пошевелив извилинами накидал вот такую схему:

Схема экономии электричества

Как видно, при нажатии на любую кнопку, происходит запитывание микроконтроллера и одновременно с этим на соответствующей ножке выставляется высокий уровень. Диоды в схеме нужны чтобы отсечь попадание высокого уровня на остальные входы. 



для проверки схемы собрал ее на макетке:

Макетная плата

код обработки нажатия самый элементарный:

 

$regfile = "m16def.dat"
$crystal = 8000000
Config Portb = Output
Config Portc = Input
Do
If Pinc.0 = 1 Then
 Portb.0 = 1
End If
If Pinc.1 = 1 Then
 Portb.1 = 1
End If
If Pinc.2 = 1 Then
 Portb.2 = 1
End If
Loop
End

Источник: http://avrproject.ru

Опубликовано в Устройства на AVR PIC

Устройство предназначено для автоматического включения ближнего света при начале движения автомобиля и регулировки напряжения на лампах ближнего света в зависимости от режима движения. Как известно в новых правилах ПДД в России и в Украине, да и не только там, теперь обязательно должны быть включен ближний свет фар, но часто забывают многие нажать накнопочку, особенно это касается отечественного автопрома, на новых моделях эта функция уже идет с завода.

Алгоритм работы.

 В начале движения, при достижении автомобилем скорости 6 км/ч устройство плавно включает лампы ближнего света до 75% от напряжения бортовой сети и удерживает это значение до скорости 69 км/ч.
- В диапазоне от 70 км/ч до 94 км/ч устанавливается 85% от напряжения бортовой сети.
- В диапазоне от 95 км/ч и выше устанавливается 95% от напряжения бортовой сети.
- После остановки автомобиля на время более 22 секунд напряжение снижается до 30%.
- При возобновлении движения напряжение снова устанавливается в соответствии с вышеописанным алгоритмом.
- При включении водителем ближнего света штатным выключателем напряжение устанавливается на 100%.
- После выключения зажигания лампы горят ещё несколько секунд, а затем гаснут.

Все изменения напряжения на лампах в том числе и включение света штатным выключателем, кроме выключения, осуществляются плавно с шагом по 5% за каждые 1/20 либо 1/10 секунды, в зависимости от режима работы. Выключение ламп происходит моментально.

БЛОК УПРАВЛЕНИЯ ДНЕВНЫМИ ХОДОВЫМИ ОГНЯМИ

 

Замечание по изготовлению устройства.

Проводники на плате между ножками 1,5 ,3 ключа BTS555 и соответствующими контактами клеммника необходимо
тщательно пропаять и усилить медной проволокой, припаянной поверх проводников. Проволочные перемычки обозначенные на плате впаиваются в первую очередь.

Программировать микроконтроллер можно через ISP-разъем разведенный на плате. Распиновка ISP-разъема показана ниже:

Управление дневными ходовыми огнями на автомобиле

Установка фьюзов микроконтроллера показана ниже:

Установка фьюзов микроконтроллера

 

Установка устройства в автомобиле.

Контакт 1 (SPD - вход) подключается к выходному контакту датчика скорости с разрешением 6 импульсов на метр.
Контакт 2 (ON - вход) подключается к проводу штатной проводки подающему +12 вольт на лампы ближнего света, который необходимо заранее отключить от ламп.
Контакт 3 (GND - вход) земля.
Контакт 4 (IGN - вход) +12 вольт, которые появляются при включении зажигания и пропадают при выключении. Под капотом можно взять прямо с датчика скорости.
Контакт 5 (BAT - силовой вход) +12 вольт с АКБ. Подключать к АКБ через предохранитель 15 ампер.
Контакт 6 (OUT - силовой выход) +12 вольт. ШИМ-управление на лампы ближнего света. Подключается к лампам вместо отключенного от них штатного провода, заведенного на контакт 2 (ON).

скачать файл с прошивкой 

Источник: http://radioparty.ru

Опубликовано в Все для автомобиля

АЦП – аналогово-цифровой преобразователь (ADC- Analog-to-Digital Converter). Преобразует некий аналоговый сигнал в цифровой. Битность АЦП определяет точность преобразования сигнала. Время преобразования – соответственно скорость работы АЦП. АЦП встроен во многих микроконтроллерах семейства AVR и упрощает использование микроконтроллера во всяких схемах регулирования, где требуется оцифровывать некий аналоговый сигнал.


Рассмотрим принцип работы АЦП. Для преобразования нужен источник опорного напряжения и собственно напряжение, которое мы хотим оцифровать (напряжение, которое преобразуется должно быть меньше опорного). Также нужен регистр, где будет храниться преобразованное значение, назовем его Z. Входное напряжение = Опорное напряжение*Z/2^N, где N – битность АЦП. Условимся, что этот регистр, как у ATmega8, 10-ти битный. Преобразование в нашем случае проходит в 10 стадий. Старший бит Z9 выставляется в единицу. Далее генерируется напряжение (Опорное напряжение*Z/1024), это напряжение, с помощью аналогового компаратора сравнивается с входным, если оно больше входного, бит Z9 становиться равным нулю, а если меньше – остается единицей. Далее переходим к биту Z8 и вышеописанным способом получаем его значения. После того, как вычисление регистра Z окончено, выставляется некий флаг, который сигнализирует, что преобразование закончено и можно считывать полученное значение. На точность преобразования могут очень сильно влиять наводки и помехи, а также скорость преобразования. Чем медленнее происходит преобразования – тем оно точней. С наводками и помехами следует бороться с помощью индуктивности и емкости, как советует производитель в даташите:

01

В микроконтроллерах AVR как источник опорного напряжения может использоваться вывод AREF, или внутренние источники 2,56В или 1,23В. Также источником опорного напряжения может быть напряжение питания. В некоторых корпусах и моделях микроконтроллеров есть отдельные выводы для питания АЦП: AVCC и AGND. Выводы ADCn – каналы АЦП. С какого канала будет оцифровываться сигнал можно выбрать с помощью мультиплексора.
Теперь продемонстрируем примером сказанное выше. Соорудим макет, который будет работать как вольтметр с цифровой шкалой. Условимся, что максимальное измеряемое напряжение будет 10В. Также пусть наш макет выводит на ЖКИ содержимое регистра ADC.

Схема

Для увеличения кликните на схему.

Обвязка микроконтроллера и ЖКИ WH1602A стандартна. X1 – кварцевый резонатор на 4 Мгц, конденсаторы С1,С2 – 18-20 пФ. R1-C7 цепочка на выводе reset по 10 кОм и 0,1 мкФ соответственно. Сигнальный светодиод D1 и ограничивающий резистор R2 200 Ом и R3 – 20 Ом. Регулировка контраста ЖКИ – VR1 на 10 кОм. Источник опорного напряжения мы будем использовать встроенный на 2,56В. С помощью делителя R4-R5 мы добьемся максимального напряжения 2,5В на входе PC0, при напряжении на щупе 10В. R4 – 3 кОм, R5 – 1 кОм, в их номиналу нужно отнестись тщательно, но если не возможности подобрать точно такие, можно сделать любой резистивный делитель 1:4 и программно подкорректировать показания, если это потребуется. Дроссель на 10мкГн и конденсатор на 0,1 мкФ для устранения шумов и наводок на АЦП на схеме не показан. Их наличие подразумевается само собой, если используется АЦП. Теперь дело за программой:

{codecitation style="brush: xml;"} #include

#define RS 2 //RS=PD2
#define E 3 //E=PD3

#define TIME 10 //Константа временной задержки для ЖКИ
//Частота тактирование МК - 4Мгц

#define R_division 3.837524 //=R4/R5 константа

unsigned int u=0; //Глобальная переменная с содержимым преобразования

void pause (unsigned int a)
{
unsigned int i;
for (i=a;i>0;i--);
}

void lcd_com (unsigned char lcd) //Передача команды ЖКИ
{
unsigned char temp;

temp=(lcd&~(1<<rs))|(1 e="" rs="0" br=""> PORTD=temp; //Выводим на portD старшую тетраду команды, сигналы RS, E
asm("nop"); //Небольшая задержка в 1 такт МК, для стабилизации
PORTD=temp&~(1<<e); br="">
temp=((lcd*16)&~(1<<rs))|(1 e="" rs="0" br=""> PORTD=temp; //Выводим на portD младшую тетраду команды, сигналы RS, E
asm("nop"); //Небольшая задержка в 1 такт МК, для стабилизации
PORTD=temp&~(1<<e); br="">
pause(10*TIME); //Пауза для выполнения команды
}

void lcd_dat (unsigned char lcd) //Запись данных в ЖКИ
{
unsigned char temp;

temp=(lcd|(1<<rs))|(1 e="" rs="1" br=""> PORTD=temp; //Выводим на portD старшую тетраду данных, сигналы RS, E
asm("nop"); //Небольшая задержка в 1 такт МК, для стабилизации
PORTD=temp&~(1<<e); br="">
temp=((lcd*16)|(1<<rs))|(1 e="" rs="1" br=""> PORTD=temp; //Выводим на portD младшую тетраду данных, сигналы RS, E
asm("nop"); //Небольшая задержка в 1 такт МК, для стабилизации
PORTD=temp&~(1<<e); br="">
pause(TIME); //Пауза для вывода данных
}

void lcd_init (void) //Иниализация ЖКИ
{
lcd_com(0x2c); //4-проводный интерфейс, 5x8 размер символа
pause(100*TIME);
lcd_com(0x0c); //Показать изображение, курсор не показывать
pause(100*TIME);
lcd_com(0x01); //Очистить DDRAM и установить курсор на 0x00
pause (100*TIME);
}

unsigned int getADC(void) //Считывание АЦП
{ unsigned int v;

ADCSRA|=(1<<adsc); br="">
while ((ADCSRA&_BV(ADIF))==0x00) //Дождатся окончания преобразования
;

v=(ADCL|ADCH<<8); br=""> return v;
}

void write_data (unsigned int u)
{ unsigned char i;
double voltage=0;

lcd_com(0x84); //Вывод регистра ADC на ЖКИ
for (i=0;i<10;i++) br=""> if ((u&_BV(9-i))==0x00) lcd_dat (0x30);
else lcd_dat (0x31);

lcd_com(0xc2);
voltage= R_division*2.56*u*1.024; //Расчет напряжения

i=voltage/10000; //Выведение напряжения на ЖКИ
voltage=voltage-i*10000;
if (i!=0) lcd_dat(0x30+i);

i=voltage/1000;
voltage=voltage-i*1000;
lcd_dat(0x30+i);

lcd_dat(',');

i=voltage/100;
voltage=voltage-i*100;
lcd_dat(0x30+i);

i=voltage/10;
voltage=voltage-i*10;
lcd_dat(0x30+i);

lcd_dat('v');
}

int main(void)
{
DDRD=0xfc;

pause(3000); //Задержка для включения ЖКИ
lcd_init(); //Инициализация ЖКИ

lcd_dat('A'); //Пишем "ADC=" и "U=" на ЖКИ
lcd_dat('D');
lcd_dat('C');
lcd_dat('=');
lcd_com(0xc0);
lcd_dat('U');
lcd_dat('=');

ADCSRA=(1<<aden)|(1 adps1="" 1="" adps0="" br=""> //Включаем АЦП, тактовая частота бреобразователя =/8 от тактовой микроконтроллера
ADMUX=(1<<refs1)|(1 refs0="" 0="" mux0="" mux1="" mux2="" mux3="" br=""> //Внутренний источник опорного напряжения Vref=2,56, входом АЦП является PC0

while(1)
{
u=getADC(); //Считываем данные
write_data(u); //Выводим их на ЖКИ
pause(30000);
}

return 1;
}

{/codecitation}

Программа проста. В начале мы инициализируем порты ввода/вывода. Для того, чтобы служить входом АЦП, пин PC0 должен работать на вход. Далее проводим инициализацию ЖКИ и АЦП. Инициализация АЦП заключается в его включении битом ADEN в регистре ADCSRA. И выбора частоты преобразования битами ADPS2, ADPS1, ADPS0 в том же регистре. Также выбираем источник опорного напряжения, биты REFS1 REFS0 в регистре ADMUX и вход АЦП: биты MUX0,MUX1,MUX2, MUX3 (в нашем случаем входом АЦП является PC0, поэтому MUX0.3=0). Далее, в вечном цикле, начинаем преобразования установкой бита ADSC в регистре ADCSRA. Дожидаемся окончания преобразования (бит ADIF в ADCSRA становиться равным 1). Далее вынимаем данные из регистра ADC и выводим их на ЖКИ. Вынимать данные из ADC нужно в такой последовательности: v=(ADCL+ADCH*256); если использовать v=(ADCH*256+ADCL); - в упор не работает. Также есть хитрость, чтобы не работать с дробными числами. Когда производиться вычисления входного напряжения в вольтах. Мы просто будем хранить наше напряжения в милливольтах. Например, значение переменной voltage 4234 означает, что мы имеем 4,234 вольта. Вообще операции с дробными числами кушают очень много памяти микроконтроллера (наша прошивка вольтметра весит чуть больше 4 килобай, это половина памяти программ ATmega8!), их рекомендуется использовать только при особой необходимости. Вычисления входного напряжения в милливольтах просто: voltage=R_division*2.56*u*1.024;
Здесь R_division – коефициент резистивного делителя R4-R5. Так, как реальный коефициент делителя может отличаться от расчетного, то наш вольтметр будет врать. Но подкорректировать это просто. С помощью тестера меряем некое напряжение, получаем X вольт, а наш вольтметр пускай показывает Y вольт. Тогда R_division = 4*X/Y, если Y больше X и 4*Y/X если X больше Y. На этом настройка вольтметра завершена, и им можно пользоваться.
Скачать прошивку в виде проекта под AVR Studio 4.
Как работает вольтметр можно ознакомиться на видео:

Также можно доработать свой блок питания. Вставив в него цифровой вольтметр-амперметр на ЖКИ и защиту от перегрузки (для измерения тока нам понадобиться мощный шунт сопротивлением порядка 1 Ом).

vidon

В свой блок питания я встроил еще защиту от перегрузки, когда ток превышает 2А, то пьезо пищалка начинает усердно пищать, сигнализируя о перегрузке:

Опубликовано в Устройства на AVR PIC