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

Генератор прямоугольных импульсов в своей основе использует библиотеку TimerOne, возможности библиотеки позволяют генерировать сигнал ШИМ на выводе 9 в диапазоне от 1 мкс до 8,3 сек, в частности в генераторе диапазон ограничен до 200 мс (5 Гц), при желании диапазон можно увеличить до 8,3 сек. Так можно регулировать скважность от 0 до 1023 единиц (10-бит), что соответствует 0 и 100%.

В генераторе импульсов имеется возможность регулировки периода следования импульсов при помощи кнопок подключенных к цифровым входам 6 и 7 Arduino. 13 вход позволяет регулировать скважность (коэффициент заполнения). Возможно кнопочное управление не самое разумное решение, но на данный момент реализована только такая функция.

Для удобства показания длительности и скважности выведены на первый ряд индикатора LCD 16×2, во втором ряду выведены показания частоты. Важно помнить что минимальный шаг регулировки периода следования импульсов 1 мкс, поэтому частота будет меняться дискретно, например 1 мкс это 1 МГц, 2 мкс — 500 кГц, 3 мкс это 333,333 Гц и так далее, по мере уменьшения частоты увеличивается плавность ее регулировки.

//  rcl-radio.ru
//  Генератор прямоугольных имульсов, период следования импульсов от 1 мкс до 200 мс (1 МГц...5 Гц)
#include <TimerOne.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);// RS,E,D4,D5,D6,D7
unsigned long t=1000,f,k=512;// по умолчанию 1000 мкс (1000 Гц), меандр, длительность имульса равна скважности k=512 (50%)
byte k1,kn,kn1,kn2;
int drive,drive0;

void setup()
{ 
  lcd.begin(16, 2);// LCD 16X2
  pinMode(10, OUTPUT);
  pinMode(6,INPUT);// кнопка на входе 6
  pinMode(7,INPUT);// кнопка на входе 7
  pinMode(13,INPUT);// кнопка на входе 13
}
void loop()
{
  Timer1.initialize(t); // период    
  Timer1.pwm(9, k); // k - коэффициент заполнения 0-1023. Сигнал снимаем с выхода 9
  kn=digitalRead(6); // кнопка вход 6 (- период импульса)
  kn1=digitalRead(7);// кнопка вход 7 (+ период импульса)
  kn2=digitalRead(13);// кнопка вход 13 (+ по кругу коэффициент заполнения)

  if(kn==HIGH){ // убавление периода
    drive++;
    if(drive<30){ 
      t=t-1;  
    }
    // если долго держат кнопку происходит ускорение коррекции периода импульса х10 х100 х1000
    else if(drive>30 && drive<60 ){ 
      t=t-10; 
    }
    else if(drive>=60 && drive<100){
      t=t-100;
    }
    else if(drive>=100){
      t=t-1000;
    }
  }
  else{
    drive=0;
  }

  if(kn1==HIGH){// добавление периода
    drive0++;
    if(drive0<30){
      t=t+1; 
      // если долго держат кнопку происходит ускорение коррекции периода х10 х100 х1000
    }
    else if(drive0>30 && drive0<60 ){ 
      t=t+10; 
    }
    else if(drive0>=60 && drive0<100){
      t=t+100;
    }
    else if(drive0>=100){
      t=t+1000;
    }
  } 
  else{
    drive0=0;
  }
  if(t==0 || t>300000){ // ограничение длительности импульса по минимому, если 0 мкс или больше 300 мс (3,33 Гц), то период равен 1 мкс
    t=1;
  }
  if(t>200000 && t<300000){ // ограничение длительности импульса по максимому, если больше 200 мс, но меньше 300 мс (3,33 Гц), то период равен 200 мс (5 Гц)
    t=200000;
  } 
  f=1000000/t; // расчет частоты
  k1=k*100/1024; // расчет % коэффициента заполнения

  if(kn2==HIGH){// кнопка регулировки коэффициента заполнения (по кругу от 50 до 100%, далее от 0 до 100%)
    k=k+16;// шаг 16 из 1024 (можно сделать 8 для более плавной регулировки)
  }
  if(k==1024){
    k=0;
  }
// вывод информации на индикатор
  lcd.setCursor(0,0); 
  lcd.print("T=");
  lcd.print(t);
  lcd.print(" us");
  lcd.setCursor(12,0);
  lcd.print(k1);
  lcd.print(" %");
  lcd.setCursor(0,1); 
  lcd.print("F=");
  lcd.print(f);
  lcd.print(" Hz");
  delay(300);
  lcd.setCursor(0,0); 
  lcd.print("                ");
  lcd.setCursor(0,1); 
  lcd.print("                ");
}

Генератор нуждается в доработке, поэтому со временем поменяются органы регулировки, добавятся новые функции.

 

Добавить комментарий

Войти с помощью: