/*
ADC-ohjattu pulssigeneraattori (Arduino Uno)
---------------------------------------------
- Lukee jännitteen analogisesta pinnistä A0
- Jos ADC-lukema on YLI kynnyksen → ulostulo on aina LOW (ei pulssia)
- Jos ADC-lukema on ALLE kynnyksen → generoidaan pulssi
* Pulssin taajuus kasvaa, kun ADC-lukema pienenee
* Duty cycle on aina 50 %
Säätöparametrit:
- threshold: määrittää kohdan, jossa pulssi alkaa
- minPeriod: suurin (hitain) pulssijakso mikrosekunteina
- maxPeriod: pienin (nopein) pulssijakso mikrosekunteina
*/
const int adcPin = A0; // ADC0 (analog input)
const int outPin = 9; // Pulssiulostulo (digital output)
const int threshold = 512; // Kynnysarvo (0–1023)
const unsigned long minPeriod = 200; // µs, nopein pulssi (ADC=0)
const unsigned long maxPeriod = 2000; // µs, hitain pulssi (ADC=threshold)
unsigned long prevMicros = 0; // Ajanseuranta pulssin vaihtoon
unsigned long halfPeriod = 500;
bool state = false; // Pulssin tila (HIGH/LOW)
void setup() {
pinMode(outPin, OUTPUT);
digitalWrite(outPin, LOW);
}
void loop() {
int adcVal = analogRead(adcPin); // Lue analoginen arvo (0–1023)
// --- Kynnyslogiikka ---
// Jos mitattu arvo on suurempi kuin threshold:
// → tulkitaan, että signaali on "liian korkea", eli pulssi EI ole aktiivinen.
// → tällöin ulostulo pidetään pysyvästi LOW-tilassa.
if (adcVal > threshold) {
state = LOW;
digitalWrite(outPin, LOW);
return; // Hypätään suoraan takaisin loopin alkuun
}
// --- Pulssin nopeus ---
// Jos ollaan kynnyksen ALAPUOLELLA:
// → lasketaan periodi lineaarisesti ADC-arvosta.
// Kun ADC pienenee (lähemmäs 0), pulssi nopeutuu.
unsigned long period = map(adcVal, 0, threshold, minPeriod, maxPeriod);
halfPeriod = period / 2; // 50 % duty cycle
// --- Aikaperusteinen pulssinvaihto ---
unsigned long now = micros();
if (now - prevMicros >= halfPeriod) {
prevMicros = now;
state = !state; // Vaihda tila HIGH ↔ LOW
digitalWrite(outPin, state); // Kirjoita ulostuloon
}
}