14ビットのADコンバータ1つと、AMUX4(4チャンネルアナログマルチプレクサ)を組み合わせると複数のピンからAD変換が使える。
というかPSoC Designer4.xでADCINC12を使っていた頃は、ADCINC12を複数置くことができたのにPSoC Designer5.0では1つしか配置できなくて困った。
でもよく考えたらマルチプレクサ使う方が自然だな。


アナログブロックの接続
マルチプレクサを切り替えるとPort0の0,2,4,6番ピンに接続できる
cfab931ebc6fd7a15179e8377e1a847c


ピン配置
右上のADC以外は関係ない
e9c55cbf49c94421f1ef6f24400f6531


PGAの設定
1.0倍で、AMUXがあるアナログマルチプレクサ1に接続する。
e838b8bcea333aaa21f7249301632629


ADCINCの設定
Negative Inputのソースは一応指定するが、GainをDisconnectedにすると使わないようにできる。
5f959013ed6c5d34154921a08c1cf097


AMUX4の設定
Interconnect Viewには表示されないけど、配置はされてる。アナログマルチプレクサ1として設定する。
ff18fb9db0458d481244adfc38113cfb


AMUX4の他にも8もあるので、まあたくさん増やせる。


UARTのTX8で、14bitADCINCの値を送る。
TX8だけを使う設定は橋本商会 ≫ PSoC – TX8モジュールに書いた

void wait(int n){
    while(n--);
}

// AMUX4_PORT0_0 => 0x00
// AMUX4_PORT0_2 => 0x01
// AMUX4_PORT0_4 => 0x02
// AMUX4_PORT0_6 => 0x03
int get_adc(BYTE amux_channel){
    AMUX4_InputSelect(amux_channel);
    wait(10);
    ADCINC_GetSamples(0);
    while(!ADCINC_fIsDataAvailable());
    return ADCINC_iClearFlagGetData();
}

int ad;
BYTE ad_pin;
char buf[6];

void main(void){
    M8C_EnableGInt;
    AMUX4_Start();
    PGA_1_Start(PGA_1_HIGHPOWER);
    ADCINC_Start(ADCINC_HIGHPOWER);
    TX8_Start(TX8_PARITY_NONE);

    for(;;){
        for(ad_pin = 0; ad_pin < 4; ad_pin++){
            ad = get_adc(ad_pin);
            TX8_PutChar(ad_pin+'0');
            TX8_CPutString(":");
            TX8_PutString(intToStr(ad,buf));
            TX8_PutCRLF();
        }
    }
}
AMUX4を切り替えた直後にAD変換を開始するのがなんとなく嫌だった(物理的に回路が切り替わっているわけだし)ので、一瞬waitを入れてからAD変換するようにした。



string.hのitoa関数がおかしいので代わりを作った
// intの桁数を返す
char getDigit(int n){
    char i;
    i = 0;
    while(n>0){
        n /= 10;
        i++;
    }
    return i;
}

// int->String変換
// char buf[6]
char *intToStr(int n, char *buf){ // 変換する数、作業領域
    int i, digit;
    digit = getDigit(n); // 桁数
    for(i = digit-1; i >= 0; i--){ // intは最大5桁
        buf[i] = n%10+'0';
        n /= 10;
    }
    buf[digit] = '\0'; // 行末
    return buf;
}