AD9833 - установка частоты с точностью 0.1Hz

Прошерстив библиотеки обнаружил, что частота устанавливается через переменную формата float, то-есть имеем ограничение на 6-7 значащих цифр (с мантиссой) при этом девайс имеет возможность при тактовой 25Mhz установку частоты с точностью 0.1Hz.
Есть ли у кого опыт обхода ограничения переменной float для вводы частоты с точность долей Герца?

Так может в обход библиотеки записывать напрямую? Или библиотеку подправить. В своё время руки не дошли до этой волшебной микрухи.

Давно это было… сейчас посмотрел свои наброски и нигде float не встретил.

А вообще вот тут всё написано (читай про бит B28):

скинь кодом, а то набирать с картинки некомильфо

@BOOM , не забудь истребовать авторские отчисления)))

я ему с барского плеча микросхему TDA-7056 подгоню, для катушки Мишина

1 лайк

Я всё это писал пользуясь статьёй (ссылку выше приложил).
Там автор всё разжевал и приготовил на ложке. )))

7056 это которая в каждом телевизоре 90х/начала 2000х стояла?
Не надо )))

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

Зачем тебе точность 0.1Гц?
Опять что-то к катушке приделываешь?))

модуляцию! ты скинешь код али нет
вот тут ты что делаешь?

 pulseLow(DDS_SCLK);
#define DDS_SDATA PIN_PD3   // | Вывод SDATA AD9833
#define DDS_SCLK  PIN_PD1   // | Вывод SCLK AD9833
#define DDS_FSYNC PIN_PD0   // | Вывод FSYNC AD9833
#define pulseHigh(pin)      { digitalWrite(pin, HIGH); digitalWrite(pin, LOW);  }
#define pulseLow(pin)       { digitalWrite(pin, LOW);  digitalWrite(pin, HIGH); }

/* Функция физического трансфера байт в AD9833 */
void tfr_word(int16_t data) {
  digitalWrite(DDS_FSYNC, LOW);
  for (int i = 0; i < 16; i++) {
    digitalWrite(DDS_SDATA, (bool)(data & 0x8000));
    data <<= 1;
    data &= 0xFFFF;
    pulseLow(DDS_SCLK);
  }
  digitalWrite(DDS_FSYNC, HIGH);
}

/* функция установки частоты (непосредственно засылка в AD9833) */
void send_frequency(uint32_t frequency) {
  uint32_t freq;
  uint16_t MSB;
  uint16_t LSB;
  uint16_t phase = 0xC000;  // Phase (0)
  freq = frequency * 268435 / 25000;

  MSB = (int)((freq & 0xFFFC000) >> 14);
  LSB = (int)(freq & 0x3FFF);

  //Установка DB15 и DB14
  LSB |= 0x4000;
  MSB |= 0x4000;

  //tfr_word(0x2100); // Reset + DB28
  tfr_word(LSB);
  tfr_word(MSB);
  tfr_word(phase);
  //tfr_word(0x2000);  // Exit Reset
}

Таки пришлось задницу с дивана поднимать… :smiley:

а частота точно в десятых долях герца???

Нет, тут точность до герца.
Мне и не нужно было точности 0.1 Гц (ни тогда, ни сейчас).

Почитай статью по ссылке то…

я мастер простых решений жеж, а ты по чи тай да по чи тай
Видимо просто поправить расчётную формулу для частоты с десятыми долями герца:

freq = frequency * 268435 / 250000;

Попробуй.
Я давно 9833 в руках не держал.

Или еще попробуй «тюнить» LSB / MSB напрямую…

а что ты на них делал?

Я делал то, на что они рассчитаны - генераторы.
А что ты с точностью 0.1Гц собрался делать - страшно представить :smiley:

Катушку разогнать решил? :smiley: