В данной статье речь пойдёт о модуле HC-SR08, построенном на базе микросхемы AD9850. Разберёмся с его возможностями, способами управления (их два – последовательный и параллельный), а позже соберём генератор, используя Ардуино в качестве контроллера.
Согласно описанию на сайте Analog Devices, AD9850 – это устройство с высокой степенью интеграции, в котором используется комбинация усовершенствованной технологии прямого цифрового синтеза (DDS, direct digital synthesis), высококачественного цифро-аналогового преобразователя и компаратора, обеспечивающая функцию синтеза частоты с цифровым программным управлением и функцию генерации тактовых сигналов. При работе от точного опорного источника тактового сигнала, AD9850 формирует стабильный аналоговый выходной синусоидальный сигнал с программируемыми частотой и фазой. Этот синусоидальный сигнал может быть использован непосредственно в качестве источника частоты или преобразован внутренними средствами компонента в прямоугольное колебание. Инновационное, быстродействующее ядро DDS AD9850 имеет 32-разрядное слово настройки частоты, что дает разрешение настройки частоты выходного сигнала 0.0291 Гц при частоте опорного тактового сигнала 125 МГц. Архитектура AD9850 позволяет формировать выходные сигналы на частоте до половины частоты опорного тактового сигнала (то есть, до 62.5 МГц), а значение частоты может перестраиваться со скоростью до 23 миллионов значений в секунду. Компонент обеспечивает возможность фазовой модуляции с цифровым управлением 5-разрядным кодом, которая позволяет вносить в выходной сигнал сдвиг по фазе на 180°, 90°, 45°, 22.5°, 11.25° и любую комбинацию вышеперечисленных значений. Также в состав AD9850 входит быстродействующий компаратор, при помощи которого синусоидальный выходной сигнал ЦАП (после внешней фильтрации) может быть преобразован в прямоугольное колебание с малым дрожанием фазы, что упрощает применение компонента в задаче формирования тактовых сигналов.
Даташит на AD9580 доступен по ссылке.
GND, VCC | Выводы для подключения питания. Для удобства продублированы на обоих сторонах модуля. |
D0..D7 | 8-ми битный вход данных. Используются при параллельном способе загрузки. |
DATA | Он же D7 – используется при последовательной передаче управляющего слова. |
W_CLK | Word Load Clock – строб записи очередного байта (при параллельной передачи) или бита (при последовательной передачи) из 40-битной последовательности. |
FQ_UD | Frequency Update. При переднем фронте на данном входе AD9850 обновляет частоту (или фазу) в соответствии с полученным 40-битным значением. |
RESET | Вход сброса AD9850. |
ZOUT1, ZOUT2 | Комплементарные выходы ЦАП AD9850. Синусоиду снимаем отсюда. |
QOUT1, QOUT2 | Комплементарные выходы компаратора AD9850. Отсюда снимаем прямоугольные импульсы. |
В микросхеме AD9850 применён цифро-аналоговый преобразователь с комплементарными выходами, что позволяет ему как отдавать ток, так и принимать его. Как было сказано ранее, выходной синусоидальный сигнал может использоваться для генерации прямоугольных импульсов. Для этого нужно лишь отфильтровать сигнал и подать его на вход компаратора, входящего в состав AD9850. Модуль HC-SR08 уже содержит такой фильтр, а также переменный резистор R13, позволяющий изменять скважность генерируемых импульсов.
AD9850 содержит 40-битный регистр, используемый для задания выходной частоты, фазы и режима энергосбережения. Управляющая последовательность может быть загружена в регистр в параллельном и последовательном режиме, которые будут рассмотрены далее.
AD9850 способен генерировать сигнал частотой до ½ от значения тактовой частоты. В рассматриваемом модуле применён кварцевый генератор на 125 МГЦ, а значит, максимальная выходная частота составляет 62.5 МГЦ. Для задания частоты в управляющей 40-битной последовательности отведены 32 бита, при этом шаг её изменения составляет 125 МГЦ / 232 или ~0.0291 Гц. Здесь действует следующее соотношение:
FOUT = FREG * FCLK / 232, где FOUT – выходная частота генератора; FREG – 32-битное значение, записанное в управляющий регистр; FCLK – тактовая частота, т.е. 125 МГЦ.
Для вычисления значения FREG, которое должно быть передано в AD9850 для генерации желаемой частоты FOUT, приведённая формула преобразуется в следующий вид:
FREG = FOUT * 232 / FCLK
Что касается фазы, то за её выбор отвечают 5 бит из 40-битной управляющей последовательности, шаг изменения фазы составляет 11.25°.
Нераскрытым остаётся вопрос положения этих битов в управляющей последовательности, то есть структура 40-битного регистра. Рассмотрим этот момент далее в примерах параллельного и последовательного обмена.
После выполнения сброса AD9850 уже находится в режиме параллельного обмена. И для установки на выходе определённой частоты или фазы необходимо записать в управляющий регистр 5 байт. Обратимся к таблице III из даташита AD9850:
В ней показана структура каждого из пяти байт, которые мы должны передать. Первый байт определяет формат обмена (0 и 1 биты), статус режима энергосбережения (2 бит) и фазу (3..7 биты). Для передачи данных в параллельном режиме используются выводы D0..D7. Для защёлкивания очередного байта в регистре AD9850 (и для инкремента внутреннего указателя) необходим импульс на входе W_CLK. И, наконец, после передачи всех 5 байт нужен импульс на входе FQ_UD, по его переднему фронту AD9850 применит переданные значения.
Обратите внимание, при параллельном режиме биты Control должны быть 00. Значение 11 используется для переключения в последовательный режим, а другие два зарезервированы для сервисных целей и не должны использоваться.
«Теория без практики мертва», поэтому для закрепления изложенного материала рассмотрим пример подключения AD9850 к Ардуино. Соединим их в соответствии со схемой и загрузим в Ардуино следующий скетч:
// AD9850 Тестовый скетч. Параллельная передача.
//
// D0..D7 AD9850 подключаем к D0..D7 Ардуино (это порт D)
const uint8_t pinReset = 8;
const uint8_t pinFQ_UD = 9;
const uint8_t pinW_CLK = 10;
// Управляющее слово:
const uint8_t W0 = 0x00; // control = 00 (parallel), power down = false, phase = 00000
const uint8_t W1 = 0x00;
const uint8_t W2 = 0x00;
const uint8_t W3 = 0x03;
const uint8_t W4 = 0xE8; // 0x03e8 = 1000. Fout = 1000 * 0.0291 = 29.1Hz
// Функция кратковременной подтяжки пина к 1
void pulsePin(uint8_t pin) {
digitalWrite(pin, HIGH);
digitalWrite(pin, LOW);
}
void setup() {
// Настраиваем используемые пины
pinMode(pinReset, OUTPUT);
pinMode(pinFQ_UD, OUTPUT);
pinMode(pinW_CLK, OUTPUT);
// Пины D0..D7 настроим на вывод, используя регистр DDRD
DDRD = B11111111; // 1 - OUTPUT, 0 - INPUT
// Устанавливаем используемые выводы в 0 (необязательно, скорее правило хорошего тона)
digitalWrite(pinReset, LOW);
digitalWrite(pinFQ_UD, LOW);
digitalWrite(pinW_CLK, LOW);
// Сброс AD9850
pulsePin(pinReset);
// Загружаем управляющую последовательность
PORTD = W0; // Выводим W0 в порт D (пины D0..D7)
pulsePin(pinW_CLK); // "Защёлкиваем" байт
PORTD = W1; // И так 5 раз
pulsePin(pinW_CLK);
PORTD = W2;
pulsePin(pinW_CLK);
PORTD = W3;
pulsePin(pinW_CLK);
PORTD = W4;
pulsePin(pinW_CLK);
// Применяем изменения импульсом на pinFQ_UD (Frequency Update)
pulsePin(pinFQ_UD);
}
void loop() {
}
Давайте разберёмся, что делает данный код. Функция setup начинается с настройки используемых выводов. Для линий Reset, W_CLK и FQ_UD это делается при помощи pinMode, а пины D0..D7 (которые вместе образуют порт D) удобнее настроить непосредственно через регистр DDRD. Далее на вход Reset AD9850 подаётся кратковременный импульс, что приводит к сбросу генератора. После этого можно передавать в AD9850 управляющее слово для установки нужной частоты и фазы. В данном примере управляющее слово содержится в константах W0..W4. Значения констант поочерёдно выводятся в порт D и фиксируются импульсом на линии W_CLK. После передачи всех 5 байт применяем переданное значение частоты и фазы импульсом на линии FQ_UD. После выполнения этого кода на выходе AD9850 появится синусоида с частотой 29.1 Гц:
Как получилась такая частота? Константы W1..W4 содержат значение для установки частоты. В нашем примере это значение 0x03E8 или 1000 в десятеричной системе. Как уже упоминалось, шаг изменения частоты составляет 125 МГц / 232 или 0.291 Гц. Умножив это значение на 1000, мы получили частоту 29.1 Гц
После сброса AD9850 по умолчанию находится в режиме параллельного обмена. Порядок переключения в последовательный режим пояснён в даташите следующей диаграммой:
Как видно из приведённой диаграммы, для переключения AD9850 в последовательный режим необходимо выполнить следующие действия:
После этого можно передавать 40-битную последовательность, используя вход DATA или D7. Для защёлкивания очередного бита в регистре AD9850 необходим импульс на линии W_CLK. А по завершении передачи всей последовательности нужно подать импульс на линии FQ_UD для применения переданных значений.
Обратите внимание, для выполнения первого из приведённых выше пунктов не нужно подключать все входы данных AD9850 к Ардуино (микроконтроллеру). Достаточно подтянуть D0 и D1 к питанию, что уже сделано в самом модуле HC-SR08 (резисторы R10 и R14 на схеме модуля). Другой важный момент – при последовательной передаче значения битов Control должны быть 00, остальные комбинации зарезервированы для сервисных целей.
И ещё одна иллюстрация из даташита, поясняющая порядок передачи 40-битной последовательности:
Поскольку данные передаются через старший разряд линии данных AD9850, и предполагают сдвиг во внутреннем регистре микросхемы от старшего бита к младшему, 40-битная последовательность должна передаваться начиная с младшего разряда (LSB).
И, наконец, схема подключения к Ардуино и скетч, реализующий описанные действия:
// AD9850 Тестовый скетч. Последовательная передача.
//
const uint8_t pinData = 7;
const uint8_t pinReset = 8;
const uint8_t pinFQ_UD = 9;
const uint8_t pinW_CLK = 10;
// Управляющее слово:
const uint8_t W0 = 0x00; // control = 00, power down = false, phase = 00000
const uint8_t W1 = 0x00;
const uint8_t W2 = 0x00;
const uint8_t W3 = 0x86;
const uint8_t W4 = 0x3C; // 0x863C = 34364. Fout = 34364 * 0.0291 = ~1000Hz
// Функция кратковременной подтяжки пина к 1
void pulsePin(uint8_t pin) {
digitalWrite(pin, HIGH);
digitalWrite(pin, LOW);
}
void setup() {
// Настраиваем используемые пины
pinMode(pinData, OUTPUT);
pinMode(pinReset, OUTPUT);
pinMode(pinFQ_UD, OUTPUT);
pinMode(pinW_CLK, OUTPUT);
// Устанавливаем используемые выводы в 0
digitalWrite(pinReset, LOW);
digitalWrite(pinFQ_UD, LOW);
digitalWrite(pinW_CLK, LOW);
// Сброс AD9850
pulsePin(pinReset);
// Переключаемся в последовательный режим
pulsePin(pinW_CLK);
pulsePin(pinFQ_UD);
// Передаём 40-битную последовательность
shiftOut(pinData, pinW_CLK, LSBFIRST, W4);
shiftOut(pinData, pinW_CLK, LSBFIRST, W3);
shiftOut(pinData, pinW_CLK, LSBFIRST, W2);
shiftOut(pinData, pinW_CLK, LSBFIRST, W1);
shiftOut(pinData, pinW_CLK, LSBFIRST, W0);
// Применяем изменения импульсом на pinFQ_UD (Frequency Update)
pulsePin(pinFQ_UD);
}
void loop() {
}
В этот раз константы W1...W4 содержат значение 0x863C или 34364, которое при умножении на 0.0291 даст частоту 1000 Гц. Результат работы генератора виден на осциллограмме ниже. Также отмечу способ передачи данных в этом скетче – побитный, с использованием функции shiftOut. Передача начинается с младшего бита (LSBFIRST) младшего байта (W4). Завершается передача данных импульсом на линии FQ_UD.
Как уже упоминалось, на борту AD9850 имеется быстродействующий компаратор, который позволяет получать прямоугольные импульсы из синусоиды. А необходимый для этого внешний фильтр уже присутствует на плате модуля HC-SR08. Скважность импульсов регулируется при помощи переменного резистора, а снимаются они с выводов QOUT1, QOUT2.
Итак, мы познакомились с микросхемой AD9850, научились подключать её к Ардуино и программировать, используя способы параллельной и последовательной передачи данных. Эти знания пригодятся нам в создании полноценного генератора, о чём будет рассказано в следующей части настоящей статьи.
г. Москва, Пятницкое ш. д. 18, пав. 566
zakaz@compacttool.ru
8-495-752-55-22
Информация представленная на данном информационном ресурсе преследует исключительно рекламные цели и не является договором-офертой !
© Все права защищены 2015 - 2024г https://compacttool.ru