Двух тональный генератор на ардуино

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Имеется схема на базе жёской логики, паять рассыпуху как-то не комильфо, попробую заменить на ардуинку.
Пока без программирования таймеров, средствами языка в рамках концепции IDE.

Код простой (немного лишнего, в дальнейшем убрать):

/*
 * Двухтональный генератор на базе ардуино нано
 */

unsigned long freq_1800;
unsigned long freq_2250;
int worked_1 = 0;
int worked_2 = 0;

void setup() {
  Serial.begin(115200);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(13, OUTPUT);
  digitalWrite(7,HIGH);
  freq_2250 = micros();
  digitalWrite(8,HIGH);
  freq_1800 = micros();
  digitalWrite(13,HIGH);
}

void loop() {
 if(micros() - freq_2250 >= 444){
  digitalWrite(7,!digitalRead(7));
  freq_2250 = micros();
   worked_2++;
    if(worked_2 == 2250){
    Serial.println("2250 -worked");
    worked_2 = 0; 
  }
 }
 if(micros() - freq_1800 >= 555){
  digitalWrite(8,!digitalRead(8));
  freq_1800 = micros();
  worked_1++;
  if(worked_1 == 1800){
    Serial.println("1800 -worked");
    worked_1 = 0;
    digitalWrite(13,!digitalRead(13)); 
  }
  
 }
 // Конец тела цикла
}

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

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Да, константы должны быть 222 и 277, для вывода синхронизирующей последовательности можно сделать еще один аналогичный канал с константой частоты 2222

Добавлен код синхронизирующей частоты:
 

/*
 * Двухтональный генератор на базе ардуино нано (С) UA6EM
 * V-1.01 06.01.2019 (без использования таймеров)
 * V-1.02 07.01.2019 (Используя таймер 1 формируем частоту 2250 Гц на Pin10)
 * Prescaler: 1; MaxValue: 3555; Frequency: 2249.72Hz; Diff: 0.28Hz
 * http://arduino.ru/forum/programmirovanie/etyudy-dlya-nachinayushchikh-blink-i-bez-delay-i-bez-millis#comment-163979
 * 
 */

unsigned long freq_225;
unsigned long freq_1800;
unsigned long freq_2250;
byte flag_225 = 0;
byte delitel = 0;

enum Prescalers {
   PRESCALER_1 = 1, PRESCALER_8 = 2, PRESCALER_64 = 3, PRESCALER_256 = 4, PRESCALER_1024 = 5
};


// функция установки параметров таймера для выбранной частоты (в скобках номер таймера из калькулятора)
//     (1) Prescaler: 1; MaxValue: 4443; Frequency: 1800.18Hz; Diff: 0.18Hz
//     (2) Prescaler: 32; MaxValue: 138; Frequency: 1798.56Hz; Diff: 1.44Hz
//     (1) Prescaler: 1; MaxValue: 3555; Frequency: 2249.72Hz; Diff: 0.28Hz
//     (2) Prescaler: 32; MaxValue: 110; Frequency: 2252.25Hz; Diff: 2.25Hz
//     (1) Prescaler: 1; MaxValue: 35555; Frequency: 225.00Hz; Diff: 0.00Hz
// (0,1,2) Prescaler: 256; MaxValue: 138; Frequency: 224.82Hz; Diff: 0.18Hz

void set_Timer1(){   //Freq=2250Hz
   uint8_t prescaler = PRESCALER_1;
   uint16_t topValue = 3555;
   pinMode(10, OUTPUT);
   TCCR1A = 0x10;              // Инвертирование пина 10 по сравнению
   TCCR1B = 0x08 | prescaler;  // Установить СТС режим и делитель частоты
   OCR1A = topValue;           // установить TOP равным topValue
}

/*
void set_Timer2(){   //Freq=1800Hz
   uint8_t prescaler2 = 32;
   uint16_t topValue2 = 138;
   pinMode(11, OUTPUT);
   TCCR2A = 0x10;               // Инвертирование пина 11 по сравнению        ??? Уточнить
   TCCR2B = 0x08 | prescaler2;  // Установить СТС режим и делитель частоты    ??? Уточнить
   OCR2A = topValue2;           // установить TOP равным topValue             ??? Уточнить
}
*/

void start_Timer1(){
  TCCR1A = 0x10;              // Инвертирование пина 10 по сравнению
}

// Процедура для организации синхронизирующей частоты 225Гц от таймера частоты 2250
/*
void sync_Timer(){    if (digitalRead(10)==HIGH && flag_225 == 0 ){
    digitalWrite(13,HIGH);
        } else {
    digitalWrite(13,LOW);}
}
*/

// Процедура для организации синхронизирующей частоты 225Гц от частоты 2250hz (Pin9)
void sync_Timer(){ 
  if(delitel == 10){
    digitalWrite(13, !digitalRead(13));
    delitel = 0;
  }
}

void setup() {
  // Запустим таймер для частоты 2250 (Выход Pin 10)
  set_Timer1();
  start_Timer1();
  
  pinMode(7, OUTPUT);  // Freq 225Hz
  pinMode(8, OUTPUT);  // Freq 1800Hz
  pinMode(9, OUTPUT);  // Freq 2250Hz
  pinMode(13, OUTPUT); // Freq 225Hz Via SYNC Freq 2250Hz
  
  digitalWrite(13,HIGH);
  digitalWrite(9,HIGH);
  freq_2250 = micros();
  digitalWrite(8,HIGH);
  freq_1800 = micros();
  digitalWrite(7,HIGH);
  freq_225 = micros();
}

void loop() {
  if(micros() - freq_2250 >= 222){
  digitalWrite(9,!digitalRead(9));
  delitel++;
  freq_2250 = micros();
  }
  sync_Timer(); 
   
  if(micros() - freq_1800 >= 277){
  digitalWrite(8,!digitalRead(8));
  freq_1800 = micros();
  }

  if(micros() - freq_225 >= 2222){
  digitalWrite(7,!digitalRead(7));
  freq_225 = micros();
  }
}
/* END */

 

/*
 * Двухтональный генератор на базе ардуино нано
 */
#include "lgtx8p.h"
unsigned long freq_1;
unsigned long freq_18;
unsigned long freq_225;
unsigned long freq_1800;
unsigned long freq_2250;


void setup() {
 
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  
  freq_2250 = micros();
  freq_1800 = micros();
  freq_225 = micros();
  freq_18 = micros();
  freq_1 = micros();
  digitalWrite(7,HIGH);
   digitalWrite(8,HIGH);
    digitalWrite(9,HIGH);
     digitalWrite(10,HIGH);
      digitalWrite(11,HIGH);
  
}

void loop() {

  if(micros() - freq_1 >= 333333){
  digitalWrite(7,!digitalRead(7));
  freq_1 = micros();
    }
    
  if(micros() - freq_18 >= 22222){
  digitalWrite(8,!digitalRead(8));
  freq_18 = micros();
    }
    
  if(micros() - freq_225 >= 2222){
  digitalWrite(9,!digitalRead(9));
  freq_225 = micros();
    }
    
  if(micros() - freq_1800 >= 277){
  digitalWrite(10,!digitalRead(10));
  freq_1800 = micros();
   }
   
  if(micros() - freq_2250 >= 222){
  digitalWrite(11,!digitalRead(11));
  freq_2250 = micros();
    }
    
  digitalWrite(13, digitalRead(7));
    
 // Конец тела цикла
}

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Как бы проанализировать аналоговую часть в LTSpace?
Нарисовать как-то удалось

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Ну снимите АЧХ.

Какие еще идеи могут возникать при виде схемы ФНЧ.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

andriano пишет:

Ну снимите АЧХ.

Какие еще идеи могут возникать при виде схемы ФНЧ.

Еще не паял, хотел проэмулировать, можно ли заменить на LM358

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Почему нет, если фильтр на единицы кГц.

Только при чем здесь пайка? Я и предложил снять АЧХ на эмуляторе.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

andriano пишет:

Почему нет, если фильтр на единицы кГц.

Только при чем здесь пайка? Я и предложил снять АЧХ на эмуляторе.

Так я и попросил дать ссылку на инструкцию, как это сделать, интуитивно сам не одолел )))
WDRAKULA этот эмулятор порекомендовал в ПЕСОЧНИЦЕ

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Мой опыт работы с этой программой составил минут 20.

Но я так думаю, что, по общему правилу: порядок работы должен совпадать с таковым для снятия АЧХ в железе: подключить ко входу генератор, изменяя его частоту, смотреть амплитуду на выходе.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

там же ссылка на статью ВалВола об элементарных способах работы.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

wdrakula пишет:

там же ссылка на статью ВалВола об элементарных способах работы.

Почитал! Назвать сиё действо элементарным, язык не повернётся. Евгений Петрович был прав, это не для начинающих. Осталось спаять макетку и проверить подойдёт LM358 или нет )))