Stap 1: Detectie van signaal helling
Het belangrijke deel van de code is hieronder opgenomen. Alle deze code plaatsvindt in de ADC onderbreken (interrupts en loopt elke keer een nieuwe analoge waarde is van A0, meer info over welke interrupts klaar zijn en waarom we gebruik maken van hen kunnen hier worden gevonden)
prevData = newData; //store vorige waarde
newData = ADCH; //get waarde van A0
Als (newData > prevData) {//if positieve helling
PORTB | B00010000; = //set pin 12 hoog
}
anders als (newData < prevData) {als negatieve helling
PORTB & B11101111; = //set pin 12 laag
}
Ik moet hier opmerken dat in dit leerprogramma gebruik ik directe manipulatie van de poort om te zetten uit en weer in de uitvoer-pin (pin 12) van de Arduino. Ik deed dit omdat poort manipulatie een veel snellere manier is van het aanpakken van de Arduino pinnen dan de opdracht digitalWrite(). Omdat ik zetten alle de bovenstaande code binnen een interrupt routine die ging moest af op 38,5 kHz, nodig ik de code zo efficiënt mogelijk. U kunt lees meer over poort manipulatie op de Arduino website, of Zie de commentaren die ik hierboven geschreven heb om te begrijpen wat elke lijn doet. U zult ook zien in de onderstaande code die ik sommige onbekende opdrachten in de Setup-functie gebruikt zodat ik van de analoge ingang van de Arduino te monster op een hoge frequentie krijgen kon. Meer info daarover kan worden gevonden in mijn tutorial Arduino Audio-ingang.
Fig 1 toont de output van de pols in blauw en de sinusgolf in geel op een oscilloscoop. Merk op hoe de pulse uitgang knevels elk moment de sinusgolf bereikt een maximum of minimum. Fig. 2 toont de pulse uitgang in het blauw voor een willekeurige waveshape in geel. U ziet hier hoe pulse wave neemt op een onregelmatige taakcyclus omdat het binnenkomende signaal (geel) veel ingewikkelder dan een sinusgolf is.
//Detection of signal slope with 38.5kHz sampling rate and interrupts //by Amanda Ghassaei