Чтение онлайн

на главную - закладки

Жанры

Программируем Arduino. Основы работы со скетчами
Шрифт:

Следующий скетч использует библиотеку TimerOne, чтобы сгенерировать ШИМ-сигнал и выполнять замеры с частотой 10 кГц:

// sketch_13_03_null_filter_uno

#include <TimerOne.h>

const int analogInPin = A0;

const int analogOutPin = 9;

void setup

{

Timer1.attachInterrupt(sample);

Timer1.pwm(analogOutPin, 0, 100);

}

void loop

{

}

void sample

{

int raw = analogRead(analogInPin);

Timer1.setPwmDuty(analogOutPin, raw);

}

На рис. 13.5 изображен сигнал, подаваемый на вход Arduino (верхний график), и выходной сигнал,

генерируемый платой Arduino (нижний график). Оба сигнала имеют частоту 1 кГц. Выходной сигнал имеет в целом неплохую форму до частоты 2–3 кГц, но на более высоких частотах начинает приобретать треугольную форму, что объясняется малым числом замеров, приходящихся на один цикл. На осциллограмме можно наблюдать остатки несущей гармоники, искажающие выходной сигнал, но в целом он имеет совсем неплохую форму. Этого вполне достаточно для обработки сигналов с речевой частотой.

Рис. 13.5. Воспроизведение сигнала с частотой 1 кГц платой Arduino Uno

Цифровая обработка сигналов в Arduino Due

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

Аналоговые входы в модели Due способны принимать сигнал с напряжением до 3,3 В, поэтому сопротивление R1 следует подключить к контакту питания 3.3V, а не 5V. Так как Due имеет истинный аналоговый выход, можно убрать низкочастотный RC– фильтр на элементах R3 и C2 и подключить осциллограф непосредственно к контакту DAC0. На рис. 13.6 изображена схема подключения Due.

Рис. 13.6. Использование Arduino Due для цифровой обработки сигнала

Следующий скетч выполняет замеры с частотой 100 кГц!

// sketch_13_04_null_filter_due

const long samplePeriod = 10L; // микросекунды

const int analogInPin = A0;

const int analogOutPin = DAC0;

void setup

{

// http://www.djerickson.com/arduino/

REG_ADC_MR = (REG_ADC_MR & 0xFFF0FFFF) | 0x00020000;

analogWriteResolution(8);

analogReadResolution(8);

}

void loop

{

static long lastSampleTime = 0;

long timeNow = micros;

if (timeNow > lastSampleTime + samplePeriod)

{

int raw = analogRead(analogInPin);

analogWrite(analogOutPin, raw);

lastSampleTime = timeNow;

}

}

В отличие от других моделей, Arduino Due позволяет изменять разрешение АЦП и ЦАП. Для простоты и скорости оба настраиваются на разрешение 8 бит.

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

REG_ADC_MR = (REG_ADC_MR & 0xFFF0FFFF) | 0x00020000;

Для управления частотой замеров скетч использует функцию micros. То есть замеры выполняются только по прошествии довольно большого числа микросекунд.

На рис. 13.7 показано, как эта схема воспроизводит входной сигнал с частотой 5 кГц. Как видите, в выходном сигнале имеются ступеньки, образованные 20 замерами на цикл, следующими с частотой 100 кГц.

Рис. 13.7. Воспроизведение сигнала с частотой 5 кГц платой Arduino Due

Генератор реализаций фильтров

Если потребуется организовать более сложную фильтрацию, обратитесь к онлайн-генератору кода, с помощью которого вы сможете спроектировать фильтр и скопировать строки сгенерированного кода в свой скетч. Найти генератор можно по адресу http://www.schwietering.com/jayduino/filtuino/.

Альтернативой ему является изучение сложнейших математических приемов!

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

В вашем распоряжении имеется масса параметров для настройки будущего фильтра. На рис. 13.8 демонстрируется проект полосового фильтра, целью применения которого является уменьшение амплитуды сигнала на частотах от 1 до 1,5 кГц. Начнем с первого ряда параметров в верхней части: Butterworth, band stop и 1st order. Butterworth (фильтр Баттерворта) — это конструкция фильтра, название которого соответствует оригиналу из электроники . Фильтр Баттерворта хорошо подходит для разных целей и считается хорошим выбором по умолчанию.

Я также выбрал параметр 1st order (первого порядка). Большее значение этого параметра приведет к увеличению числа хранимых предшествующих замеров и крутизны затухания амплитудно-частотной характеристики (АЧХ) на частотах полосы подавления. Для данного примера вполне подойдет значение 1st order. Увеличение порядка потребует выполнения дополнительных вычислений и, возможно, уменьшения частоты следования замеров, чтобы плата Arduino успевала делать это.

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

Далее я определил верхний и нижний пороги полосы подавления. В эти поля можно вводить частоту в герцах или ноту MIDI.

Раздел more (дополнительно) включает пару дополнительных параметров и даже содержит подсказки, как лучше их настроить. В разделе output

Рис. 13.8. Генератор реализаций фильтров для Arduino

(выходной сигнал) можно выбрать тип массива значений, который будет использоваться для фильтрации. Я выбрал тип float type (вещественный). В заключение щелкнул на кнопке Send (Отправить), чтобы сгенерировать код.

Поделиться:
Популярные книги

Месть бывшему. Замуж за босса

Россиус Анна
3. Власть. Страсть. Любовь
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Месть бывшему. Замуж за босса

Корсар

Русич Антон
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
6.29
рейтинг книги
Корсар

Последний попаданец

Зубов Константин
1. Последний попаданец
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Последний попаданец

Уязвимость

Рам Янка
Любовные романы:
современные любовные романы
7.44
рейтинг книги
Уязвимость

Последняя Арена 4

Греков Сергей
4. Последняя Арена
Фантастика:
рпг
постапокалипсис
5.00
рейтинг книги
Последняя Арена 4

Прометей: владыка моря

Рави Ивар
5. Прометей
Фантастика:
фэнтези
5.97
рейтинг книги
Прометей: владыка моря

Ваше Сиятельство 8

Моури Эрли
8. Ваше Сиятельство
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Ваше Сиятельство 8

Титан империи 4

Артемов Александр Александрович
4. Титан Империи
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Титан империи 4

Прометей: каменный век II

Рави Ивар
2. Прометей
Фантастика:
альтернативная история
7.40
рейтинг книги
Прометей: каменный век II

Наизнанку

Юнина Наталья
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Наизнанку

Вечная Война. Книга VIII

Винокуров Юрий
8. Вечная Война
Фантастика:
боевая фантастика
юмористическая фантастика
космическая фантастика
7.09
рейтинг книги
Вечная Война. Книга VIII

Генерал-адмирал. Тетралогия

Злотников Роман Валерьевич
Генерал-адмирал
Фантастика:
альтернативная история
8.71
рейтинг книги
Генерал-адмирал. Тетралогия

Идеальный мир для Лекаря 6

Сапфир Олег
6. Лекарь
Фантастика:
фэнтези
юмористическая фантастика
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 6

Сумеречный Стрелок 5

Карелин Сергей Витальевич
5. Сумеречный стрелок
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Сумеречный Стрелок 5