Программирование синтезатора LTC6904 на примере простого скетча


Николай Большаков - RA3TOX

Октябрь 2020

ltc6904

В этой статье речь пойдет ещё об одном недорогом синтезаторе на микросхеме LTC6904 компании Linear Technology. Эта крошечная микросхема генерирует сигнал прямоугольной формы в диапазоне частот от единиц килогерц до 68 мегагерц. Микросхема имеет всего 8 выводов, работоспособна от напряжения 2,7÷5,5 вольт, при этом потребляет ток 3÷7 мА. Погрешность установки частоты не более 1,1%. Управление микросхемой происходит по двухпроводному последовательному интерфейсу I2C.

Недостатком можно считать достаточно сложную процедуру расчета выходной частоты, которая подробно описана в документации на микросхему [1]. На рисунке ниже приведена выдержка из даташита, где описан порядок расчета промежуточных парметров OCT и DAC.

ltc6904_frec.jpg

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

Микросхема для управления через последовательный интерфейс I2C должна иметь соответствующий адрес. Таких адресов два и мы их можем задать с помощью вывода 4 (SEN) путем замыкания его на корпус или подавая на него положительный потенциал [1]. Обычно этот вывод замыкают на корпус.

Следует отметить, что микросхема имеет два выхода: прямой и инверсный. Управление этими выходами задается двумя конфигурационными битами в соответствии с таблицей:

Config

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

Cxema

Макет на Ардуино
Макет синтезатора на Arduino UNO

Привожу простую программу, которая будет управлять синтезатором для генерации фиксированной частоты. Скетч не содержит каких-либо специальных библиотек, кроме стандартных Wire.h и math.h, входящих в пакет программирования Arduino IDE.

/*************************************************************************
Пример программы управления синтезатором LTC9604 с помощью Arduino.
Выводы LTC6904 - Arduino
          PIN2 => A4 (SDA),
          PIN3 => A5 (SCL),
          PIN4 => ground,
          PIN8 => +5V
Программа написана для адреса 0x2E (Arduino address 0x17).
***************************************************************************/

#include <Wire.h>
#include <math.h>

const byte I2C_ADDR_0 = 0x17;
const byte I2C_ADDR_1 = 0x16;

byte i2cAddress = I2C_ADDR_0;

// установка частоты синтезатора
// freq: частота в килогерцах
// compOutputOn: whether the complementary clock output is enabled
// формат регистра для управления синтезатором:
// OCT3 OCT2 OCT1 OCT0 DAC9 DAC8 DAC7 DAC6 DAC5 DAC4 DAC3 DAC2 DAC1 DAC0 CNF1 CNF0

void setFreq(float freq, boolean compOutputOn=true)
{
  Serial.print("Freg (KHz)= ");
  Serial.println(freq);

  unsigned int oct = (int) (3.322*log10(freq * 1000.0 / 1039.0));   // рассчитываем значение OCT
  Serial.print("OCT: ");     // выводим значение на СОМ-порт
  Serial.println(oct);

  unsigned int dac = (int) (2048.0 - 2078.0 * pow(2, 10 + oct) / (freq * 1000.0) + 0.5);   // рассчитываем значение DAC
  Serial.print("DAC: ");    // выводим значение на СОМ-порт
  Serial.println(dac);
  unsigned int cnf = compOutputOn ? 0 : 2;

  unsigned int reg = oct << 12 | dac << 2 | cnf;

  byte high = (reg >> 8) & 0xff;
  byte low = reg & 0xff;

  Wire.beginTransmission(i2cAddress);
  Wire.write(high);
  Wire.write(low);
  Wire.endTransmission();
}

void setup()
{
  Serial.begin(9600);
  Wire.begin();
  setFreq(3700.0); // устанавливаем частоту f=3700.0 kHz
}
void loop()
{
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Как видим, код очень простой и после компиляции занимает около 13% памяти микроконтроллера для платы Arduino. Если убрать вывод промежуточных значений на com-порт, он будет ещё меньше. Оставшиеся ресурсы микроконтроллера можно задействовать для каких-либо дополнительных функций.

Для управления синтезатором можно задействовать практически любой микроконтроллер из серии ATTiny13/25/45/85. Конструкция получится очень компактной и недорогой. Я легко скомпилировал вышеприведенный пример для микроконтроллера ATTiny85 в среде Arduino IDE. Даже в этом случае программа заняла не более 50% памяти процессора.

Cxema

Выходная нагрузка и точность частоты синтезатора.

Неправильная загрузка выходов LTC6904 особенно при плохом шунтировании источника питания, приведет к проблеме с точностью. На низких частотах емкостная нагрузка вывода не проблема. Но на частотах выше 1 МГц следует обратить внимание на минимизацию емкостной нагрузки на выводах CLK. LTC6904 разработан для работы до 5 пФ на каждый выход без ухудшения точности. 5 пФ это эквивалент от одного до двух логических входов серии 74HCxxx. Стандартный пробник осциллографа с делителем 1:10 обычно имеет емкостную нагрузку от 10 до 15 пФ.
Разработчики настоятельно рекомендуют использовать высокоскоростной буфер, когда длина выходных проводов более 5 сантиметров или емкостная нагрузка более 5 пФ. Поэтому буферный каскад на полевом транзисторе очень приветствуется.

Bufer

Несколько слов о применении.

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

Можно добавить перемычки на свободных портах PB3-PB4 микроконтроллера и, комбинируя ими, можем получить 4 разных частоты. При использовании модуля Arduino таких фиксированных частот можно получить гораздо больше. Все зависит от вашей фантазии и навыков программирования.

Широкие возможности открываются при изготовлении "маячков" в КВ диапазоне. Необходимо только позаботиться о чистоте спектра и установить фильтр на выходе. Свободные ресурсы микроконтроллера можно использовать для формирования кодового сигнала или сообщения. Малое электропотребление позволит работать таким устройствам продолжительное время.

Плавное изменение частоты наверное тоже возможно, но это легче реализовать на другом недорогом синтезаторе Si5351a для которого имеется много готовых библиотек. Интересный проект представил David Johnson-Davies [2]. Он создал широкополосный генератор сигналов, где частота задается набором на клавиатуре и отображается на миниатюрном дисплее.

Ссылки по теме.

1. Linear Technology LTC6903/LTC6904 1kHz to 68MHz Serial Port Programmable Oscillator
2. David Johnson-Davies. Programmable Signal Generator
3. Mario LTC6904: Oscilador de 1Khz a 68Mhz.
4. Github - Arduino LTC6904 Library
5. Kerry D. Wong Interfacing LTC6904 With Arduino