Arduino на ATmega8, ATmega48, ATmega88, ATmega168
Добрый день. С появлением arduino робототехника, автоматика и другие радио изделия стали нам более доступными. Раньше представить было трудно что с такой простотой можно писать прошивки для микроконтроллеров, с появлением arduino заниматься робототехникой могут даже детишки. Простота платформы arduino позволяет забыть о побитовых операциях и регистрах avr которые использовались повсеместно. Но так как платформа универсальная то и микроконтроллер тоже выбран универсальный. Например в arduino uno предусмотрен atmel atmega328p что даволи излишне для простой обработки нажатий на кнопки, а если делать сразу партию устройств то придется заплатить за незадействованную мощь.
Но так как arduino ide свободно распространяемая, любой без труда может написать дополнения и библиотеки, зачастую они могут быть очень полезными. В данной статье пойдет речь о библиотеке плат на основе ATmega8, ATmega48, ATmega88, ATmega168 под названием Mini Core. Данная библиотека позволят писать скетчи arduino под более слабые микроконтроллеры чем atmega328p, а это позволяет удешевить стоимость устройства за счет рационального использования мощности.
- Данные микроконтроллеры с теми же выводами и архитектурой и имеют минимальные отличия от atmega328p(заменяемые)
- Они дешевые и популярные(некоторые дешевле доллара)
- Они все имеют DIP и TQFP корпуса
Данная библиотека поддерживает все индексы микросхемы кроме PB (т.е. A, P, PA), например не стоит использовать ATMEGA168PB-AU.
Atmeg328 | atmega168 | atmega88 | atmega48 | atmega8 | |
Flash | 32 кб | 16 кб | 8 кб | 4 кб | 8 кб |
ОЗУ | 2 кб | 1 кб | 1 кб | 512 б | 1 кб |
ПЗУ | 1 кб | 512 б | 512 б | 256 б | 512 б |
Каналы ШИМ | 6 | 6 | 6 | 6 | 3 |
Пора от теории перейти к практике установим Mini Core, для установки понадобиться Arduino IDE версии 1.6.4 и выше. Если у вас нет Arduino или она старше качаем ее с оф. Сайта.
Самый удобный вариант для использование данных микроконтроллеров это взять arduino uno с микросхемой в корпусе dip и заменить на нужную. Также можно собрать плату с несложной обвязкой:
Автомобилистам
Бортовой компьютер для автомобиля (PIC18F258, C) 20-03-2013
Чесались руки сделать что-то для свежекупленного автомобиля, остановился на полезной вещи — бортовой компьютер. Автомобиль Nissan Almera N15.
Просмотров: 9451
GSM сигнализация для автомобиля (ATmega16) 07-10-2010
Устройство предназначено для своевременного оповещения автовладельца о взломе автомобиля. Сигнализация контролирует двери, окна.
Просмотров: 10268
Простой цифровой спидометр с семисегментным индикатором (ATmega8) 07-10-2010
Устройство представляет собой простой спидометр на AVR микроконтроллере. Его отличительной чертой является минимум деталей, всего 4.
Просмотров: 13241
Тахометр на AVR микроконтроллере (ATtiny2313, C) 13-01-2010
Данное устройство представляет собой неплохой тахометр, предел его измерений составляет 100 — 9990 об/мин. Точность измерения — ± 3 об/мин.
Просмотров: 27469
Mega-Генератор (ATmega16, C) 09-08-2008
Попросили меня как-то на работе (автосервис) организовать генератор для проверки различных электроклапанов, инжекторов, катушек.
Просмотров: 9316
Обман одометра (PIC12F629) 08-08-2008
Устройство собрано на МК PIC12F629 и предназначено для управления сигналом идущим от одометра. Сигнал можно отключать, включать тестовый.
Просмотров: 10983
Простейший бортовой компьютер на любой инжекторный двигатель (ATmega8, C) 08-08-2008
Все началось с того, что как мне казалось, у меня большой расход топлива. Машина у меня Audi-80 с 2-х литровым движком (ABT) и моновпрыском (одна.
Просмотров: 13228
Автомобильный тахометр (AT89C2051, asm) 08-08-2008
Автомобильный тахометр представляет собой функционально законченный блок, который устанавливается в салоне автомобиля. .
Просмотров: 10749
Автомобильный охранный сигнализатор на микроконтроллере (PIC16F84A, asm) 08-08-2008
Это устройство отличается от подобных отсутствием времязадающих RC- цепей. Поскольку его основой служит микроконтроллер, оно.
Просмотров: 4003
Автомобильный цифровой спидометр (PIC16F84A, asm) 08-08-2008
Автомобильный цифровой спидометр предназначен для установки в автомобили со штатными аналоговыми спидометрами, управляемые.
Просмотров: 7363
Arduino.ru
Здравствуйте нужна помощь и дельный совет как все это севместить. Хочу собрать Бортовой компьютер/сканер на Atmega32 с цветным дисплеем от Siemens S65 и эту плату привязать к ардуино и с ардуино уже выводить изображения на дисплей от какой нибудь сотки с размером в 5 или 5.5 и хочеться еще добавить пару функций это отображения открытых дверей.
вот ссылка на Бортовой компьютер Atmega32
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
по ссылке же все понятно описано, бери да собирай. Только вот я кода там не увидел, поправьте если не прав.
Схема цифрового БП на Atmega8
Сама схема проста, но, к сожалению, дороговата в сборке.
Нужны будут резисторы с допуском 1%, трансформатор подходящий, корпус, микроконтроллеры, ну и возня с калибровкой всего устройства. Но эффект того стоит.
Правда кнопки вышли слишком низко и пришлось подрезать переднюю часть корпуса – не очень эстетично. Но это прототип. Потом будет лицевая декоративная панель, как найду на это время
Дополнительным преимуществом конструкции является автономно управляемый вентилятор. Измерение температуры радиатора на ОУ с полевым транзистором работает в системе сравнения. Думаете это лишнее? А вот и нет. Вентилятор особенно полезен при зарядке аккумулятора автомобиля, так как идёт долговременный ток более 3-х Ампер.
Тут был использован тороидальный трансформатор с такими параметрами:
- Трансформатор TTS-50,
- первичка: 220 В,
- вторичка: 17 В, 3 А
- Мощность: 50 ВА.
Уровни напряжения на физическом интерфейсе RS232 составляют +/- 10 В. Atmega8 работает с 0-5 В. Можно использовать стабилитрон для ограничения напряжения, но оказывается это на самом деле не нужно.
Atmega8 имеет внутреннюю защиту от перенапряжения и пониженного напряжения. Просто нужно убедиться что ток достаточно мал, чтобы не сжечь эту защиту. Все что нужно для аппаратного обеспечения, это два 4.7 кОм резистора.
Для дистанционного управления источником питания с помощью цифровых команд будем использовать связь по протоколу I2C. Эта I2C немного медленная, но мы все равно не посылаем длинные команды. Команда для установки напряжения может быть очень короткой. И её длина составляет всего несколько байтов.
Дисплейный модуль на ATMega8/168/328
При разработке микроконтроллерных поделок практически всегда возникает потребность реализации пользовательского ввода и вывода. Часто функции ввода информации берёт на себя клавиатура (реже — энкодер), а для отображения состояния устройства используются либо светодиоды, либо светодиодные семисегментные индикаторы, либо ЖК-дисплеи (текстовые вроде 16х2 или графические). Последний вариант часто выигрывает по соотношению цена/возможности если использовать недорогой экран от телефонов Nokia 5110. Разрешающая способность экрана 84х48 позволяет выводить до 5 строк текста длиной до 16 символов. Естественно, помимо текста можно выводить и графику. С таким экраном обычно можно реализовать горазо более удобный пользовательский интерфейс, по сравнению с экранами 16х2, и тем более, по сравнению с семисегментными индикаторами.
Преобразователь предназначен для ретро-компьютера Радио 86РК. “Сердцем” данной ЭВМ является микропроцессор КР580ВМ80А, для питания которого требуются три напряжения питания: +5В, -5В и +12В.
Напряжение +5В можно взять от внешнего блока питания, а -5В и +12 получить из него. Потребляемый микропроцессором ток от источника -5В составляет порядка одного миллиампера. Источник +12В должен обеспечивать ток не менее 75 мА для микропроцессора, плюс еще 12 мА для тактового генератора на микросхеме КР580ГФ24. Итого порядка 90 мА. Ещё для источников питания рекомендован запас по току в 2-3 раза.
Оба преобразователя выполнены на микросхемах MC34063, включённых по типовым схемам.
АЦП микроконтроллера ATmega8, цифровой вольтметр
АЦП – аналогово-цифровой преобразователь (ADC- Analog-to-Digital Converter). Преобразует некий аналоговый сигнал в цифровой. Битность АЦП определяет точность преобразования сигнала. Время преобразования – соответственно скорость работы АЦП. АЦП встроен во многих микроконтроллерах семейства AVR и упрощает использование микроконтроллера во всяких схемах регулирования, где требуется оцифровывать некий аналоговый сигнал.
Рассмотрим принцип работы АЦП. Для преобразования нужен источник опорного напряжения и собственно напряжение, которое мы хотим оцифровать (напряжение, которое преобразуется должно быть меньше опорного). Также нужен регистр, где будет храниться преобразованное значение, назовем его Z. Входное напряжение = Опорное напряжение*Z/2^N, где N – битность АЦП. Условимся, что этот регистр, как у ATmega8, 10-ти битный. Преобразование в нашем случае проходит в 10 стадий. Старший бит Z9 выставляется в единицу. Далее генерируется напряжение (Опорное напряжение*Z/1024), это напряжение, с помощью аналогового компаратора сравнивается с входным, если оно больше входного, бит Z9 становиться равным нулю, а если меньше – остается единицей. Далее переходим к биту Z8 и вышеописанным способом получаем его значения. После того, как вычисление регистра Z окончено, выставляется некий флаг, который сигнализирует, что преобразование закончено и можно считывать полученное значение. На точность преобразования могут очень сильно влиять наводки и помехи, а также скорость преобразования. Чем медленнее происходит преобразования – тем оно точней. С наводками и помехами следует бороться с помощью индуктивности и емкости, как советует производитель в даташите:
В микроконтроллерах 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 мкФ для устранения шумов и наводок на АЦП на схеме не показан. Их наличие подразумевается само собой, если используется АЦП. Теперь дело за программой:
#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 <
asm(«nop»); //Небольшая задержка в 1 такт МК, для стабилизации
PORTD=temp&~(1 <
temp=((lcd*16)&~(1 <
asm(«nop»); //Небольшая задержка в 1 такт МК, для стабилизации
PORTD=temp&~(1 <
pause(10*TIME); //Пауза для выполнения команды
>
void lcd_dat (unsigned char lcd) //Запись данных в ЖКИ
unsigned char temp;
temp=(lcd|(1 <
asm(«nop»); //Небольшая задержка в 1 такт МК, для стабилизации
PORTD=temp&~(1 <
temp=((lcd*16)|(1 <
asm(«nop»); //Небольшая задержка в 1 такт МК, для стабилизации
PORTD=temp&~(1 <
pause(TIME); //Пауза для вывода данных
>
void lcd_init (void) //Иниализация ЖКИ
lcd_com(0x2c); //4-проводный интерфейс, 5×8 размер символа
pause(100*TIME);
lcd_com(0x0c); //Показать изображение, курсор не показывать
pause(100*TIME);
lcd_com(0x01); //Очистить DDRAM и установить курсор на 0x00
pause (100*TIME);
>
unsigned int getADC(void) //Считывание АЦП
< unsigned int 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);
i=voltage/100;
voltage=voltage-i*100;
lcd_dat(0x30+i);
i=voltage/10;
voltage=voltage-i*10;
lcd_dat(0x30+i);
int main(void)
DDRD=0xfc;
pause(3000); //Задержка для включения ЖКИ
lcd_init(); //Инициализация ЖКИ
lcd_dat(‘A’); //Пишем «ADC=» и «U » 1=»» adps0=»» br=»»> //Включаем АЦП, тактовая частота бреобразователя =/8 от тактовой микроконтроллера
ADMUX=(1 <
while(1)
u=getADC(); //Считываем данные
write_data(u); //Выводим их на ЖКИ
pause(30000);
>
Программа проста. В начале мы инициализируем порты ввода/вывода. Для того, чтобы служить входом АЦП, пин 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 Ом).
В свой блок питания я встроил еще защиту от перегрузки, когда ток превышает 2А, то пьезо пищалка начинает усердно пищать, сигнализируя о перегрузке: