Stap 2: Midden punt detectie
De belangrijke wijzigingen in de code zijn hieronder weergegeven. Aangezien ik ben het meten van het inkomende signaal van A0 met 8 bits precisie (0-255), zal het middelpunt (2.5V) geven een waarde van 127. Alle volgende code plaatsvindt in de ADC-interrupt (onderbreken telkens wanneer een nieuwe analoge waarde klaar van A0 is)
prevData = newData; //store vorige waarde
newData = ADCH; //get waarde van A0
Als (prevData < 127 & & newData > = 127) {//if verhogen en Overstekende middelpunt
PORTB | B00010000; = //set pin 12 hoog
}
anders als (prevData > 127 & & newData < = 127) {//if minderen en Overstekende middelpunt
PORTB & B11101111; = //set pin 12 laag
}
Fig 1 toont de pulse uitgang in blauw en het inkomende signaal tot A0 in geel. Bericht hoe telkens het signaal doorkruist 2.5V, de pulse uitgang knevels. De output gaat in het bijzonder hoog wanneer het signaal 2.5V met een positieve helling doorkruist en het signaal laag gaat wanneer het signaal 2.5V met een negatieve helling kruist. Fig. 2 toont de output van de pols in blauw en het audiosignaal voordat er + 2.5V DC-offset in geel. Vergeet niet, deze DC-offset was nodig om het audiosignaal in het bereik 0-5V voor de analoge input pin van de Arduino, maar normaal audiosignaal oscilleren rond 0V. In Fig. 2 ziet u hoe de pols uitgangen knevel komt overeen met de tijd wanneer het audiosignaal 0V kruist. Fig 3 toont een willekeurige golfvorm in geel (weer voor DC-offset) en de pulse uitgang in het blauw. Nogmaals, de pols schakelt u telkens het geel signaal kruist 0V, bericht hoe het gedrag van de pulse uitgang met de willekeurige golfvorm complexer dan met de sinus is.
//Detection of midpoint crossing with 38.5kHz sampling rate and interrupts //by Amanda Ghassaei