Частотомер на arduino

Содержание

Подключение LCD 1602 к Arduino

Прежде чем мы приступим к загрузке скетча и отправке данных на дисплей, давайте подключим LCD 1602 к Arduino.

LCD дисплей имеет много контактов (16 контактов). Но, хорошая новость заключается в том, что не все эти контакты необходимы для нас, чтобы подключиться к Arduino.

Мы знаем, что есть 8 выводов данных, по которым передаются данные на дисплей. Но, ЖК-дисплеи на HD44780  разработаны таким образом, что мы можем общаться с ЖК-дисплеем, используя только 4 вывода данных (4-разрядный режим) вместо 8 (8-разрядный режим). Таким образом мы можем сэкономить 4 вывода Arduino!

Итак, что мы будем работать с LCD дисплеем, используя 4-битный режим, и, следовательно, нам нужно только 6 контактов: RS, EN, D7, D6, D5 и D4.

Теперь давайте подключим ЖК-дисплей к Arduino. Четыре контакта данных (D4-D7) дисплея подключаем к цифровым контактам Arduino #4, #5, #6, #7. Вывод EN подключим к Arduino вывод #2, а вывод RS к выводу #1.

Подключение 16-символьного ЖК-дисплея к Arduino UNO

Скетч функционального генератора

#include <LiquidCrystal.h>
int ledPin = 13;      // Светодиод подключен к цифровому выводу 9
int analogPin = A0;   //потенциометр подключен к аналоговому выводу 3
int val = 0;         // переменная для хранения прочитанного значения
//int data={200,238,278,310,341,366,384,396,400,396,384,366,340,310,276,238,200,162,122,90,59,34,16,4,0,4,16,34,60,90,14,162};
int n=0;
 int data={125,157,188,213,233,246,250,245,233,213,188,156,125,93,63,37,17,4,0,4,17,37,63,93};
int P;
boolean k;
unsigned int freq;
//int data={125, 149,174,194,213,229,240,248,250,248,240,229,213,194,173,149,125,101,76,56,37,21,10,3,0,3,10,21,38,56,76,101}; 
int(y)=1;
int (sig)=1;
int freq1;
 LiquidCrystal lcd(12,11,13,4,5,6,7);
void setup()
{
  pinMode(ledPin, OUTPUT);   // устанавливает вывод как выход
  pinMode (9,OUTPUT);
  pinMode (10,OUTPUT);
  pinMode(11,OUTPUT);  
  pinMode (12,OUTPUT);
  pinMode(8,INPUT_PULLUP);
  pinMode(2,INPUT_PULLUP);
  cli();
  TCCR1A = _BV(COM1A1) | _BV(COM1B1) ; //TIMER1 PWM MODE 
  TCCR1B = _BV(WGM13) | _BV(CS11);//8 PRESCALER
  ICR1=250;//4000Hz
  //установить прерывание таймер0
  TCCR0A=0;
  TCCR0B=0;
  TCNT0=0; //инициализировать таймер0
  //OCR0A=12;
  //timer on,
  TCCR0A|=(1<<WGM01);   
  // установить бит для предварительного делителя
  //  TCCR0B |= (1<<CS00)|(1<<CS01);
  TCCR0B |= (1<<CS01);
  //Включить прерывания от таймера
  TIMSK0|=(1<<OCIE0A); 
  Serial.begin(115200);
lcd.begin(16,2);
//delay(1000);
lcd.setCursor(0,0);
lcd.print("freqency Hz");
//delayt(300);
  sei();
}
void loop(){
  //int sig=1;
  val = analogRead(analogPin);   // прочитать входной контакт
  val=val/4;
  if (val<33)//35 to 240Hz
  {val=35;
  }
  freq=8533/val;
  freq1=freq;
  if (digitalRead(8)!=1){
   freq1=freq *10;}
  if (digitalRead(2)!=1){   
for (int g=1;g<freq/18;g++){
  Serial.print(data/3+150);
  Serial.print(" ");
  Serial.print((sig)+100);
   Serial.print(" ");
Serial.println((sig/16)*10+75);
}
  sig=sig+1;
 // delay(2);
  if (sig>23)
  {sig=0;
  }
}
 else
 {
ICR1=250;  
lcd.setCursor(0,2);
lcd.print(freq1);
lcd.print("Hz");
   }
}
  void plot()
{ 
  //while (digitalRead(2)==1){
  cli();  
Serial.print(0);
  Serial.print(" ");
  //Serial.print(200);
  Serial.print(" ");
  Serial.print(data/3+300);
  Serial.print(" ");
Serial.print((sig)+150);
   Serial.print(" ");
Serial.println((sig/16)*10+50);  
  sig=sig+1;
  delay(2);
  if (sig>31)
  {sig=0;
  } 
sei();
}                                                                    
ISR(TIMER0_COMPA_vect){
//read data(n) 
   k=digitalRead(8);
   //digitalWrite(13,k);
 if (k==1)
 {
  OCR1A=data;  //sine
  OCR1B=n*8;//ramp wave
  if (data>=125)
  {   
  digitalWrite(3,HIGH);//square wave  
  }
  else
  {
    digitalWrite(3,LOW);//square wave
  }
   y=y+1;
  if ( y>10)
  {
    n=n+1;
    y=1;
   OCR1A=data;//pwm
   OCR1B=n*8;//ramp wave
  //digitalWrite(3,data);//square wave
   if (data>=125)
  {   
  digitalWrite(3,HIGH);//square wave  
  }
  else
  {
    digitalWrite(3,LOW);//square wave
  }
  }   
 }   
        else {
   OCR1A=data;
   OCR1B=n*8;//ramp wave
  digitalWrite(3,data);//square wave  
   n=n+1;
   }  
  //
   if (n>23) { 
   n=0; 
    OCR0A=val;   
}
}

Программа должна быть загружена в Ардуино с помощью программного обеспечения Arduino IDE. С USB-кабелем, подключенным между Arduino и ПК, значение частоты можно посмотреть на дисплее LCD1, а на последовательном плоттере в Arduino IDE посмотреть форму сигнала.

Переключатель S1, подключенный к контакту 2 платы Board1, используется для переключения отображения между LCD1 и последовательным плоттером в Arduino IDE. Если контакт 2 заземлен, осциллограммы (синусоидальный, квадратный и пилообразный сигнал) можно просматривать на последовательном плоттере, как на цифровом осциллографе:

Каждая форма сигнала имеет величину около 5 В. Таким образом, синусоидальная волна изменяется от 0 до 5 В и не переходит в отрицательную.

Подключения LCD1 выполняются на печатной плате с помощью 16-контактной гребенки. Резистор на 470 Ом (R1), подключенный к выводу 15, используется для подсветки LCD1. Питание для ЖК-дисплея берется с контактов 5В и Gnd платы Arduino.

USB-кабель используется для подключения Arduino к ПК или ноутбуку. После загрузки программы плату Arduino и LCD1 можно запитать от адаптера / аккумулятора напряжением 9 вольт.

Генератора прямоугольных импульсов — схема и работа

Принципиальная схема генератора прямоугольных импульсов показана на следующем рисунке:

В качестве устройства ввода используется матричная клавиатура 4 × 3. Четыре ряда (с RW1 по RW4) клавиатуры подключены к цифровым контактам 10, 11, 12 и 13 платы Arduino Uno. Три столбца (с CL1 по CL3) клавиатуры подключены к аналоговым входным контактам Arduino (с A0 по A2). Каждая колонка подключена к источнику питания 5 В через резистор сопротивлением 1 кОм (R1 — R3).

Arduino Uno — это плата разработки на базе микроконтроллера AVR ATmega328P (MCU) с шестью аналоговыми выводами и 14 цифровыми контактами ввода/вывода. Микроконтроллер имеет 32 КБ флэш-памяти ISP, 2 КБ ОЗУ и 1 КБ EEPROM. Плата обеспечивает последовательную связь через UART, SPI и I2C. Микроконтроллер может работать с тактовой частотой 16 МГц.

В нашем примере цифровые выводы Arduino 13, 12, 11, 10 и 9 сконфигурированы как выходные выводы. Контакты A0, A1 и A2 служат для аналоговых входов.

Программного обеспечения

Исходный код написан на языке программирования Arduino. Плата программируется с использованием программного обеспечения Arduino IDE.

Выберите плату Arduino Uno в меню Инструменты –> Плата в Arduino IDE и загрузите ниже приведенный скетч через стандартный порт USB на вашем компьютере:

int r1=10;
int r2=11;
int r3=12;
int r4=13;
int c1;
int c2;
int c3;
float x=0;int a;
float t,t1,t2,f,d,t3;
void setup()
{
 pinMode(r1,OUTPUT);
 pinMode(r2,OUTPUT);
 pinMode(r3,OUTPUT);
 pinMode(r4,OUTPUT);
 pinMode(9,OUTPUT);
 pinMode(0,INPUT);
 pinMode(1,INPUT);
 pinMode(2,INPUT);
 Serial.begin(9600);
}
void loop()
{
 digitalWrite(r1,LOW);
 digitalWrite(r2,HIGH);
 digitalWrite(r3,HIGH);
 digitalWrite(r4,HIGH);
 c1=analogRead(0);
 c2=analogRead(1);
 c3=analogRead(2);

 if(c1<600)
 {a=1;
 x=10*x+a;
 Serial.println(x);
 delay(500);}
 else
 {
 if(c2<600)
 {a=2;
 x=10*x+a;
 Serial.println(x);
 delay(500);}
 else
 {
 if(c3<600)
 {
 a=3;
 x=10*x+a;
 Serial.println(x);
 delay(500);}
 }}
 digitalWrite(r1,HIGH);
 digitalWrite(r2,LOW);
 digitalWrite(r3,HIGH);
 digitalWrite(r4,HIGH);
 c1=analogRead(0);
 c2=analogRead(1);
 c3=analogRead(2);
 if(c1<600)
 {a=4;
 x=10*x+a;
 Serial.println(x);
 delay(500);}
 else
 {
 if(c2<600)
 {a=5;
 x=10*x+a;
 Serial.println(x);
 delay(500);}
 else
 {
 if(c3<600)
 {a=6;
 x=10*x+a;
 Serial.println(x);
 delay(500);}
 }}
 digitalWrite(r1,HIGH);
 digitalWrite(r2,HIGH);
 digitalWrite(r3,LOW);
 digitalWrite(r4,HIGH);
 c1=analogRead(0);
 c2=analogRead(1);
 c3=analogRead(2);

 if(c1<600)
 {a=7;
 x=10*x+a;
 Serial.println(x);
 delay(500);}
 else
 {
 if(c2<600)
 {a=8;
 x=10*x+a;
 Serial.println(x);
 delay(500);}
 else
 {
 if(c3<600)
 {a=9;
 x=10*x+a;
 Serial.println(x);
 delay(500);}
 }}

 digitalWrite(r1,HIGH);
 digitalWrite(r2,HIGH);
 digitalWrite(r3,HIGH);
 digitalWrite(r4,LOW);
 c1=analogRead(0);
 c2=analogRead(1);
 c3=analogRead(2);
 if(c1<600)
 {f=x;
 x=0;
 Serial.println("enter duty cycle");
 delay(500);}
 else
 {
 if(c2<600)
 {a=0;
 x=10*x+a;
 Serial.println(x);
 delay(500);}
 else
 {
 if(c3<600)
 {
 d=x;
 t=(1/f);
 t1=t*1000000;
 t2=t1*(d/100);
 t3=t1-t2;
 Serial.print("frequency=");
 Serial.println(f);
 Serial.print("duty cycle=");
 Serial.println(d);
 x=0;
 while(1)
 {

 digitalWrite(9,1);
 delayMicroseconds(t2);
 digitalWrite(9,0);
 delayMicroseconds(t3);
 }
 delay(500);}
 }}
}

Функция Serial.begin (9600) инициализирует последовательный порт со скоростью 9600 бод. В этом проекте монитор последовательного порта Arduino IDE также отображает введенное значение частоты и рабочего цикла прямоугольных импульсов.

Примечание. Arduino необходимо перезагружать каждый раз, перед тем как устанавливается новая частота и рабочий цикл.

Схема работы проста. После загрузки кода в Arduino подключите клавиатуру, как показано на схеме. Включите питание и введите желаемое значение частоты с клавиатуры. Затем нажмите кнопку рабочего цикла S11 (см. схему) и введите желаемое значение рабочего цикла, нажимая цифровые клавиши (от S0 до S9). Наконец, нажмите клавишу Enter (S12).

Выходные прямоугольные импульсы будут на разъеме CON1, который подключен к цифровому выводу 9 Arduino Uno.

Тестер транзисторов / ESR-метр / генератор
Многофункциональный прибор для проверки транзисторов, диодов, тиристоров…

Подробнее

Что такое протокол I2C и как он работает

Термин IIC расшифровывается как “Inter Integrated Circuits” и часто обозначается как I2C или даже как TWI (2-wire interface protocol), но во всех случаях за этими обозначениями скрывается один и тот же протокол. I2C представляет собой протокол синхронной связи – это значит что оба устройства, которые обмениваются информацией с помощью данного протокола должны использовать общий сигнал синхронизации. Поскольку в этом протоколе используются всего 2 линии (провода), то по одной из них должен передаваться сигнал синхронизации, а по другой – полезная информация.

Впервые протокол I2C был предложен фирмой Phillips. Протокол в самом простом случае соединяет с помощью 2-х линий 2 устройства, одно из устройств должно быть ведущим, а другое – ведомым. Связь возможна только между ведущим и ведомым. Преимуществом протокола (интерфейса) I2C является то, что к одному ведущему можно подключить несколько ведомых.

Схема связи с помощью протокола I2C представлена на следующем рисунке.

Назначение линий данного интерфейса:

  • Serial Clock (SCL): по ней передается общий сигнал синхронизации, генерируемый ведущим устройством (master);
  • Serial Data (SDA): по ней осуществляется передача данных между ведущим и ведомым.

В любой момент времени только ведущий может инициировать процесс обмена данными. Поскольку в этом протоколе допускается несколько ведомых, то ведущий должен обращаться к ним, используя различные адреса. То есть только ведомый с заданным (указанным) адресом должен отвечать на сигнал ведущего, а все остальные ведомые в это время должны «хранить молчание». Таким образом, мы можем использовать одну и ту же шину (линию) для обмена данными с несколькими устройствами.

Уровни напряжений для передаваемых сигналов в интерфейсе I2C жестко не определены. В этом плане I2C является достаточно гибким, то есть если устройство запитывается от напряжения 5v, оно для связи с помощью протокола I2C может использовать уровень 5v, а если устройство запитывается от напряжения 3.3v, то оно для связи с помощью протокола I2C может использовать уровень 3v. Но что делать если с помощью данного протокола необходимо связать между собой устройства, работающие от различных питающих напряжений? В этом случае используются преобразователи/переключатели напряжения (voltage shifters).

Существует несколько условий для осуществления передачи данных в протоколе I2C. Инициализация передачи начинается с падения уровня на линии SDA, которое определяется как условие для начала передачи (‘START’ condition) на представленной ниже диаграмме. Как видно из этого рисунка, в то время как на линии SDA происходит падение уровня, в это же самое время на линии SCL ведущий поддерживает напряжение высокого уровня (high).

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

Аналогичным образом, повышение уровня на линии SDA останавливает передачу данных, что на представленной диаграмме обозначено как условие окончания передачи данных (‘STOP’ condition). В это же самое время ведущим на линии SCL поддерживается напряжение высокого уровня (high).

На следующем рисунке представлена структура адреса ведомого в протоколе I2C.

Бит R/W показывает направление передачи следующих за ним байт, если он установлен в HIGH – это значит что будет передавать ведомый (slave), а если он установлен в low – это значит что будет передавать ведущий (master).

Каждый бит передается в своем временном цикле, то есть нужно 8 временных циклов чтобы передать байт информации. После каждого переданного или принятого байта 9-й временной цикл используется для подтверждения/не подтверждения (ACK/NACK) приема информации. Этот бит подтверждения (ACK bit) формируется либо ведомым, либо ведущим в зависимости от ситуации. Для подтверждения приема информации (ACK) на линии SDA ведущим или ведомым устанавливается низкий уровень (low) в 9 временном цикле, в противном случае происходит не подтверждение приема информации (NACK).

На следующем рисунке представлена структура передаваемого сообщения в протоколе I2C.

Управление оборотами однофазного асинхронного двигателя с помощью Arduino

Для начала необходимо попытаться больше узнать про особенности двигателя. Они бывают разные и способы управления ими тоже разные.

Существует три способа регулирования частоты вращения асинхронного мотора:

  • изменением скольжения (только двигатели с фазным ротором);
  • изменением числа пар полюсов;
  • изменением частоты источника питания.

Частотник нужен для обеспечения нормального управления процессами, которые требуют регулирования. Пускатели (УПП, софт-стартеры) уменьшают ударные нагрузки от сетевого напряжения с помощью фазо-импульсного (ФИУ) способа подачи питания на электродвигатель. Словно диммер, они обеспечивают плавное нарастание тока потребления электродвигателя и препятствуют развитию КЗ в питающей сети при пуске.

После разгона двигателя от УПП, двигатель просто полностью переходит на питание от сети, так как УПП синхронизировано с сетью. Использовать ФИУ для полноценного управления электродвигателем не получится, лишь в отдельных случаях это может «прокатить».

Если ПЧ для вас дорогое удовольствие, то можно попробовать классический метод регулировки подачи воздуха – управление шиберной задвижкой от сервопривода. Здесь уже упор делается на механику. Собственно сам электродвигатель при таком способе всегда будет работать в номинале.

Распиновка LCD модуля 1602

Назначение выводов дисплея 1602

Вывод Обозначение Пин Arduino Uno
1- земля GND; GND GND
2-питание 5 В; VCC 5V
3-установка контрастности монитора; VO GND
4-команда, данные; RS 11
5-записывание и чтение данных; R/W GND
6-enable; E 12
7- линии данных; DB0
8- линии данных; DB1
9- линии данных; DB2
10- линии данных; DB3
11- линии данных; DB4 5
12- линии данных; DB5 4
13- линии данных; DB6 3
14- линии данных; DB7 2
15- плюс подсветки; VCC 5V
16- минус подсветки; GND GND

Основные технические характеристики дисплея 1602

  • наличие светодиодной подсветки;
  • контроллер HD44780;
  • напряжение питания 5 В;
  • размер дисплея 16х2 символов;
  • диапазон рабочей температуры от -20 С до +70 С;
  • угол обзора 180 градусов.

Редактирование файла boards.txt

Arduino_dir\hardware\arduino\avr\d:\Arduino\arduino-1.6.12\hardware\arduino\avr\.menu.clock=Тактирование

  1. скорость загрузки — uno.upload.speed;
  2. значения фьюзов — uno.bootloader.low_fuses, .high_fuses, .extended_fuses;
  3. имя файла загрузчика — uno.bootloader.file;
  4. частоту микроконтроллера — uno.build.f_cpu.

uno.menu.clock.external16=Внешний резонатор 16МГцuno.menu.clock.external16.upload.speed=115200uno.menu.clock.external16.bootloader.low_fuses=0xFFuno.menu.clock.external16.bootloader.high_fuses=0xDEuno.menu.clock.external16.bootloader.extended_fuses=0xFFuno.menu.clock.external16.bootloader.file=optiboot/optiboot_atmega328.hexuno.menu.clock.external16.build.f_cpu=16000000Luno.menu.clock.internal8=Внутренний RC-генератор 8МГцuno.menu.clock.internal8.upload.speed=57600uno.menu.clock.internal8.bootloader.low_fuses=0xE2uno.menu.clock.internal8.bootloader.high_fuses=0xDEuno.menu.clock.internal8.bootloader.extended_fuses=0xFFuno.menu.clock.internal8.bootloader.file=optiboot/optiboot_atmega328_8.hexuno.menu.clock.internal8.build.f_cpu=8000000Luno.menu.clock.internal1=Внутренний RC-генератор 1МГцuno.menu.clock.internal1.upload.speed=4800uno.menu.clock.internal1.bootloader.low_fuses=0x62uno.menu.clock.internal1.bootloader.high_fuses=0xDEuno.menu.clock.internal1.bootloader.extended_fuses=0xFFuno.menu.clock.internal1.bootloader.file=optiboot/optiboot_atmega328_1.hexuno.menu.clock.internal1.build.f_cpu=1000000L

онлайн калькулятораИнструменты->ТактированиеВнутренний RC-генератор 8МГцотсюдаArduino_dir\hardware\arduino\avr\bootloaders\optiboot\

Объяснение программы для Arduino

Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.

Сначала в программе объявим переменную, в которую будем записывать символы, которые мы в дальнейшем будем конвертировать в код Морзе.

Arduino

char stringToMorseCode[] = «»;

1 charstringToMorseCode=»»;

Затем объявим контакт 8, к которому подключен зуммер, и определим вид тона, который будет использоваться для сигнала, издаваемого зуммером. Более подробно об использовании различных тонов (pitches) можно прочитать в статье про проигрывание мелодий с помощью функции Tone() на Arduino. Также определим длительность тире и точки.

Arduino

int audio8 = 8; // output audio on pin 8
int note = 1200; // music note/pitch

int dotLen = 100; // length of the morse code ‘dot’
int dashLen = dotLen * 3; // length of the morse code ‘dash’

1
2
3
4
5

intaudio8=8;// output audio on pin 8

intnote=1200;// music note/pitch

intdotLen=100;// length of the morse code ‘dot’

intdashLen=dotLen*3;// length of the morse code ‘dash’

Затем в функции void loop(), если по последовательному порту поступают какие либо данные, мы будем сохранять их в символьном массиве indata. Мы будем записывать в этот массив символы поочередно (по одному), используя команду inData. После этого команда variable.toUppercase() используется для изменения символов нижнего регистра в соответствующие символы верхнего регистра (то есть из строчных букв делаются заглавные). Затем мы формируем звуки, соответствующие каждому из этих символов.

Arduino

void loop()
{
char inChar = 0;
char inData = «»; // data length of 6 characters
String variable = «»;
String variable1 = «»;
int index1 = 0;

if ( Serial.available() > 0 ) {
while (Serial.available() > 0 && index1 < 100)
{
delay(100);
inChar = Serial.read();
inData = inChar;
index1++;
inData = ‘\0’;
}
variable.toUpperCase();
for (byte i = 0 ; i < 100 ; i++) {
variable.concat(String(inData));
}
delay(20);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

voidloop()

{

charinChar=;

charinData100=»»;// data length of 6 characters

Stringvariable=»»;

Stringvariable1=»»;

intindex1=;

if(Serial.available()>){

while(Serial.available()>&&index1<100)

{

delay(100);

inChar=Serial.read();

inDataindex1=inChar;

index1++;

inDataindex1=’\0′;

}

variable.toUpperCase();

for(bytei=;i<100;i++){

variable.concat(String(inDatai));

}

delay(20);

Далее функции MorseDot и MorseDash используются для формирования звука точки и тире соответственно.

Arduino

void MorseDot()
{
tone(audio8, note, dotLen); // start playing a tone
delay(dotLen); // hold in this position
}

void MorseDash()
{
tone(audio8, note, dashLen); // start playing a tone
delay(dashLen); // hold in this position
}

1
2
3
4
5
6
7
8
9
10
11

voidMorseDot()

{

tone(audio8,note,dotLen);// start playing a tone

delay(dotLen);// hold in this position

}
 

voidMorseDash()

{

tone(audio8,note,dashLen);// start playing a tone

delay(dashLen);// hold in this position

}

Затем функция GetChar используется для формирования соответствующего кода для всех символов алфавита – именно ее вы должны изменить если хотите переделать эту программу для генерации кода Морзе для русского алфавита. В результате каждый символ будет представлен последовательностью звуков, соответствующих его коду Морзе.

Arduino

void GetChar(char tmpChar)
{
switch (tmpChar) {
case ‘a’:
MorseDot();
delay(100);
MorseDash();
delay(100);
break;



default:
break;
}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

voidGetChar(chartmpChar)

{

switch(tmpChar){

case’a’

MorseDot();

delay(100);

MorseDash();

delay(100);

break;



default

break;

}

}

После того, как вы загрузите программу в плату Arduino, вы можете начинать печатать символы в окне монитора последовательной связи (не более 6 — ограничение в программе). Чтобы передать напечатанную последовательность символов в плату Arduino, нажмите “Ввод” на клавиатуре. Мы для примера напечатали символы ‘SOS’ (сигнал бедствия) – результат работы проекта вы можете посмотреть в видео, приведенном в конце статьи.

Микросхема (модуль) Si5351

Микросхема Si5351 это конфигурируемый через I2C генератор тактовых частот, идеально подходящий для замены кварцев, кварцевых генераторов, генераторов VCXO (voltage-controlled crystal oscillator – кварцевый генератор, управляемый напряжением), синтезаторов с ФАПЧ (PLL), буферов развязки в приложениях, критичных к общей стоимости. Базируясь на архитектуре PLL/VCXO + high resolution MultiSynth fractional divider, Si5351 может генерировать любую частоту до 200 МГц на каждом из выходов с нулевым отклонением от заданного значения (0 ppm error). Для удовлетворения различным требованиям приложений Si5351 выпускается в 3 версиях. Si5351A генерирует до 8 не зависящих друг от друга тактовых сигналов, используя внутренний генератор, что позволяет заменить несколько кварцев или кварцевых генераторов. В Si5351B добавлен внутренний VCXO, что дает возможность заменить как свободно (независимо друг от друга), так и синхронно генерируемые тактовые частоты. Это устраняет необходимость применения дорогих специальных кварцев, предоставляя при этом высокую надежность работы в широком диапазоне настраиваемых частот. Si5351C предоставляет такую же гибкость, но синхронизируется при этом с внешним опорным генератором (CLKIN).

Узнать более подробную информацию о микросхеме Si5351 и ее подключение к плате Arduino вы можете на сайте ее разработчика. Также принципы ее работы неплохо описаны на сайте microsin.net.

Step 3: Future Developments

Could it be battery powered? Yes, just add a 9V PP3 connected to the RAW pin of the Nano. It typically uses 20mA.

Could it be powered by a single lithium cell? I don’t see why not. You should connect the OLED Vdd and its pull-up resistor to the 3.7V battery (I doubt if the 3.3V output of the Arduino would work properly).

A sweep generator is more useful when testing the frequency response of a filter if you can graph amplitude vs frequency. Measuring the amplitude of a signal is tricky — you have to trade off the decay of your envelope detector vs ripple for low frequencies and response time for high frequencies. Having built your amplitude detector, you could feed its output into the ADC of the Arduino of the «Simplest Signal Generator» then send the result, along with the current frequency to the PC.