dig: lab_3_ardu [Tobi Delbruck wiki]

  1. Лаборатория 3 В этом упражнении давайте построим микрофонный предусилитель на плате, получим аудиосигналы...
  2. Стартовый проект Arduino
  3. ШИМ - широтно-импульсная модуляция
  4. Выборка аудио и обработка сигналов
  5. Отладка переключением GPIO
  6. Преобразование входа микрофона
  7. Обработка сигнала
  8. Желаемое поведение

Лаборатория 3

В этом упражнении давайте построим микрофонный предусилитель на плате, получим аудиосигналы на ATmega328P с помощью АЦП, обработаем слуховой сигнал для измерения среднеквадратичной мощности (громкости звука), а затем используем среднюю громкость звука за последние несколько сотен мс времени, чтобы установить положение серводвигателя. В lab_4 Вы превратите свой прототип в схему печатной платы.

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

Шаги для этого упражнения

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

  1. Нарисуйте схему (блок-схему) вашего приложения, включая преобразование AD, сервоуправление, обработку сигналов. Какая периферия от ATmega328P вам понадобится?

  2. Начать новый проект Arduino.

  3. использование analogRead () функция, которая использует АЦП для чтения выходного сигнала предусилителя микрофона.
  4. Напишите код DSP (цифровая обработка сигналов) для обработки выборок АЦП для контроля положения сервопривода.

  5. Документируйте свой код с комментариями.

  6. Продемонстрируйте свою рабочую систему Tobi и отправьте ваш проект по электронной почте в виде zip (или .7z) архива Тоби Дельбрюк ,
  • UC - Arduino для программных инструментов микроконтроллера и пример установки прошивки
  • сервоприводы - информация о хобби серводвигателях RC

Стартовый проект Arduino

Самый простой способ начать - открыть базовый пример из меню «Файл» и использовать его в качестве шаблона, например, 01-Basic⇒Blink.

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

Контакты заголовка, которые мы вставляем в макетную плату без припоя, находятся здесь:

ШИМ - широтно-импульсная модуляция

  1. Выберите новый выходной контакт ШИМ для ваших серво выходных импульсов. Глядя на Arduino Nano электрическая схема а также таблица данных ATmega328P Мы видим, что плата nano-платы жестко соединяет PB5 (D13) с желтым светодиодным анодом, сигнал PD0 (D0) с UART RX и сигнал PD1 (D1) с UART TX. Это контакты 17, 30 и 31 на ATmega328P. Если вы внимательно посмотрите в таблице данных, вы обнаружите, что не все цифровые контакты заголовков Arduino Nano могут быть использованы. Выясните, какой таймер / счетчик используется библиотекой сервоприводов, а затем выберите правильный вывод.

Выясните, какой таймер / счетчик используется библиотекой сервоприводов, а затем выберите правильный вывод

Вот краткий пример использования библиотеки сервоприводов:

#include <Servo.h> int led = 13; char i = 0; // Вы можете создать новую переменную типа Servo, которая соответствует объекту несколькими полезными методами. Сервомеханизм; // процедура установки запускается один раз, когда вы нажимаете reset: void setup () {// инициализируете цифровой вывод как выход. pinMode (led, INPUT); // инициализировать сервопривод на выводе D9, минимальное максимальное время 1 мс и максимальное 2 мс. myservo. приложить (9, 1000, 2000); // начать с ШИМ-сигнала периода 20 мс (значение по умолчанию) и 1 мс высокого времени (0 градусов). написать (0); } // процедура цикла выполняется снова и снова навсегда: void loop () {delay (10); // ждать 10 миллисекунд myservo. написать (я% 180); // обновить ШИМ для сервоконтроллера новым рабочим циклом (высокое время)}

Чтобы увидеть, что все это значит, посмотрите на следующую блок-схему из таблицы. Существует три таймера, которые можно использовать для генерации до 6 сигналов ШИМ, но для сервоуправления можно использовать только Таймер 1 из-за требований к сигналу периода ШИМ сервопривода. Каждый таймер имеет два генератора сигналов (A и B). В зависимости от значения таймера и значений регистров OCR1A или OCR1B генерируется сигнал ШИМ. Timer1 переполняет выходной сигнал сброса генератора сигналов, и когда Timer1 достигает значения, сохраненного в регистре OCR1x, генератор сигналов инвертирует состояние выходного сигнала.

Источник часов Timer1 может поступать извне (внешний вывод T1) или это могут быть предварительно масштабированные часы из схемы системных часов микроконтроллера. Таймер1 имеет несколько режимов работы, которые допускают разные разрешения по частоте для сигналов ШИМ. Счетчик может быть использован в одном направлении (после того, как счетчик TOP достигнут, он изменяется на BOTTOM и запускается снова), или в двух направлениях (от подсчета BOTTOM до TOP, а затем от обратного отсчета TOP до BOTTOM, получая двойное разрешение).

Вы можете попробовать его с серводвигателем, используя USB VBUS + 5V для питания сервопривода и длинный контактный разъем для подключения к плате и сервоприводу, следуя приведенным выше инструкциям в соответствии с вашим типом сервопривода. Используйте электролитический конденсатор емкостью 10000 мкФ и блокирующий диод 1N4007, чтобы обойти VBUS на землю на плате, иначе вы получите огромное количество шумов двигателя, появляющихся в VBUS! Вы получите около 4 В для питания сервопривода, который находится на нижней стороне, но он все еще должен работать.

Выборка аудио и обработка сигналов

Мы уже построили схему предусилителя микрофона на плате, используя микрофон JEFT ( техническая спецификация ), резисторы, конденсаторы и LM324N Quad Opamp ,

Теперь давайте напишем основной цикл, который дискретизирует вход микрофона, вычисляет среднеквадратичный уровень звука, фильтрует его нижние частоты и устанавливает сервопривод в соответствии с этой громкостью звука. В идеале вы должны производить выборку с обычной скоростью, установленной прерыванием по таймеру. Помните, что Timer1 уже используется генератором ШИМ и что Timer0 используется некоторыми внутренними функциями Arduino (например, с задержкой 1), поэтому давайте использовать оставшийся таймер для управления правильной частотой дискретизации для АЦП Timer2. Для того, чтобы легко управлять Timer2, вы можете скачать Библиотека MsTimer2 и установите его в папку Arduino / библиотеки, разархивировав там этот zip-файл. Каждый раз, когда вы устанавливаете новую библиотеку в папку с библиотеками, вы должны перезапускать программное обеспечение Arduino. Затем вы можете использовать его в своем коде, как в этом примере:

#include <MsTimer2.h> // процедура установки запускается один раз, когда вы нажимаете reset: void setup () {// инициализируйте переполнение timer2 и функцию, которая будет вызываться во время ISR. MsTimer2 :: set (1000, t2_ovf); MsTimer2 :: start (); } // подпрограмма цикла выполняется снова и снова навсегда: void loop () {// ждем значения АЦП и обрабатываем его, используя цепочку DSP. } void t2_ovf () {// сделать что-то вроде установки ФЛАГА для цикла чтения АЦП}

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

  1. Получить образец АЦП

  2. Обновите среднее значение выборки. Нам нужно вычесть это из выборки, чтобы получить отклонение от среднего.

  3. Вычислите квадрат разности выборки от среднего замирания.

  4. Обновите среднеквадратичное значение затухания.

  5. Используйте это значение для установки положения сервопривода.

Помните, что у вас есть только оборудование с фиксированной точкой. Выборки АЦП представляют собой 10 битов, выраженных как 10 фунтов значения int . Вы можете добавить несколько 10-битных значений в 16-битное значение или перейти к длинной переменной

Отладка переключением GPIO

Вы используете строку C-кода, чтобы инвертировать состояние вывода для целей отладки:

digitalWrite (11,! digitalRead (11));

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

Преобразование входа микрофона

Мы рекомендуем две возможные процедуры использования АЦП:

1. analogRead (n): эта функция будет возвращать 10-разрядное значение, полученное от АЦП, после завершения преобразования. Ничто не может быть сделано процессором во время преобразования.

adcval = analogRead (0); dsp_process (adcval);

2. используя ISR: вы можете запустить АЦП и выполнить другой код во время работы АЦП. Вам необходимо запрограммировать ISR, чтобы продолжить работу с преобразованным значением АЦП. Этот ISR будет выполняться каждый раз, когда заканчивается АЦП.

void adc_start () {ADCSRA = B11001111; } ISR (ADC_vect) {unsigned char adc_l = ADCL; знак без знака adc_h = ADCH; adcval = adc_h * 256 + adc_l; dsp_process (adcval); }

Обработка сигнала

Вы можете поместить свой код обработки сигнала в функцию dsp_process () . Затем вы можете использовать последовательный интерфейс, чтобы отправить обратно вычисленную громкость звука, чтобы проверить, имеют ли смысл ваши вычисления.

Вам, вероятно, следует выполнять обработку сигналов, используя 32-битные целые числа со знаком и без знака ( int и unsigned int , или S32 и U32 ). В complier.h вы можете найти эти удобные определения:

typedef со знаком char S8; //! <8-разрядное целое число со знаком. typedef unsigned char U8; //! <8-битное целое число без знака. typedef с короткой подписью int S16; //! <16-разрядное целое число со знаком. typedef unsigned short int U16; //! <16-разрядное целое число без знака. typedef со знаком long int S32; //! <32-разрядное целое число со знаком. typedef unsigned long int U32; //! <32-разрядное целое число без знака. typedef подписал long long int S64; //! <64-разрядное целое число со знаком. typedef unsigned long long int U64; //! <64-разрядное целое число без знака. typedef float F32; //! <32-битное число с плавающей точкой. typedef double F64; //! <64-битное число с плавающей точкой.

Некоторые советы по обработке сигналов с использованием фиксированной точки:

  • Чтобы умножить на дробь, умножьте на числитель и затем разделите на знаменатель.

  • Остерегайтесь переполнения, так как они будут обтекать.

  • Деление на ноль не приведет ни к какому исключению.

  • Быстрое деление или умножение на степени 2 осуществляется с помощью операторов сдвига «или».

Желаемое поведение

Ваша демка должна в конечном итоге реагировать на кратковременное увеличение громкости звука, поворачивая сервопривод. Вы можете установить руку и руку на сервопривод, используя один из сервомашин и немного горячего клея, например, чтобы создать руку «БЕСШУМНО».

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

Если вам, наконец, придется отказаться от нехватки времени или успеха, посмотрите, как заставить работать приложение mic-servo ,

Документация

Какая периферия от ATmega328P вам понадобится?

Разделы

» Ваз

» Двигатель

» Не заводится

» Неисправности

» Обзор

» Новости


Календарь

«    Август 2017    »
ПнВтСрЧтПтСбВс
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
 

Архив

О сайте

Затраты на выполнение норм токсичности автомобилей в США на период до 1974 г.-1975 г произошли существенные изменения. Прежде всего следует отметить изменение характера большинства работ по электромобилям: работы в подавляющем большинстве стали носить чисто утилитарный характер. Большинство созданных в начале 70х годов электромобилей поступили в опытную эксплуатацию. Выпуск электромобилей в размере нескольких десятков штук стал обычным не только для Англии, но и для США, ФРГ, Франции.

ПОПУЛЯРНОЕ

РЕКЛАМА

www.school4mama.ru © 2016. Запчасти для автомобилей Шкода