footstep detector / 中間電位からノイズを除去するための処理 / 実際に試してみる

平均値と素のAD変換値のどちらをシリアルから出力するかをタクトスイッチで切り換えられるようにした。Adruino IDEのシリアルプロッターで観測する。
f:id:ti-nspire:20191023135316p:plain:h250

#include <avr/io.h>
#include <util/delay.h>
extern "C"{
    #include "USART.h"
}

void initADC(){
    ADMUX  |= (1 << REFS0);                               // AVCCを基準電圧として使う。
    ADCSRA |= (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); // ADCプリスケーラーを128分周に設定する。
    ADCSRA |= (1 << ADEN);                                // ADCを有効化する。
}

uint16_t readADC(char ch){
    ADMUX  |= (0xF0 & ADMUX) | ch;         // チャンネル選択ビットを全部一旦クリアしてから目的のチャンネルをセットする。
    ADCSRA |= (1 << ADSC);                 // ADCを開始(Start Conversion)する。
    loop_until_bit_is_clear(ADCSRA, ADSC); // ADCの終わるまで待ってから、
    return ADC;                            // 10ビットのADC値を返す。
}

int main(){
    //DDRD &= ~(1 <<PD2);  // スイッチを接続するPD2のIOをINにする。INがデフォルトなのでクリア不要。
    PORTD |= (1 << PD2); // スイッチを接続するPD2を内部プルアップする。
  
    uint16_t midVal = 511; // 假の平均値
    uint16_t adcVal;

    initADC();
    initUSART();

    while(1){
        adcVal = readADC(PC2);

        if(bit_is_clear(PIND, PD2)){ // スイッチを押しているときは平均値を出力する。
            midVal = adcVal + midVal - ((midVal - 8) >> 4);

            printWord(midVal >> 4);  // 最後の最後に16で割る。
            printString("\r\n");
        }
        else{                        // スイッチを押していないときはAD変換値を出力する。
            printWord(adcVal);
            printString("\r\n");
        }

        _delay_us(10);
    }
    
    return 0;
}