/*
Forum: https://forum.arduino.cc/t/frequency-multiplication-by-x1-2/1208037
Wokwi: https://wokwi.com/projects/386371065171313665
*/
#include <TimerOne.h>
#include <TimerThree.h>
constexpr byte inT1 {2};
constexpr byte outT1 {4};
constexpr byte inT3 {3};
constexpr byte outT3 {12};
constexpr byte inputPin {A0};
volatile unsigned long countT1 = 0;
volatile unsigned long countT3 = 0;
void setup() {
Serial.begin(115200);
pinMode(outT1, OUTPUT);
pinMode(outT3, OUTPUT);
pinMode(inT1, INPUT_PULLUP);
pinMode(inT3, INPUT_PULLUP);
Timer1.initialize(10000);
Timer1.attachInterrupt(createPulseT1);
Timer3.initialize(10000);
Timer3.attachInterrupt(createPulseT3);
attachInterrupt(digitalPinToInterrupt(inT1), countPulsesT1, CHANGE);
attachInterrupt(digitalPinToInterrupt(inT3), countPulsesT3, CHANGE);
}
int oldInp = -1;
unsigned long t1Interval;
unsigned long oldDuration = -1;
unsigned long lastTime = 0;
const unsigned long countInterval = 100; // [ms]
constexpr unsigned long timeConst = countInterval * 1000UL;
void loop() {
int inp = analogRead(inputPin);
if (inp != oldInp){
oldInp = inp;
t1Interval = map(inp,0,1023,50, 5000);
Timer1.initialize(t1Interval);
}
if (millis()-lastTime >= countInterval){
lastTime = millis();
noInterrupts();
unsigned long cT1 = countT1;
countT1 = 0;
unsigned long cT3 = countT3;
countT3 = 0;
interrupts();
Serial.print(cT1);
Serial.print("\t");
Serial.println(cT3);
Timer3.initialize(timeConst/(cT1*1.2));
}
}
void createPulseT1() {
static byte pulseValue = HIGH;
pulseValue = !pulseValue;
digitalWrite(outT1, pulseValue);
}
void createPulseT3() {
static byte pulseValue = HIGH;
pulseValue = !pulseValue;
digitalWrite(outT3, pulseValue);
}
void countPulsesT1(){
countT1++;
}
void countPulsesT3(){
countT3++;
}