Генератор 400Гц на Arduino Mega2560

Собственно схему и скетч генератора я нашёл. Вот здесь.
Вопрос следующий - возможно ли “встроить” этот генератор в свой скетч, где в loop напёхано много чего, что использует как millis, так и delay?
Например, вот так (нужен только синус)

const PROGMEM uint8_t  sinewave[]=
{
0x80,0x83,0x86,0x89,0x8c,0x8f,0x92,0x95,0x98,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae,
0xb0,0xb3,0xb6,0xb9,0xbc,0xbf,0xc1,0xc4,0xc7,0xc9,0xcc,0xce,0xd1,0xd3,0xd5,0xd8,
0xda,0xdc,0xde,0xe0,0xe2,0xe4,0xe6,0xe8,0xea,0xec,0xed,0xef,0xf0,0xf2,0xf3,0xf5,
0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfc,0xfd,0xfe,0xfe,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xfd,0xfc,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,
0xf6,0xf5,0xf3,0xf2,0xf0,0xef,0xed,0xec,0xea,0xe8,0xe6,0xe4,0xe2,0xe0,0xde,0xdc,
0xda,0xd8,0xd5,0xd3,0xd1,0xce,0xcc,0xc9,0xc7,0xc4,0xc1,0xbf,0xbc,0xb9,0xb6,0xb3,
0xb0,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x98,0x95,0x92,0x8f,0x8c,0x89,0x86,0x83,
0x80,0x7c,0x79,0x76,0x73,0x70,0x6d,0x6a,0x67,0x63,0x60,0x5d,0x5a,0x57,0x54,0x51,
0x4f,0x4c,0x49,0x46,0x43,0x40,0x3e,0x3b,0x38,0x36,0x33,0x31,0x2e,0x2c,0x2a,0x27,
0x25,0x23,0x21,0x1f,0x1d,0x1b,0x19,0x17,0x15,0x13,0x12,0x10,0x0f,0x0d,0x0c,0x0a,
0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x03,0x02,0x01,0x01,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x05,0x06,0x07,0x08,
0x09,0x0a,0x0c,0x0d,0x0f,0x10,0x12,0x13,0x15,0x17,0x19,0x1b,0x1d,0x1f,0x21,0x23,
0x25,0x27,0x2a,0x2c,0x2e,0x31,0x33,0x36,0x38,0x3b,0x3e,0x40,0x43,0x46,0x49,0x4c,
0x4f,0x51,0x54,0x57,0x5a,0x5d,0x60,0x63,0x67,0x6a,0x6d,0x70,0x73,0x76,0x79,0x7c
};


// глобальные переменные
volatile int32_t freq=400;// частота генератора по умолчанию, Герц 
volatile uint16_t shag=100; //шаг переключения частоты,значение по умолчанию
volatile uint8_t ad2,ad1,ad0; //байты частоты для функции на ассемблере

// DDS algorithm 
static inline void signalOUT(const uint8_t *signal){ 
   asm volatile(  "eor r18, r18   ;r18<-0"  "\n\t"
    "eor r19, r19   ;r19<-0"  "\n\t"
     "1:"            "\n\t"
      "add r18, %0  ;1 cycle"     "\n\t"
       "adc r19, %1  ;1 cycle"     "\n\t"  
        "adc %A3, %2  ;1 cycle"     "\n\t"
         "lpm      ;3 cycles"  "\n\t"
         "out %4, __tmp_reg__  ;1 cycle" "\n\t"
        "sbis %5, 7   ;1 cycle if no skip" "\n\t"     // если стоит бит в переменной %5, то
       "rjmp 1b    ;2 cycles. Total 10 cycles" "\n\t" //пропустить эту команду ухода в цикл
      :
     :"r" (ad0),"r" (ad1),"r" (ad2),"e" (signal),"I" (_SFR_IO_ADDR(PORTA)), "I" (_SFR_IO_ADDR(PORTC))
    :"r18", "r19" );
    }


    
void powerOnOff() {
  PORTC&= ~(1<<7);// флаг ухода в цикл DDS
  DDRA=0xFF;//set A port as output
  uint32_t temp=(float)freq /0.095367431640625; //пересчёт частоты
  ad2=temp>>16; ad1=temp>>8; ad0=temp;
  signalOUT(sinewave);
  DDRA=0; PORTA=0;

 }

где powerOnOff, например, будет вызываться в loop по условию (включить/выключить).
Пока условие “включить” действует, генератор должен постоянно выдавать 400 Гц.
И вот тут я зашёл в тупик… :frowning:
Не пойму, не будет ли прерываться генерация из-за задержек в loop, или наоборот - генератор создаст ощутимые задержки в loop?
Да и вообще, большие сомнения, что задача реализуема.

Да, возможно.

Это вы о том, что возможно “встроить”, или о том, что ещё и будет работать, согласно задачи?
Насчёт первого я не сомневаюсь, а вот насчёт второго…

Войдя в функцию генерации loop остановится. Подозреваю что вам это не надо

Так Вы только об этом и спросили…

ad9833 и не будет у тебя никаких проблем

пытаюсь твой код DDS перегнать на STM32G431, под ядром STM, у тебя там тоже вывод на ассемблере сделан, пока мало что понимаю, даже не компилируется )))
Вывод через DAC
Есть вопросы!

Т.е. в данном случае, не реализуемо? Или есть варианты?

Спасибо! Глянул. Вроде как, подходяще, но… Что-то на хабре не лицеприятно о нём отозвались…
И ещё - Гена программируется по SPI. А его (или её?) у меня использует дисплей (ST7735).
Или это не критично? Я плохо знаю SPI. Возможно ли на одной шине юзать несколько устройств?

P.S.

Я так и подумал. Спасибо, что ненах… :wink:

можно, только еще один пин нужен, для CS, генератор для катушки Мишина на ней сделан

Ок. Благодарю! Побегу заказывать и “катушку” читать. :slight_smile:

сам я пользуюсь старой, на XR2206 - генератор, TDA - усилитель

Если в loop не будет отключения прерываний, то можно ШИМ синус 1000 гц пересчитать на 400 гц … и RC цепочку на выход …

даже если будет… на такой низкой частоте джиттер, да еще и в синусе - вряд ли будет заметен

Интересно, а зачем 400 Гц нужно?
Можно же и без ардуино вообще обойтись:

смею предположить - двигатели 400 герцовые

Самолётные!

2 лайка

Там на асм всё очень шатко, компилятор может что-то оптимизировать, и ничего работать не будет, даже если всё написано правильно. Я б не советовал связываться. Лучше через DMA, тем более на g431 наверно уже быстрый dma в отличии от f103.

я пока не пойму как ты организуешь выбор из массива, коэффициент пересчитал, для частоты 170 мегагерц получилось
#define dds_mpl_170 353,67090115605979141387388233065 //множитель DDS для частоты F_CPU 170Mhz

Но это для ассемблерного кода или?

Затем, что нужно 400 Гц.

Можно.

тепло…

горячо! :slight_smile:

Ну а если серъёзно, то надо запитать обмотку возбуждения сельсина.
45В, 400Гц. вот в этом “устройстве”.


Который в “радиокомпасе”. Который действительно “самолётный”, только “спущенный на землю”. :slight_smile:
Планирую произвести модернизацию - перевести с ардуино нано на мегу, заменить дисплей на 2-дюймовый ST7735, заменить питание сельсина с 50Гц на “родные” 400, ну и добавить “функционала”.
Со всем, кроме 45В 400Гц, вопросов не возникло, а вот на этом споткнулся…
С предложенным ad9833 тоже не всё просто будет. В плане, как получить 45В после него на “выходе”?
Скорее всего, без мощного УНЧ с двухполярным питанием (которого у меня нет сейчас) и трансформатора не обойтись…

Прерывания не используются. Но есть “бипер”, с использованием функции tone.
Конфликта не будет? tone вроде как тоже ШИМ юзает?
Да, и как пересчитать “ШИМ синус” на 400Гц?

Ну если это не из версии 3.6, то да. А зачем оно тебе вообще понадобилось-то? Этот метод удобен только тем, что даёт возможность перестройки частоты с разрешением в десятую герца , в остальном у него одни минусы. Поэтому собссно я от него и отказался в последней версии.