Найти в Дзене
Ой, Всё!

Генератор с возможностью регулировки частоты и скважности за 100 руб

Был момент, мне как то понадобился генератор.
Да ещё и со специфическими требованиями.
Основной импульс с регулируемой частотой и скважностью
+ пачка импульсов запускаемая по синхроимпульсу
(можно от основного импульса)
Пачка — с регулируемым количеством, скважностью и задержкой от основного импульса.

Полный размер
Полный размер
Полный размер
Полный размер Полный размер Полный размер

На днях подумал, что мало ли, может кому-то пригодится…
такие специфические требования навряд ли у кого то будут,
а вот простой генератор с возможностью регулировки частоты и скважности может кому-то и пригодится.
Вырезал из кода все прибамбасы касаемые генерации пачки по синхроимпульсу и решил выложить сюда.
Информация о режиме, частоте и скважности выводится в терминал.

Полный размер
Полный размер

Скетч и необходимые для работы библиотеки внизу страницы
-------------------
#include "CyberLib.h"
#include <pwm.h> // PWM должно быть заглавными буквами.

bool p1, p2, p3;
int pwm = 9; // the pin that the pwm out
int32_t f=100; //стартовая частота
int duty=128; //стартовая скважность

bool success;

int mode=1;
// 1 — частота ШИМ
// 2 — ширина ШИМ
// 3 — Сохранение настроек
// 4 — Загрузка настроек

void setup()
{
Serial.begin(115200);
Serial.println("Init device");
Serial.println("mode: PWM Frequency HZ");
InitTimersSafe();
bool success = SetPinFrequencySafe(pwm, f);

D9_Out; //Настраиваем пин D9 на выход

// пины кнопок
D4_In; //Настраиваем пин D4 на вход
D5_In; //Настраиваем пин D5 на вход
D6_In; //Настраиваем пин D6 на вход

D4_High;
D5_High;
D6_High;

}

void loop()
{
label:
p3=D4_Read;
p2=D5_Read;
p1=D6_Read;

if (p1==LOW && p2==HIGH && p3==HIGH) //при нажатии кнопки 2 + кнопки 3
{
mode++;
if (mode>5)
{
mode=1;
}
switch (mode)
{
case 1:
Serial.println("mode: PWM Frequency HZ"); // Частота сигнала
break;

case 2:
Serial.println("mode: PWM Duty %"); // Ширина импульса
break;

case 3:
Serial.println("mode: Save Data"); // Сохранение параметров
break;

case 4:
Serial.println("mode: Load Data"); // загрузка параметров
break;

// default:
}
delay_ms(300);
}

if (p3==LOW && p2==HIGH && p1==HIGH) //при нажатии кнопки 1 + кнопки 2
{
switch (mode)
{
case 1: // если режим 1 (регулировка частоты), то прибавляем частоту
f++;
success = SetPinFrequencySafe(pwm, f);
pwmWrite(pwm, duty);
Serial.println(f);
break;

case 2: // если режим 2 (регулировка скважности), то прибавляем сважность
duty++;
if (duty>255) duty=255;
success = SetPinFrequencySafe(pwm, f);
pwmWrite(pwm, duty);
Serial.println(duty);
break;

case 3:
WriteEEPROM_Long(0, f);
WriteEEPROM_Byte(10, duty);
Serial.println("Data saved!");
break;

case 4:
f = ReadEEPROM_Long(0);
duty = ReadEEPROM_Byte(10);
success = SetPinFrequencySafe(pwm, f);
pwmWrite(pwm, duty);

Serial.println("Data loaded!");

break;
}
delay_ms(100);

}

if (p2==LOW && p1==HIGH && p3==HIGH) //при нажатии кнопки 1 + кнопки 3
{
switch (mode)
{
case 1: // если режим 1 (регулировка частоты), то отнимаем частоту
f--;
if (f<50)f=50;
success = SetPinFrequencySafe(pwm, f);
pwmWrite(pwm, duty);
Serial.println(f);
break;

case 2: // если режим 1 (регулировка скважности), то отнимаем скважность
duty--;
if (duty<0) duty=0;
success = SetPinFrequencySafe(pwm, f);
pwmWrite(pwm, duty);
Serial.println(duty);
break;

case 3:
WriteEEPROM_Long(0, f);
WriteEEPROM_Byte(10, duty);
Serial.println("Data saved!");
break;

case 4:
f = ReadEEPROM_Long(0);
duty = ReadEEPROM_Byte(10);
success = SetPinFrequencySafe(pwm, f);

pwmWrite(pwm, duty);
Serial.println("Data loaded!");
break;

}
delay_ms(100);
}

if (p3==LOW && p2==HIGH && p1==LOW && mode==1) //при нажатии кнопки 2 в режиме регулировки частоты
{
f=f+100; // Прибавляем частоту +100 гц
success = SetPinFrequencySafe(pwm, f);
pwmWrite(pwm, duty);
Serial.println(f);
delay_ms(100);
}
if (p2==LOW && p1==HIGH && p3==LOW && mode==1) //при нажатии кнопки 1 в режиме регулировки частоты
{
f=f-100; // Отнимаем частоту +100 гц
if (f<50)f=50;
success = SetPinFrequencySafe(pwm, f);
pwmWrite(pwm, duty);
Serial.println(f);
delay_ms(100);
}

goto label; //безусловный переход происходит быстрее, чем команда return;
}
------------------------
Скетч
CyberLib
PWM