Эффект эхо (echo) на микроконтроллере atmega32

Содержание

Мир микроконтроллеров

Популярное

  • Устройство и программирование микроконтроллеров AVR для начинающих – 143
  • Трехканальный термостат, терморегулятор, таймер на ATmega8 – 71
  • Двухканальный термостат, терморегулятор на ATmega8 – 67

Измерение расстояний с помощью микроконтроллера AVR и датчика HC-SR04

В этой статье мы рассмотрим схему для измерения расстояний, построенную с использованием ультразвукового датчика HC-SR04 и микроконтроллера ATmega32 (семейство AVR). Датчик HC-SR04 использует технологию под названием “ECHO” (эхо), то есть испускает ультразвуковой сигнал и потом анализирует отраженный от препятствий сигнал.

Принцип работы ультразвукового датчика HC-SR04

Мы знаем, что звуковые волны не могут проникать через твердые тела. Эти волны распространяются по воздуху со скоростью примерно 220 м/с. Когда они достигают нашего уха, мы слышим их как звук. Но когда эти колебания (звуковые волны) встречают на своем пути твердые тела это равносильно тому, что они встречают на своем пути непроходимую стену, поэтому они отражаются от них с такой же самой скоростью, с которой они распространялись до этого. Этот эффект называется эхо.

Ультразвуковой датчик HC-SR04 обеспечивает на своем выходе сигнал, пропорциональный дистанции до препятствия. Датчик генерирует звуковые колебания в ультразвуковом диапазоне (после получения управляющего импульса) и после этого ждет когда они вернутся к нему (эхо), отразившись от какого-нибудь препятствия. Затем, основываясь на скорости звука (220 м/с) и времени, необходимом для того чтобы эхо достигло источника (нашего датчика), датчик обеспечивает на своем выходе сигнал, пропорциональный расстоянию до препятствия.

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

Расстояние при этом рассчитывается по следующей формуле: distance (in cm) = width of pulse output (in uS) / 58. То есть дистанция (в сантиметрах) равна длительности выходного импульса датчика (в микросекундах), деленная на 58.

Необходимые компоненты

Аппаратное обеспечение

Микроконтроллер ATmega32
Источник питания с напряжением 5 Вольт
Программатор AVR-ISP, USBASP или другой подобный
JHD_162ALCD (ЖК дисплей 16×2)
Конденсатор 1000 мкФ
Резистор 10 кОм (2 шт.)
Датчик HC-SR04

Программное обеспечение

Atmel Studio версии 6.1 (или выше)
Progisp или flash magic (необязательно)

Работа схемы

Схема устройства приведена на следующем рисунке.

В представленной схеме PORTB микроконтроллера ATmega32 соединен с портом данным жидкокристаллического (ЖК) дисплея. Если вы не хотите трогать фьюзы (FUSE BITS) микроконтроллера, то не используйте PORTC, поскольку PORTC содержит специальные функции (типы связи), которые можно деактивировать только с помощью изменения фьюзов.

В ЖК дисплее (если мы не хотим использовать черный цвет) можно задействовать только 14 его контактов: 8 контактов для передачи данных (7-14 или D0-D7), 2 контакта для подачи питания (1&2 или VSS&VDD или gnd&+5v), 3-й контакт для управления контрастностью, 3 контакта для управления (RS&RW&E).

В представленной схеме мы использовали только 2 контакта управления ЖК дисплея для лучшего понимания работы схемы. Бит контраста и READ/WRITE используются нечасто, поэтому они могут быть замкнуты на землю. Это обеспечивает ЖК дисплею максимальную контрастность и переводит его в режим чтения. Теперь нам всего лишь нужно контролировать контакты ENABLE и RS чтобы передавать на ЖК дисплей символы и данные. Также на нашем сайте вы можете прочитать более подробную статью о подключении ЖК дисплея к микроконтроллеру AVR ATmega32.

В схеме необходимо сделать следующие соединения с ЖК дисплеем:
PIN1 или VSS — земля
PIN2 или VDD или VCC — +5v питание
PIN3 или VEE — земля (обеспечивает максимальный контраст ЖК дисплею)
PIN4 или RS (Register Selection) – контакт PD6 микроконтроллера
PIN5 или RW (Read/Write) — земля (переводит ЖК дисплей в режим чтения что упрощает взаимодействие с ним для начинающих)
PIN6 или E (Enable) — контакт PD5 микроконтроллера
PIN7 или D0 — контакт PB0 микроконтроллера
PIN8 или D1 — контакт PB1 микроконтроллера
PIN9 или D2 — контакт PB2 микроконтроллера
PIN10 или D3 — контакт PB3 микроконтроллера
PIN11 или D4 — контакт PB4 микроконтроллера
PIN12 или D5 — контакт PB5 микроконтроллера
PIN13 или D6 — контакт PB6 микроконтроллера
PIN14 или D7 — контакт PB7 микроконтроллера

В схеме мы использовали 8-битную связь (D0-D7) ЖК дисплея с микроконтроллером, хотя можно было ограничиться и 4-битной – но в этом случае код программы стал бы немного сложнее. Таким образом, мы использовали 10 контактов ЖК дисплея, 8 из которых будут использоваться для передачи данных и 2 для управления.

Ультразвуковой датчик HC-SR04 имеет 4 контакта:

  • PIN1 — VCC или +5V – контакт для подачи питающего напряжения;
  • PIN2 — TRIGGER – триггерный контакт. На него подается управляющий импульс для запуска работы датчика;
  • PIN3 — ECHO – на его выходе формируется выходной (эхо) сигнал;
  • PIN4 — GROUND – земля.

Контакт 3 (ECHO) датчика подсоединен к микроконтроллеру как источник внешнего прерывания – то есть к контакту INT0 (interrupt 0) или PD2 микроконтроллера.

Теперь, чтобы измерять расстояние с помощью датчика HC-SR04, мы должны выполнить следующую последовательность действий:

  1. Подать на триггерный вход датчика импульс длительностью не менее 12 мкс (с запасом, как говорится).
  2. После того как отраженный сигнал (эхо) вернется к датчику на его выходе ECHO появится сигнал высокого напряжения, которое мы в микроконтроллере должны обработать как внешнее прерывание и запустить счетчик времени.
  3. Как только на выходе ECHO датчика снова появится сигнал низкого напряжения (выходной импульс закончится) мы должны остановить счетчик времени.
  4. Таким образом, во время действия выходного импульса на контакте ECHO датчика счетчик времени микроконтроллера измеряет длительность этого импульса. Потом мы измеренную длительность этого импульса пересчитываем в расстояние.
  5. Измеренное расстояние отображается на ЖК дисплее 16×2.
    Для выполнения этой последовательности действий нам необходимо установить значения в ряде регистров, показанных на рисунке.

BLUE (синий, INT0 – внешнее прерывание 0): этот бит должен быть установлен в 1 для того чтобы разрешить обработку внешнего прерывания 0 (interrupt0). Если мы сделали это, то после этого мы можем отслеживать изменения логических уровней на контакте D2 микроконтроллера.

BROWN (коричневый, ISC00, ISC01): эти два бита настраиваются для контроля логических уровней на контакте D2 микроконтроллера, который в данной случае рассматривается как источник внешнего прерывания.

То есть, как мы уже говорили ранее, нам необходимо прерывание чтобы запустить наш счетчик времени и потом остановить его. Таким образом мы устанавливаем бит ISC00 в единицу и получаем прерывание когда имеем переход с логического LOW на HIGH на входе INT0, другое прерывание мы получаем когда имеем переход с логического HIGH на LOW.

RED (красный, CS10): это бит используется для того, чтобы активировать и деактивировать счетчик времени. И хотя он работает вместе с другими битами (CS11, CS12), нам они не важны поскольку в данном случае нам не нужно устанавливать предварительный делитель частоты.

Перед началом программирования микроконтроллера необходимо уяснить две важные вещи:

  • мы используем внутренний тактовый генератор микроконтроллера ATMEGA32A, который работает на частоте 1 МГц. Мы не используем здесь предварительный делитель частоты и не выполняем какой либо сложной обработки прерываний, поэтому нам не нужно никакой сложной установки регистров;
  • значение счетчика времени после завершения счета сохраняется в 16 битном регистре TCNT1 микроконтроллера.

Исходный код программы на языке С (Си) с пояснениями

Программа для рассматриваемой схемы представлена следующим фрагментом кода на языке С (Си). Комментарии к коду программу поясняют принцип работы отдельных команд.

int main(void)
<
DDRB = 0xFF; // установка portB на вывод данных
DDRD = 00b11111011; // установка 3-го контакта portD (D2) на ввод данных (вход внешнего прерывания 0
_delay_ms(50); //задержка 50ms
DDRA = 00FF; // установка portA на вывод данных.
GICR|=(1 MCUCR|=(1
int16_t COUNTA = 0; //переменная для хранения значения цифрового выхода
char SHOWA [3];//переменная для отображения значения расстояния на ЖК дисплее 16*2
send_a_command(0x01); //очистить экран 0x01 = 00000001
_delay_ms(50);
send_a_command(0x38); // сообщаем ЖК дисплею что мы будем использовать 8 битный режим передачи данных/команд
_delay_ms(50);
send_a_command(0b00001111); //включаем курсор и мигание курсора на ЖК дисплее
sei(); // общее разрешение прерываний

while(1)
<
PORTD|=(1 _delay_us(15);// подаем управляющий импульс длительностью 15 мкс на триггерный вход датчика
PORTD &=

(1 COUNTA = pulse/58; // рассчитываем расстояние по вышеприведенной формуле
send_a_string («CIRCUIT DIGEST «);//отображаем строку «CIRCUIT DIGEST » на ЖК дисплее

send_a_command(0x80 + 0x40 + 0); // переводим курсор на 1-ю позицию 2-й строки
send_a_string («DISTANCE=»); // отображаем строку «DISTANCE=» на ЖК дисплее

itoa(COUNTA,SHOWA,10); //command for putting variable number in LCD(variable number, in which character to replace, which base is variable(ten here as we are counting number in base10))

send_a_string(SHOWA); //telling the display to show character(replaced by variable number) after positioning the courser on LCD

send_a_string («cm «);
send_a_command(0x80 + 0); //возврат курсора на 1-ю позицию первой строки
>
>
ISR(INT0_vect)// вызов обработки внешнего прерывания INT0 когда на входе прерывания произошло изменение логического уровня
<
if (i==1) //когда логический уровень изменяется с HIGH на LOW
<
TCCR1B=0; // деактивация (останов) счетчика времени
pulse=TCNT1; // значение TCNT1 записывается в переменную pulse
TCNT1=0; //сброс памяти счетчика времени
i=0;
>

if (i==0) // когда логический уровень изменяется с LOW на HIGH
<
TCCR1B|=(1
i=1;
>
>

Читайте также:  Как проверить проводку в квартире?

void send_a_command(unsigned char command)
<
PORTA = command;
PORTD &=

(1
PORTD |= 1
_delay_ms(50);
PORTD &=

void send_a_character(unsigned char character)
<
PORTA= character;
PORTD |= 1
PORTD |= 1
_delay_ms(50);
PORTD &=

void send_a_string(char *string_of_characters)
<
while(*string_of_characters > 0)
<
send_a_character(*string_of_characters++);
>
>

Теперь код программы без комментариев.

Видео, демонстрирующее работу схемы

Похожие статьи

Комментарии

Измерение расстояний с помощью микроконтроллера AVR и датчика HC-SR04 — 2 комментария

Здравствуйте! Можно изменить проект и сделать его более практичным? Измерять расстояния нужно ведь для какой-то цели? Требуется запомнить 5-7 значений и , в зависимости от полученного результата измерений, производить останов двигателя с подачей звукового сигнала.
С Уважением Владимир

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

Анализатор спектра на микроконтроллере ATmega32

В статье рассматривается конструкция простого анализатора спектра (0 – 10 кГц) на микроконтроллере Atmel AVR ATmega32. В качестве устройства отображения используется двухстрочный символьный ЖК индикатор. Основным моментом при реализации данного проекта является не аппаратная часть, а программная, точнее реализация дискретного преобразования Фурье (ДПФ) на 8-разрядном микроконтроллере. Сразу следует отметить, что автор не является экспертом в этой области и поэтому начал с основ – с простого дискретного преобразования Фурье. Алгоритм быстрого преобразования Фурье является не только быстрым, но и достаточно сложным.

Дискретное преобразование Фурье (в англоязычной литературе DFT, Discrete Fourier Transform) – это одно из преобразований Фурье, широко применяемых в алгоритмах цифровой обработки сигналов (его модификации применяются в сжатии звука в MP3, сжатии изображений в JPEG и др.), а также в других областях, связанных с анализом частот в дискретном (к примеру, оцифрованном аналоговом) сигнале. Дискретное преобразование Фурье требует в качестве входа дискретную функцию. Такие функции часто создаются путем дискретизации (выборки значений из непрерывных функций).

Принципиальная схема анализатора спектра звукового сигнала очень проста и условно ее можно разделить на цифровую часть и аналоговую.

Цифровая часть образована микроконтроллером и подключенным к нему ЖК индикатором. Микроконтроллер тактируется от кварцевого резонатора 16 МГц, в качестве опорного напряжения для АЦП микроконтроллера используется напряжение питания +5 В.
Шина данных ЖК индикатора подключена к порту C микроконтроллера (линии ввода/вывода PC0-PC3), шина управления подключена к порту D(PD5, PD6) микроконтроллера. Индикатор работает в 4-битном режиме. Переменный резистор номиналом 4.7 кОм используется для регулировки контрастности. Для работы с индикатором были созданы пользовательские символы для отображения 8 горизонтальных столбиков анализатора, эти пользовательские символы занимают все 64 Байта ОЗУ ЖК индикатора.

Микроконтроллер работает от внешнего кварцевого резонатора 16 МГц.

Аналоговая часть устройства – это самая важная часть и представляет собой предварительный усилитель сигнала электретного микрофона, выход которого подключается к каналу ADC0 встроенного в микроконтроллер АЦП. Уровень нуля на входе АЦП нам необходимо установить равным точно половине опорного напряжения, т.е. 2.5 В. В этом случае мы сможем использовать положительную и отрицательную полуволну сигнала, но его амплитуда не должна превышать установленный предел, т.е. коэффициент усиления должен быть точно настроен для предотвращения перегрузки. Всем вышеуказанным условиям отвечает распространенная микросхема низкопотребляющего операционного усилителя LM324.

Алгоритм ДПФ несколько медленнее в сравнении с быстрым преобразованием Фурье. Но наш анализатор спектра не требует высокой скорости, и если он способен обеспечить скорость обновления около 30 кадров в секунду, этого будет более чем достаточно для визуализации спектра звукового сигнала. В любом случае, в нашем варианте возможно достичь скорости 100 кадров в секунду, но это уже слишком высокое значение параметра для двухстрочного символьного ЖК индикатора и оно не рекомендуется. Частота дискретизации равна 20 кГц для 32 точечного дискретного преобразования Фурье и поскольку результат преобразования симметричен, нам нужно использовать только первую половину, т.е. первые 16 результатов. Следовательно, мы можем отображать частотный спектр в диапазоне до 10 кГц и разрешение анализатора составляет 10 кГц/16 = 625 Гц.

Автором конструкции были предприняты попытки увеличения скорости вычисления ДПФ. Если это преобразование имеет N точек, то мы должны найти N2/2 значений синуса и косинуса. Для нашего 32 точечного преобразования необходимо найти 512 значений синуса и косинуса. Но, прежде чем найти их нам необходимо вычислить угол (градусы), что займет некторое процессорное время, поэтому было решено использовать для этих вычислений таблицы значений. При расчетах в программе микроконтроллера не используются вычисления с плавающей точкой и числа двойной точности (double), так как это займет больше времени на обработку на 8-разрядном микроконтроллере. Вместо этого значения в таблицах поиска используются 16-разрядные данные целочисленного типа (integer), умноженные на 10000. Затем после выполнения преобразования результаты делятся на 10000. При таком подходе имеется возможность выполнять 120 32-точечных преобразований в секунду, что более чем достаточно для нашего устройства.

Демонстрация работы анализатора спектра на микроконтроллере ATmega32

Загрузки

Исходный код (программа микроконтроллера, таблицы данных синуса, косинуса и угла) – скачать

Перевод: Vadim по заказу РадиоЛоцман

Электронный ревербератор (эффект “эхо/объемный звук”)

Юрий Садиков
г. Москва

Электронный ревербератор BM2061 (NM2061) – это устройство обработки звука, при помощи которого можно придавать фонограмме эффекты “эха” и “объемного звука”. Предусмотрена возможность регулировки задержки сигнала до 100 мс. В качестве входного источника сигнала можно использовать линейный выход звуковоспроизводящего устройства или микрофон. Ревербератор послужит основой для самодельного усилителя-караоке! Устройство имеет небольшие габариты, малое потребление тока, прост в сборке и настройке.

Общий вид устройства представлен на рис.2, схема электрическая принципиальная – рис.3.

Технические характеристики

Напряжение питания: 9–12 В
Ток потребления: 20 мА
Частотный диапазон: 100–12000 Гц
Выходной сигнал: 250 мВ
Размеры печатной платы: 64х56 мм

Рисунок 2. Общий вид устройства

Рисунок 3. Схема электрическая принципиальная

Ревербератор состоит из двух объединенных блоков: блока предусилителя и блока самого ревербератора.

Блок предусилителя выполнен на ОУ 4558 или 358 (DA1). Коэффициент усиления выбран около 40 дБ (определяется отношением R10/R7) в расчете работы предусилителя напрямую с микрофоном. Если в качестве источника сигнала используется линейный выход звуковоспроизводящего оборудования (250 мВ), рекомендуется снизить коэффициент усиления до 6 дБ (резистор R7 = 22 кОм). Потенциометр R11 предназначен для регулировки уровня сигнала, снимаемого с предусилителя. При использовании электретного микрофона переключатель SW1 необходимо замкнуть, а при использовании динамического микрофона – разомкнуть.

Блок ревербератора выполнен на базе специализированной ИМС HT8970, состоящей из дельта-модулятора/демодулятора, необходимых фильтров, генератора и участка памяти емкостью 20 Kb. ИМС может работать в одном из двух режимов – “эхо”(echo) или “объемный звук”(surround).

При использовании эффекта “эхо”(echo) необходимо установить все электронные компоненты согласно перечню и принципиальной схеме. Потенциометром R13 устанавливается время задержки эффекта “эхо”, а R23 определяет глубину эффекта (глубина обратной связи). Переключатель SW2 необходимо замкнуть, а SW3 необходимо перемкнуть джампером в положении 1-2.

При использовании эффекта “объемный звук”(surround), переключатель SW2 необходимо разомкнуть, а SW3 необходимо перемкнуть джампером в положении 2-3. Или просто не устанавливать элементы С22, С23, С24, R23 и R18. Потенциометром R13 устанавливается время задержки эффекта “объемный звук”.

Напряжение питания подается на контакты Х3(+), Х4(-). Микрофон (лин. выход) подключается к контактам Х1(+), Х2(-).

Устройство имеет стандартный линейный выход (разъем XP1 – тип “тюльпан”). К нему можно подключить, например, усилитель мощности или последующий каскад обработки сигнала.

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

Для удобства подключения питающего напряжения и источника сигнала на плате предусмотрены посадочные места под штыревые контакты или клеммные винтовые зажимы.

Чертеж печатной платы приведен на рис.4 и рис.5. Перечень элементов – в таблице.

Рисунок 4. Чертеж печатной платы (вид сверху)

Рисунок 5. Чертеж печатной платы (вид снизу)

Таблица. Перечень компонентов

ПозицияНоминалКоличество
C10,47 мкФ1
C20,68 мкФ2
C3, С8, С12220 мкФ/16. 25 В3
C41 мкФ/16. 25 В1
C522 мкФ/16. 25 В1
C639 пФ1
C7, C11, C15, C160,1 мкФ4
C9, C11, C15, C164,7 мкФ/16. 25 В4
C135600 пФ1
C17, С18, С21560 пФ3
C19, С200,0471
С220,0331
C24, С2510 мкФ/16. 25 B2
DA14558/3581
DA278L051
DA3HT89701
R1, R15, R16, R2010 кОм5
R2, R4, R5, R8, R244,7 кОм5
R3, R91 кОм2
R6, R1047 кОм2
R7560 кОм1
R11, R2322 кОм2
R12100 кОм1
R1347 кОм1
R14, R19, R21, R2215 кОм4
R1712 кОм1
R1813 кОм1
Микрофонэлектретный1
ВидеоразъемK366G(RP4)1
Штыревой 2-контактный разъемPLS-401
Штыревой 3-контактный разъемPLS-40(RP4)1
Съемная перемычка(джампер)1
Клеммный 2-контактный разъемED500V-2*52

Материал опубликован в журнале Левша 2004`11.

Примеры на Си для микроконтроллеров Atmel AVR

Здесь представлены примеры различных программ на языке Си для микроконтроллеров Atmel AVR. Все примеры написаны под микроконтроллер ATmega16, поэтому при переносе на другие МК семейства AVR это нужно учитывать. Тактовая частота микроконтроллера во всех примерах 8 МГц (используется тактирование от внутреннего генератора). Код примеров разбит на блоки и снабжен комментариями. Проекты написаны в среде Eclipse (инструкция по установке и настройке Eclipse для AVR) и легко могут быть импортированы в Eclipse. Также можно использовать данные проекты и в среде AVR studio (изменится только структура файлов проекта). При обнаружении ошибок просьба сообщить на почту.

Blink – Самый простой пример. К порту C подключены 8 светодиодов. Светодиоды зажигаются логической единицей на линии порта. В цикле светодиоды порта включаются и выключаются. Свеобразный аналог Hello World в мире встраиваемых систем.

IO Ports – В данном примере рассматривается работа с портами ввода-вывода. К порту C подключены 8 светодиодов (линии 0-7). К линии 2 порта D подключена кнопка, с подтяжкой на землю. При нажатии кнопка выдает на линию 0 порта С уровень логической единицы. Цикл программы организован следующим образом: при запуске включается бегущий огонь, сначала загорается светодиод на линии 0 порта C, затем на линии 1 и т.д. По достижении линии 7 направление бегущего огня меняется (от 7 к 0). При нажатии на кнопку бегущий огонь останавливается и загораются одновременно все светодиоды. После повторного нажатия на кнопку бегущий огонь продолжает перемещаться с места остановки.

Dynamic Indication – В данном примере рассматривается работа с 7-сегментным индикатором. В моём случае он имеет 4 разряда (цифры). Поскольку у меня на плате установлены транзисторы для управления разрядами, то управление осуществляется выводом логической единицы и на разряды и на сегменты. Схема подключения следующая: к линиям 0-7 порта C подключены сегменты индикатора, а к линиям 0-3 порта В разряды индикатора. При запуске на индикатор выводятся цифры 1 2 3 4.

Читайте также:  Телефония и фрикинг

UART – В данном примере рассматривается периферийного модуля UART (универсальный асинхронный приёмопередатчик). Модуль UART можно настроить как на работу с прерываниями, так и без них (вручную, путём работы с флагами). Пример работает следующим образом: при получении байта, МК переходит в обработчик прерывания (используется только прерывание по приёму данных) и разбирает численное значение байта (0-255) на цифры, которые и выводятся на 7-сегментный индикатор. Схема подключения аналогична предыдущему примеру. Передача осуществляется по двум линиям UART (порт D линии 0-1), к которым необходимо подключить линии RX и TX преобразователя USB-UART. Для настройкки без прерываний необходимо обнулить бит RXCIE в регистре UCSRB и вручную опрашивать интерфейс в основном цикле программы.

Clock – В данном примере рассматривается реализация простых часов с 7-сегментным индикатором и парой кнопок. Только здесь уже требуется 6 разрядов, хотя секунды можно опустить. Кнопки с подтяжкой на землю. При нажатии кнопка выдает на линию высокий логический уровень. Индикатор подключается как и в предыдущих примерах (сегменты к порту C, разряды к порту B), а кнопки к линиям 2-3 порта D. Кнопка используется PD2 для установки минут, а PD3 для установки часов. По нажатию каждой из кнопок увеличивается значение соответствующего разряда (минуты или часы).

DS18B20 – В данном примере рассматривается работа с цифровым датчиком температуры DS18B20. Показания температуры выводятся на 7-сегментный индикатор. Вывод DQ датчика поключен к ноге (пину) PD5. Линия должна быть подтянута к плюсу питания резистором на 4.7-10 кОм (согласно документации). Датчик опрашивается каждые 5 секунд. Температура выводится на 4-разрядный индикатор: знак, два разряда на целуюю часть и один на вещественную. Документация к датчику здесь.

DHT11 – В данном примере рассматривается работа с датчиком температуры и влажности DHT11. Показания температуры выводятся на 7-сегментный индикатор. Вывод DATA (также SDA) датчика поключен к ноге (пину) PD5. Линия должна быть подтянута к плюсу питания резистором на 4.7-10 кОм (согласно документации). Датчик опрашивается каждые 5 секунд. Измеряются температура и влажность, но на дисплей выводится только влажность (целое двухзначное число). Документация к датчику здесь.

DHT22 – В данном примере рассматривается работа с датчиком температуры и влажности DHT22. По сравнению с DHT11 данный датчик обладает большей точностью и более широким диапазоном измерений. Показания температуры выводятся на 7-сегментный индикатор. Вывод DATA (также SDA) датчика поключен к ноге (пину) PD5. Линия должна быть подтянута к плюсу питания резистором на 4.7-10 кОм (хотя согласно документации это и необязательно). Датчик опрашивается каждые 5 секунд. Измеряются температура и влажность, но на дисплей выводится только влажность (вещественное двухзначное число с одним знаком после запятой). Документация к датчику здесь.

BMP180 – В данном примере рассматривается работа с цифровым датчиком температуры и атмосферного давления BMP180. Показания атмосферного давления выводятся на 7-сегментный индикатор. Датчик подключаетсяпо интерфейсу I2C. Линии SDA и SCL должны быть подтянуты к плюсу питания резисторами на 4.7-10 кОм. Датчик опрашивается каждые 10 секунд. Измеряются температура и давление, но на дисплей выводится только атмосферное давление в мм. ртутного столба (целое число). Документация к датчику здесь.

BH1750 – В данном примере рассматривается работа с цифровым датчиком освещенности BH1750. Показания освещенности выводятся на 7-сегментный индикатор. Датчик подключается по интерфейсу I2C. Линии SDA и SCL должны быть подтянуты к плюсу питания резисторами на 4.7-10 кОм. Датчик опрашивается каждые 5 секунд. Документация к датчику здесь.

ADC Indication – Данный пример аналогичен примеру с UART. Отличие в том, что байт берется с линии 0 порта А (линия 0 АЦП, ADC0). Микроконтроллер по таймеру производит аналого-цифровое преобразование напряжения на линии 0 порта А, (младшие 2 бита отбрасываются как шум). При измерении используется внутренняя опора 5 В. К линии PD2 порта D подключена кнопка, которая определяет режим вывода показаний. При нажатии на кнопку выводится результат измерений в виде числа от 0 до 255. Если кнопка не нажата, то результат измерений переводится в вольты и выводится на индикатор (с точностью до десятых).

Fast PWM – В данном примере показана настройка аппаратного ШИМ (широтно-импульсная модуляция, англ. PWM). К линиям 4 и 5 порта D подключены светодиоды, а к линиям 2-3 и 6-7 порта D – кнопки каналов A и B соответственно. Кнопки с подтяжкой на землю (при нажатии кнопка выдает на линию порта уровень логической единицы) Кнопки на линях 2 и 3 соответственно увеличивают и уменьшают коэффициент заполнения ШИМ (меняется яркость светодиода) канала А. Кнопки на линях 6 и 7 соответственно увеличивают и уменьшают коэффициент заполнения ШИМ канала B. Число сравнения для каждого из каналов меняется в диапазоне от 0 до 255. Для канала А шаг изменения равен 10, для канала В шаг равен 5.

HCSR04 – В данном примере рассматривается работа с ультразвуковым датчиком расстояния HCSR04. К линии PD3 подключен вывод Trigger датчика, а к линии PD2 вывод Echo. Поключение 7-сегментного индикатора аналогично предыдущим примерам. МК периодически опрашивает датчик и определяет расстояние до препятсвия в сантиметрах. После этого число разбивается на цифры и выводится на дисплей. Документация к датчику здесь.

Matrix Keyboard – В данном примере показана работа с матричной клавиатурой. Микроконтроллер динамически опрашивает клавиатуру, а затем определяет номер нажатой клавиатуры. Размер поля 3 на 3 – получаем 9 кнопок. Нажатие первых 8-ми приводит к зажиганию светодиода на соответствующей линии порта А, нажатие 9-ой кнопки зажигает все светодиоды порта А. Матричная клавиатура подключается к линиям 0-5 порта С (три столбца и три строки). В архиве схема и печатная плата матричной клавиатуры (Diptrace).

Shift Register – В данном примере рассматривается работа с модулем SPI на примере сдвигового регистра 74HC595. К регистру подключены светодиоды, в качестве линии CS используется линия 4 порта B (вывод not SS). Линия DS (14 нога) регистра идет к MOSI (PB5), линия SHCP (11 нога) к линии SCK (PB7), линия STCP (12 нога) к линии SS (PB4). Линии MR (10 нога) и OE (13 нога) должны быть подтянуты к высокому и низкому логическим уровням соответственно. По таймеру микроконтроллер меняет состояние светодиодов: поочерёдно горят то чётные светодиоды, то нечётные. Если при этом передать байт по UART’у, то он будет выведен в порт на светодиоды. Чтобы обратно переключиться в режим мигания необходимо послать по UART’у 0x00 (ноль). Документация к микросхеме 74HC595 здесь.

SG-90 Servo – В данном примере рассматривается работа с сервоприводом SG-90. Используется аппаратный ШИМ. Линия ШИМ сервпопривода подключена к каналу А аппаратного ШИМ. Кнопки поворота подключены к линиям PD2 и PD3. Кнопка на линии PD2 увеличивает длительность импульса, кнопка на линии PD3 уменьшает длительность импульса. Длительность импульса меняется от 1 до 2 мс. Описание сервомотора здесь.

RGB Lamp – В данном примере рассматривается работа с трехцветным RGB-светодиодом. Реализовано плавное переливание цветов с использованием программного ШИМ. Линии красного, зеленого и синего цветов подключаются соответственно к линиям 2, 3 и 4 порта D.

TSOP4836 NEC – В данном примере рассматривается работа с фотоприемником TSOP4836 и протоколом передачи NEC, который широко используется в инфракрасных пультах дистанционного управления. При получении команды на дисплей выводится ее код. Поключение 7-сегментного индикатора аналогично предыдущим примерам. Описание фотоприемника здесь.

WS2812 Ring – В данном примере рассматривается работа со светодиодами WS2812 с встроенным ШИМ-контроллером. К контроллеру подключено такое кольцо из 16 светодиодов (количество светодиодов в кольце можно указать в коде). Библиотека для работы с WS2812 не моя (взята на гитхабе и немного допилена, копирайт сохранён). В программе сначала задается массив цветов (красный, зеленый, синий), а затем в цикле реализуется их сдвиг и плавным изменением интенсивности. Линия IN первого светодиода подключается к линии PD2 порта D. Описание светодиодов здесь.

MFRC522 RFID – В данном примере рассматривается работа со считывателем RFID карточек MFRC522. Cчитыватель подключён к контроллеру по стандартной схеме. Библиотека для работы с MFRC522 не моя (взята на гитхабе и немного допилена, копирайт сохранён). При запуске контроллер определяет тип ридера и отправляет данные в UART. Затем идет непрерывная проверка обнаружения RFID устройств. При поднесении карточки или брелка считывается его адрес и отправляется в UART (адрес 32 бита, 4 байта). Описание считывателя здесь.

Музыкальный Звонок на ATmega32 и MMC/SD карте

Дата публикации: 08 июня 2020 .

Простые однотональные мелодии на сегодняшний день уже не могут вызвать восторга у благодарных слушателей. За примерами далеко ходить не надо – вспомним звонки для сотовых телефонов. Еще совсем недавно они были простые, а сегодня все MP3, MIDI да WAV. Иными словами – наступила эра полифонии.

Как оказалось – AVR довольно слабенький контроллер и программно воспроизводить MIDI или MP3 ему не по зубам. А вот WAV, точнее разновидность его PCM, да с небольшой частотой дискретизации он довольно неплохо воспроизводит. Вот только размер этих WAV файлов не внушает оптимизма. Памяти никакого AVR не хватит, чтобы хранить в ней аудиоданные. Хорошо, что умные дяденьки придумали флэш-карты, которые позволяют записать на них целую кучу полезной информации. Итак начнем:

Цифровой измеритель мощности и КСВ

Дата публикации: 03 мая 2020 .

По просьбе одного товарища-радиолюбителя сделать для него цифровой измеритель мощности и КСВ было принято решение сделать следующий приборчик.

Измеритель выполнен на базе микроконтроллера фирмы ATMEL ATmega8. Для вычисления КСВ и мощности используется 10-ти разрядный АЦП МК(микроконтроллера) по значениям прямой(FWD) и обратной(REV) волны. Для работы прибора необходимо постоянное напряжение от ответвителя около 3В при максимальных показаниях прибора 999Вт. Программа считает мощность под волновое сопротивление 50 Ом, но нужно понимать что “правдивость” показаний актуальна именно при Rн=50 Ом. Поэтому если КСВ отличается от 1 тогда измеритель мощности будет “врать”.

Электронная игровая кость на ATtiny10

Дата публикации: 13 января 2020 .

Что, еще один электронный кубик? Скучно! Но подождите – это попытка абсолютно минимизированной реализации с использованием ATtiny10. Проект использует очень эффективную схему мультиплексирования(Charlieplexing) для управления семью светодиодами электронной матрицы только при помощи двух выводов.

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

Читайте также:  Клавиатурный датчик кода морзе (ps/2 и pic16f628a)

Тетрис на ATtiny45

Дата публикации: 07 января 2020 .

В статье представлена игра “Тетрис” на микроконтроллере ATtiny45 с использованием OLED-экрана 128×32 пикселей на основе SSD1306.

В качестве источника тактового сигнала используется внутренний PLL генератор на 16MHz. Матрица 2*3 из кнопок используется для ввода данных пользователем. Портретная ориентация экрана используется для эффективного использования области экрана.

Двухканальный циклический таймер на Atmega328

Дата публикации: 07 декабря 2019 .

Представляю вторую версию двухканального циклического таймера. Были добавлены новые функции и изменилась принципиальная схема. Циклический таймер позволяет включать и выключать нагрузку, а также выдерживать паузу на заданные интервалы времени в циклическом режиме. Каждый из выходов таймера имеет 2 режима работы – “Логический” и “ШИМ”. Если выбран логический режим устройство позволяет управлять с помощью контактов реле освещением, отоплением, вентиляцией и другими электроприборами. Нагрузкой могут выступать любые электрические приборы мощность нагрузки которых не превышает максимального тока реле. Тип выхода “ШИМ” позволяет например подключить через силовой транзистор двигатель постоянного тока, при этом есть возможность установить скважность ШИМ, чтобы двигатель вращался с определенной скоростью.

Часы на ATtiny2313 и светодиодной матрице 8*8

Дата публикации: 08 июля 2019 .

Часы собранные на микроконтроллере ATtiny2313 и светодиодной матрице показывают время в 6-ти различных режимах.

Светодиодная матрица 8*8 управляется методом мультиплексирования. Токоограничивающие резисторы исключены из схемы, чтобы не испортить дизайн, и, поскольку отдельные светодиоды управляются не постоянно, они не будут повреждены.

Для управления используется только одна кнопка, длительное нажатие кнопки(нажатие и удержание) для поворота меню и обычное нажатие кнопки для выбора меню.

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

Частотомер до 500МГц на Attiny48 и MB501

Дата публикации: 21 апреля 2019 .

На этот раз я представлю простой малогабаритный частотомер с диапазоном измерения от 1 до 500 МГц и разрешением 100 Гц.

В настоящее время, независимо от производителя, почти все микроконтроллеры имеют так называемые счетные входы, которые специально предназначены для подсчета внешних импульсов. Используя этот вход, относительно легко спроектировать частотомер.

Однако этот счетчый вход также имеет два свойства, которые не позволяют напрямую использовать частотомер для удовлетворения более серьезных потребностей. Одна из них заключается в том, что на практике в большинстве случаев мы измеряем сигнал с амплитудой в несколько сотен мВ, который не может перемещать счетчик микроконтроллера. В зависимости от типа, для правильной работы входа требуется сигнал не менее 1-2 В. Другое заключается в том, что максимальная измеримая частота на входе микроконтроллера составляет всего несколько МГц, это зависит от архитектуры счетчика, а также от тактовой частоты процессора.

Термостат для электрического чайника на ATmega8(Термопот)

Дата публикации: 12 апреля 2019 .

Это устройство позволяет контролировать температуру воды в чайнике, имеет функцию поддержания температуры воды на определенном уровне , а также включение принудительного кипячения воды.

В основе прибора микроконтроллер ATmega8, который тактируется от кварцевого резонатора частотой 8МГц. Датчик температуры – аналоговый LM35. Семисегментный индикатор с общим анодом.

Новогодняя звезда на Attiny44 и WS2812

Дата публикации: 19 декабря 2018 .

Эта декоративная звезда состоит из 50 специальных светодиодов RGB, которые контролируются ATtiny44A. Все светодиоды непрерывно изменяют цвет и яркость в случайном порядке. Также есть несколько разновидностей эффектов, которые также активируются случайно. Три потенциометра могут изменять интенсивность основных цветов. Положение потенциометра индицируется светодиодами при нажатии кнопки, а изменение цвета и скорость эффекта можно переключать в три этапа. Этот проект был полностью построен на компонентах SMD из-за специальной формы печатной платы. Несмотря на простую схему, структура платы довольно сложная и вряд ли подойдет для новичков.

Частотный преобразователь для асинхронного двигателя на AVR

Дата публикации: 15 декабря 2018 .

В этой статье описывается универсальный трехфазный преобразователь частоты на микроконтроллере(МК) ATmega 88/168/328P. ATmega берет на себя полный контроль над элементами управления, ЖК-дисплеем и генерацией трех фаз. Предполагалось, что проект будет работать на готовых платах, таких как Arduino 2009 или Uno, но это не было реализовано. В отличие от других решений, синусоида не вычисляется здесь, а выводится из таблицы. Это экономит ресурсы, объем памяти и позволяет МК обрабатывать и отслеживать все элементы управления. Расчеты с плавающей точкой в программе не производятся.

Частота и амплитуда выходных сигналов настраиваются с помощью 3 кнопок и могут быть сохранены в EEPROM памяти МК. Аналогичным образом обеспечивается внешнее управление через 2 аналоговых входа. Направление вращения двигателя определяется перемычкой или переключателем.

Регулируемая характеристика V/f позволяет адаптироваться ко многим моторам и другим потребителям. Также был задействован интегрированный ПИД-регулятор для аналоговых входов, параметры ПИД-регулятора могут быть сохранены в EEPROM. Время паузы между переключениями ключей (Dead-Time) можно изменить и сохранить.

Мигающий светодиод | Программирование микроконтроллеров AVR

При написании программы часто возникает необходимость в формировании определенного интервала времени между отдельными командами. Наглядным примером тому может послужить гирлянда, в которой лампочки загораются в определенной последовательности через промежутки времени. В нашем случае для индикации задержки времени будем использовать мигающий светодиод, а лучше два и разного цвета. Мы будем управлять длительностью их включения и выключения, т. е. изменять частоту мигания.

Частота работы микроконтроллера

Большинство команд микроконтроллеров AVR выполняются в один такт генератора задающей частоты. В качестве которого широко используют встроенную в МК RC-цепочку или подключают к выводам XTAL1 и XTAL2 кварцевый резонатор.

Например, если МК работает с частотой 1 Гц, то одна команда будет выполняться за одну секунду

По умолчанию у МК ATmega8 задействован собственный внутренний генератор частоты, а точнее RC-цепочка, которая работает на частоте 1000 000 Гц = 1 МГц. Поэтому время выполнения одной команды равно:

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

PORTD = 0b000000001; // Подаем питание на 1-й светодиод

PORTD = 0b000000010; // Подаем питание на 2-й светодиод

Но на самом деле второй LED загорится с разницей во времени 0,000001 секунды от первого. Наши глаза не могут заметить такой малой разницы во времени. Уже при частоте изображений более 24 Гц (t = 1/24 ≈ 0,042 с) наше зрение формирует из отдельных картинок непрерывный фильм. Поэтому в большинстве случаев мы не различаем 25-й кадр.

Для того, чтобы оба светодиода засветились с разницей во времени 0,5 секунды необходимо между соответствующими двумя командами ( PORTD = 0b000000001; и PORTD = 0b000000010; ) поместит еще 500 000 однотактных пустых команд, т. е. заставить МК полсекунды не выполнять никаких полезных действий. Или, как говорят, нужно “убить” 500 000 тактов. Если код пишется на Ассемблере, то программисты применяют различных циклы, которые “съедают” определенное число тактов и тем самым получают различные интервалы времени.

PORTD = 0b000000001; // Подаем питание на 1-й светодиод

Для получения задержки 0,5 секунды сюда нужно вставить

500 000 однотактных команд

PORTD = 0b000000010; // Подаем питание на 2-й

Функция _delay_ms() и мигающий светодиод

При написании кода на Си в Atmel Studio имеется очень удобная функция _delay_ms() . Для работы данной функции ее необходимо предварительно подключить директивой препроцессора #include .

В круглых скобках данной функции можно задавать время в миллисекундах, тогда перед скобками нужно записать ms, или в микросекундах – us:

При использовании данной функции для того, чтобы при компиляции Atmel Studio не выдавала никаких предупреждений, следует объявить частоту с помощью оператора #define . Так как по умолчанию для ATmega8 она равна 1 000 000 Гц, то это значение мы и объявим. Это делается следующей строкой:

#define F_CPU 1000000UL

В дальнейшем, когда мы будем подключать к МК кварцевый резонатор, без данной строки уже не обойтись. Структура ее останется прежней, только вместо 1 000 000 нужно будет записать частоту кварцевого резонатора.

Давайте улучшим нашу программу, так, чтобы сначала загорался один светодиод, затем через полсекунды он гаснул и еще через полсекунды загорался второй и снова через 0,5 с гаснул.

#define

Давайте посмотрим на код, приведенной выше, еще раз. Если нам необходимо изменить значение задержки времени в функции _delay из 500, например на 300, то мы должны отыскать все строки с ее именем и выполнить соответствующую замену. Теперь представим, что таких строк сотня, а то и тысяча. Изменять значение каждого числа по отдельности крайне неудобно и долго. К тому же можно случайно пропустить строку. Поэтому необходимо применять другой, более удобный и практичный подход.

Таких подходов существует несколько. Самый простой – это объявить переменную и присвоить ей нужное значение. Далее эта переменная подставляется в соответствующие функции. Это хороший способ. В дальнейшем мы его рассмотрим детальнее. Сейчас же мы рассмотрим еще более лучший!

С помощью оператора #define мы присвоим числовому значению какое-либо имя. Это имя называется константа. В отличие от переменной, константа не может изменяться в программе. Выглядит это так:

Имя константы можно задавать практически любым, используя латинские символы и цифры. В данном случае имя MIG говорит о том, что мы применяем задержку для мигания светодиодами.

После строки с директивой препроцессора #define точка с запятой не ставится. Между именем константы и числовым значением ставится пробел.

Данная строка работает следующим образом. Перед началом компиляции выполняется замена числом 300 всех констант с именем MIG.

#define и регистры

Также оператор #define хорош тем, что с помощью него можно задавать имена регистрам. Например, если мы подключаем к порту D светодиоды, то вместо PORTD мы можем записать, например VD:

#define VD PORTD

Давайте перепишем программу, применяю директиву #define :

#define F_CPU 1000000UL

#define VD PORTD

VD = 0b000000001; // Включаем 1-й светодиод

_delay_ms ( MIG ); // Ждем 0,5 секунды

VD = 0b000000000; // Выключаем 1-й

_delay_ms ( MIG ); // Ждем 0,5 секунды

VD = 0b000000010; // Включаем 2-й

_delay_ms ( MIG ); // Ждем 0,5 секунды

VD = 0b000000000; // Выключаем 2-й

_delay_ms ( MIG ); // Ждем 0,5 секунды

Таким способом можно сделать простейшую гирлянду. Однако применение функции _delay не всегда будет оправдано, поскольку во время задержки MK не выполняет никаких полезных действий. Более эффективный способ формирования временных интервалов является применение встроенных таймеров-счетчиков. О них будет подробно рассказано в последующих статьях.

Рейтинг
( Пока оценок нет )
Загрузка ...
Adblock
detector