Оглавление:

Тональный генератор Arduino без библиотеки или последовательных функций (с прерываниями): 10 шагов
Тональный генератор Arduino без библиотеки или последовательных функций (с прерываниями): 10 шагов

Видео: Тональный генератор Arduino без библиотеки или последовательных функций (с прерываниями): 10 шагов

Видео: Тональный генератор Arduino без библиотеки или последовательных функций (с прерываниями): 10 шагов
Видео: AGalilov: DTMF. Древний, но живой. Ардуино и его АЦП нам в помощь! 2024, Ноябрь
Anonim
Тональный генератор Arduino без библиотеки или последовательных функций (с прерываниями)
Тональный генератор Arduino без библиотеки или последовательных функций (с прерываниями)

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

Этот код разработан для микроконтроллера Atmega 2560, поэтому, если вы хотите реализовать его на другой плате, вам необходимо изменить регистры адреса в коде в соответствии с руководством пользователя вашего контроллера. Основная идея кода заключается в том, что всякий раз, когда вы вводите клавишу на клавиатуре в монитор последовательного порта, Arduino Mega будет выводить определенную частоту в зависимости от того, какую клавишу вы нажимаете, при этом «q» сбрасывает ее. Я сделал так, что «a» будет выводить плоскую частоту A, а «A» - выводить частоту A-Shar, «b» - вывод B-flat, «c» для C-бемоль, «C» для C-диеза и так далее. Полный код загружается в конце, но каждый шаг разбивает код на части, чтобы его было легче объяснить.

Шаг 1: Определение адресов регистров

Определение адресов регистров
Определение адресов регистров

Этот шаг прост, если вы используете atmega 2560, вам просто нужно использовать адреса, которые я использовал, хотя, если вы используете плату с другим чипом, вам нужно будет найти адреса для каждого из этих регистров на вашем компьютере. руководство пользователя чипов. Определения вверху - это просто константы, которые будут использоваться для наших функций позже. Мы указываем адреса как изменчивые без знака, потому что мы не хотим, чтобы компилятор с ними связывал.

Шаг 2: массивы и глобальные переменные

Массивы и глобальные переменные
Массивы и глобальные переменные
Массивы и глобальные переменные
Массивы и глобальные переменные
Массивы и глобальные переменные
Массивы и глобальные переменные

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

Шаг 3. Функция "serial.begin"

В
В

Мы вызовем нашу пользовательскую функцию, которая копирует функцию "serial.begin" U0init (). Он принимает на входе желаемую скорость передачи и запускает последовательный порт с этой скоростью.

Шаг 4. Функция "serial.available"

В
В

Мы вызовем функцию, имитирующую "serial.available" U0kbhit (). Он не принимает ввод, а вместо этого определяет, есть ли на клавиатуре изменение, используя бит состояния RDA, и возвращает истину при обнаружении изменения.

Шаг 5. Функция "serial.read"

В
В

Мы вызовем функцию, имитирующую функцию serial.read U0getchar (), которая не принимает никаких входных данных и выводит любые изменения, сделанные на клавиатуре, которые хранятся в регистре UDR0.

Шаг 6. Функция "serial.write"

В
В

Мы вызовем функцию, имитирующую "serial.write" U0putchar (), которая берет данные из регистра UDR0, пока изменение обнаруживается и сохраняется, и выводит эти изменения обратно в монитор последовательного порта.

Шаг 7: Функция настройки

Функция настройки
Функция настройки

Это основная функция настройки, которая будет использовать нашу имитацию "serial.begin" для инициализации последовательного порта, инициализирует наши битовые настройки для регистров таймера и устанавливает PB6 для вывода наших сигналов.

Шаг 8: Функции цикла и ISR

Функции цикла и ISR
Функции цикла и ISR

Цикл функционирует следующим образом: если изменение обнаруживается с помощью нашей функции "serial.available", наша функция "serial.read" сохраняет это изменение, а наша функция "serial.write" помещает это изменение в монитор последовательного порта. Пока переменная i меньше, чем размер массива частот, она установит на выходе позицию i в этом массиве, выводя частоту в этой позиции. Функция ISR выполняет функцию сброса, где, если позиция массива частот не равна 0 (другими словами, если «q» не нажата), он выводит частоту, но при нажатии «q» выполняется сброс. Обратите внимание: этот код использует прерывания, но это можно сделать и с отключенными прерываниями. Я отправлю код без прерываний, если получу какие-либо запросы, я просто думаю, что версия с прерыванием более интересна.

Шаг 9: Подключение

Проводка
Проводка

Подключить этот код очень просто: просто подключите выходной провод от PB6 к макетной плате, последовательно подключите к нему зуммер или динамик и снова подключите его к земле. Примечание: если вы используете динамик, вставьте небольшой резистор перед динамиком. Если вы просто хотите видеть выходной сигнал, но не слышите его, просто подключите PB6 к красному проводу осциллографа, а черный провод к земле.

Шаг 10: Собираем все вместе

Я добавил полный код к этому шагу, так как я объяснил все его части на предыдущих шагах. Он просто принимает ввод с клавиатуры для разных частот и выводит эту частоту на PB6. Надеюсь, вам понравилось читать о другом способе программирования в среде IDE!

Также проголосуйте за это в конкурсе микроконтроллеров: D

Рекомендуемые: