7月 282010
14ビットのADコンバータ1つと、AMUX4(4チャンネルアナログマルチプレクサ)を組み合わせると複数のピンからAD変換が使える。
というかPSoC Designer4.xでADCINC12を使っていた頃は、ADCINC12を複数置くことができたのにPSoC Designer5.0では1つしか配置できなくて困った。
でもよく考えたらマルチプレクサ使う方が自然だな。
アナログブロックの接続
マルチプレクサを切り替えるとPort0の0,2,4,6番ピンに接続できる
ピン配置
右上のADC以外は関係ない
PGAの設定
1.0倍で、AMUXがあるアナログマルチプレクサ1に接続する。
ADCINCの設定
Negative Inputのソースは一応指定するが、GainをDisconnectedにすると使わないようにできる。
AMUX4の設定
Interconnect Viewには表示されないけど、配置はされてる。アナログマルチプレクサ1として設定する。
AMUX4の他にも8もあるので、まあたくさん増やせる。
UARTのTX8で、14bitADCINCの値を送る。
TX8だけを使う設定は橋本商会 ≫ PSoC – TX8モジュールに書いた
void wait(int n){AMUX4を切り替えた直後にAD変換を開始するのがなんとなく嫌だった(物理的に回路が切り替わっているわけだし)ので、一瞬waitを入れてからAD変換するようにした。
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();
}
}
}
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;
}