Такой генератор реализован в железе. Хотелось бы общими усилиями разработать к нему программное обеспечение.
GSP:
/* ИСПОЛЬЗУЕМЫЕ ПИНЫ *
LCD 0802A - rs = 6, en =7, d4 = 8, d5 = 9, d6 = 10, d7 = 11;
ZUM - 13
FREQ_INPUT - 5
I2C -A4, A5
*/
volatile unsigned int Data_ina219 = 0;
volatile float Voltage_ina219 = 0;
volatile unsigned long old_millis = 0;
volatile unsigned int dfreq = 0;
#include <LiquidCrystal.h>
const int rs = 6, en = 7, d4 = 8, d5 = 9, d6 = 10, d7 = 11;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
#include <Wire.h>
#include "ina219.h"
#include <Adafruit_MCP4725.h>
#define PIN_ZUM 13
#define pinINT1 3
#define zFreq 2
Adafruit_MCP4725 dac;
INA219 monitor;
/*******************ПИЩАЛКА ********************/
void start_Buzzer() {
pinMode(PIN_ZUM, OUTPUT);
attachInterrupt(1, Buzzer, RISING );
analogWrite(pinINT1, 0x80);
}
void end_Buzzer() {
detachInterrupt(1);
digitalWrite(PIN_ZUM, LOW);
}
void Buzzer(void) {
static int i = 490 / zFreq;
if (!i--)
{
digitalWrite(PIN_ZUM, ! digitalRead(PIN_ZUM));
i = 490 / zFreq;
}
}
/*************** Ч А С Т О Т О М Е Р **********************/
volatile unsigned int int_tic = 0;
float freq_tic = 0;
volatile unsigned long tic;
ISR (TIMER1_OVF_vect) {
int_tic++;
}
void freq_meter() {
pinMode (5, INPUT); // вход сигнала T1 (only для atmega328)
TCCR1B = (1 << CS10) | (1 << CS11) | (1 << CS12); //тактирование от входа Т1
delay(1000);
TCCR1B = 0; // Остановить счетчик
tic = ((uint32_t)int_tic << 16) | TCNT1; //сложить что натикало
int_tic = 0; TCNT1 = 0;
freq_tic = (float) tic / 1000.0;
}
/**************** ВЫВОД НА LCD Дисплей ****************/
void lcdDisplay(){
lcd.setCursor(0, 0);
lcd.print(" ");
lcd.setCursor(0, 0);
lcd.print("I=");
lcd.print(Data_ina219);
lcd.print("ma");
lcd.setCursor(0, 1);
lcd.print(freq_tic,1);
lcd.print("kHz");
}
void lcdDisplay1(){
lcd.setCursor(0, 0);
lcd.print(" ");
lcd.setCursor(1, 0);
lcd.print("V=");
lcd.print(Voltage_ina219,1);
lcd.print("v");
lcd.setCursor(0, 1);
lcd.print(freq_tic,1);
lcd.print("kHz");
}
void setup() {
Serial.begin(115200);
pinMode(PIN_ZUM, OUTPUT);
TCCR1A = 0; TIMSK1 = 1 << TOIE1; // прерывание по переполнению
//pinMode (5,INPUT); // вход сигнала T1 (only для atmega328)
freq_meter();
lcd.begin(8, 2);
delay(100);
lcd.cursor();
lcd.cursor();
lcd.setCursor(0, 0);
lcd.print("GSP-V5.0");
lcd.setCursor(0, 1);
lcd.print(freq_tic, 1);
lcd.print("kHz");
monitor.begin(0x44); // i2c address
monitor.configure(0, 2, 12, 12, 7); // 16S - 8.51ms
monitor.calibrate(0.100, 0.32, 16, 3.2);
dac.begin(0x62);
dac.setVoltage(dfreq, true);
}
void loop() {
freq_meter();
}
Изменено: