Автор Тема: Универсальный Цифровой Блок Управления (ЦБУ) всем трансивером  (Прочитано 102092 раз)

0 Пользователей и 6 Гостей просматривают эту тему.

Оффлайн ra0ahc

  • Hero Member
  • *****
  • Сообщений: 4872
  • Сергей, RD6AH
Если хотите переключать диапазоны придётся ставить экспандер рса9555
Да да, я знаю, у меня ничего не получится )))

Оффлайн Игорь 2

  • Administrator
  • *****
  • Сообщений: 19690
Процессор

Куплен.  1yep

А си5351 придётся вам что-то мутить самостоятельно.

Это есть, только что работа прошла. Смонтирована на мелкой плате с обвесом, только шины заливки торчат... 1999

Енкодер любой хоть мех хоть оптика . У меня самый популярный за 800 р из Китая .

Если это нормальный, ссылку дайте прямую. Он без трещётки? Сколько импульсов на оборот? Механически выдержит частое кручение? Инерционность собственная, или маховик нужен?

Выходы на гуны и триггер 3.3 в ... просто тык и работает без ничего.

А мне это пока не нужно. Только сишкой управлять для начала. Если выяснится, что при таком малом шаге, её спуры нигде не вылезут за заданные мною пределы, то будем дальше думать.

С кнопок дребезг сняли?  pl33 lol22
Ничего невозможного нет

Оффлайн Игорь 2

  • Administrator
  • *****
  • Сообщений: 19690
Если хотите переключать диапазоны придётся ставить экспандер рса9555

Пока ждём. Результаты проверки SI интересны в первую очередь.  1yep
Ничего невозможного нет

Оффлайн veso74

  • Hero Member
  • *****
  • Сообщений: 944
RA0AHC, Сергей, мне интересно как рассчитываете данни к Si5351 - с внешная библиотека, переработаной такой библиотекой, по собственному алгоритму или др.?

ОФФТОП: (Пфу, русские падежи не понимаю совсем. Надеюсь, что Вы понимаете мой вопрос :) ).
« Последнее редактирование: Декабрь 05, 2019, 05:29:19 pm от veso74 »

Оффлайн ra0ahc

  • Hero Member
  • *****
  • Сообщений: 4872
  • Сергей, RD6AH
Я русские падежи тоже не понимаю как и все нормальные русские  1yep
Это кошмар русского языка.

Веселин, я ваши тексты читаю даже не напрягаюсь  1999
Сейчас скину расчёт
Да да, я знаю, у меня ничего не получится )))

Оффлайн ra0ahc

  • Hero Member
  • *****
  • Сообщений: 4872
  • Сергей, RD6AH
для начала. Если выяснится, что при таком малом
Сишка работает на частоте гунов и потом делится также как гуны с теми же коэфф деления. Причём в первом варианте синта я также делал и делил потом на 32 )))
Да да, я знаю, у меня ничего не получится )))

Оффлайн Игорь 2

  • Administrator
  • *****
  • Сообщений: 19690
Сишка работает на частоте гунов и потом делится также как гуны с теми же коэфф деления.

Здесь поподробнее - где она делится? У меня на ЧФД должно идти от 10 до 20 МГц, нужны дополнительные делители?  123123
Ничего невозможного нет

Оффлайн ra0ahc

  • Hero Member
  • *****
  • Сообщений: 4872
  • Сергей, RD6AH
Забыл сказать lllol я забыл отключить опцию ару  44443 она работает в режиме реального времени  , но при этом не мешает менять частоту мгновенно при очень серьёзных оборотах енкодера .
Кстати про енкодер ... у китайцев есть склады в России и они такие енкодер вам за пару дней поставят. Механику на главный енкодер конечно нет смысла ставить.
А ещё rd16 500 рублей стали стоить блин ... купил на ум 70 ватт.
Да да, я знаю, у меня ничего не получится )))

Оффлайн ra0ahc

  • Hero Member
  • *****
  • Сообщений: 4872
  • Сергей, RD6AH
Вам вообще ничего не нужно. Там вся математика уже сделана там вн делители стоят. Выход 10-20
Да да, я знаю, у меня ничего не получится )))

Оффлайн Игорь 2

  • Administrator
  • *****
  • Сообщений: 19690
Выход 10-20

Здорово. В самое ближайшее время проверим.  1yep

Кстати про енкодер ..

Да, кстати.  lllol Сылку дайте... lol22
Ничего невозможного нет

Оффлайн ra0ahc

  • Hero Member
  • *****
  • Сообщений: 4872
  • Сергей, RD6AH
void si5351aSetFrequency(unsigned long frequency) {// freq on a display
    unsigned long frequencyin = frequency;

    frequency += freq.IF2 + freq.IF1; //30+9+0.2

//    if (frequencyin - freq.IF1 - freq.IF2 > freq.div4inMixer) {
        frequency *= 2; //триггер в смесители либо 2 либо 4 взависимости от частоты
//    } else{
//        frequency *= 4;
//    }
    unsigned long pllFreq;
    unsigned long xtalFreq = freq.QURZ; //XTAL_FREQ;
    unsigned long l;
    float f;
    char mult;
    unsigned long num;
    unsigned long denom;
    unsigned long divider;

    divider = 900000000 /
              frequency;        // Calculate the division ratio. 900,000,000 is the maximum internal  PLL frequency: 900MHz
    if (divider % 2) divider--;             // Ensure an even integer division ratio
    pllFreq = divider * frequency;          // Calculate the pllFrequency: the divider * desired output frequency
    mult = pllFreq / xtalFreq;              // Determine the multiplier to get to the required pllFrequency
    l = pllFreq % xtalFreq;                 // It has three parts:
    f = l;                                  // mult is an integer that must be in the range 15..90
    f *= 1048575;                           // num and denom are the fractional parts, the numerator and denominator
    f /= xtalFreq;                          // each is 20 bits (range 0..1048575)
    num = f;                                // the actual multiplier is  mult + num / denom
    denom = 1048575;                        // For simplicity we set the denominator to the maximum 1048575

    // Set up PLL A with the calculated multiplication ratio

    setupPLL(SI_SYNTH_PLL_A, mult, num, denom);

    // Set up MultiSynth divider 0, with the calculated divider.
    // The final R division stage can divide by a power of two, from 1..128.
    // reprented by constants SI_R_DIV1 to SI_R_DIV128 (see si5351a.h header file)
    // If you want to output frequencies below 1MHz, you have to use the
    // final R division stage

    if (frequencyin> freq.div4inMixer)
        setupMultisynth(SI_SYNTH_MS_0, divider, SI_R_DIV_4); // без делителя в синте SI_R_DIV_32
    else
        setupMultisynth(SI_SYNTH_MS_0, divider, SI_R_DIV_2); //с делителм в синтезаторе на 2 SI_R_DIV_16

    // Reset the PLL. This causes a glitch in the output. For small changes to
    // the parameters, you don't need to reset the PLL, and there is no glitch
    //i2cSendRegister(SI_PLL_RESET, 0xA0);
    // Finally switch on the CLK0 output (0x4F)
    // and set the MultiSynth0 input to be PLL A
    i2cSendRegister(SI_CLK0_CONTROL, 0x4F | SI_CLK_SRC_PLL_A);

}
Да да, я знаю, у меня ничего не получится )))

Оффлайн ra0ahc

  • Hero Member
  • *****
  • Сообщений: 4872
  • Сергей, RD6AH
void setupMultisynth(char synth, unsigned long divider, char rDiv) {
    unsigned long P1;                                        // Synth config register P1
    unsigned long P2;                                        // Synth config register P2
    unsigned long P3;                                        // Synth config register P3

    P1 = 128 * divider - 512;
    P2 = 0;                                                        // P2 = 0, P3 = 1 forces an integer value for the divider
    P3 = 1;

    i2cSendRegister(synth + 0, (P3 & 0x0000FF00) >> 8);
    i2cSendRegister(synth + 1, (P3 & 0x000000FF));
    i2cSendRegister(synth + 2, ((P1 & 0x00030000) >> 16) | rDiv);
    i2cSendRegister(synth + 3, (P1 & 0x0000FF00) >> 8);
    i2cSendRegister(synth + 4, (P1 & 0x000000FF));
    i2cSendRegister(synth + 5, ((P3 & 0x000F0000) >> 12) | ((P2 & 0x000F0000) >> 16));
    i2cSendRegister(synth + 6, (P2 & 0x0000FF00) >> 8);
    i2cSendRegister(synth + 7, (P2 & 0x000000FF));
}
Да да, я знаю, у меня ничего не получится )))

Оффлайн ra0ahc

  • Hero Member
  • *****
  • Сообщений: 4872
  • Сергей, RD6AH
//I2C
void i2cSendRegister(char reg, char data_) {
    char bufer[2] = {reg, data_};
    while (HAL_I2C_Master_Transmit(&hi2c3, I2C_WRITE, (uint8_t *) &bufer, (uint16_t) 2, (uint32_t) 500) != HAL_OK) {

    };

}

// Set up specified PLL with mult, num and denom
// mult is 15..90
// num is 0..1,048,575 (0xFFFFF)
// denom is 0..1,048,575 (0xFFFFF)
//
void setupPLL(char pll, char mult, unsigned long num, unsigned long denom) {
    unsigned long P1;                                        // PLL config register P1
    unsigned long P2;                                        // PLL config register P2
    unsigned long P3;                                        // PLL config register P3

    P1 = (unsigned long) (128 * ((float) num / (float) denom));
    P1 = (unsigned long) (128 * (unsigned long) (mult) + P1 - 512);
    P2 = (unsigned long) (128 * ((float) num / (float) denom));
    P2 = (unsigned long) (128 * num - denom * P2);
    P3 = denom;

    i2cSendRegister(pll + 0, (P3 & 0x0000FF00) >> 8);
    i2cSendRegister(pll + 1, (P3 & 0x000000FF));
    i2cSendRegister(pll + 2, (P1 & 0x00030000) >> 16);
    i2cSendRegister(pll + 3, (P1 & 0x0000FF00) >> 8);
    i2cSendRegister(pll + 4, (P1 & 0x000000FF));
    i2cSendRegister(pll + 5, ((P3 & 0x000F0000) >> 12) | ((P2 & 0x000F0000) >> 16));
    i2cSendRegister(pll + 6, (P2 & 0x0000FF00) >> 8);
    i2cSendRegister(pll + 7, (P2 & 0x000000FF));
}
Да да, я знаю, у меня ничего не получится )))

Оффлайн ra0ahc

  • Hero Member
  • *****
  • Сообщений: 4872
  • Сергей, RD6AH
Да да, я знаю, у меня ничего не получится )))

Оффлайн veso74

  • Hero Member
  • *****
  • Сообщений: 944
Сергей, спасибо. Да, Hans Summers, 2015, в QRP labs.
Рабочий вариант, один выход. Хотя еще много можно сделать к ИС Si5351 (над 150 MHz, под 500 kHz, CLK_0, CLK_1, CLK_2 выхода отдельно/вместе, квадратурный выход и др.). SI_PLL_RESET, смотрю, закоментировано :) . Именно так.