秋月電子通商で購入した、12ビット精度の8chのADコンバータ [MCP3208]を使用してみました。
現時点(2007年6月)で、400円で購入できます。
下図は、機能ブロック図です。このICの制御は3線式なのでとてもシンプルな構成です。
【特徴】
【用途】
特に難しい箇所はありません。
PICとMCP3208を4本(CLK、Dout、Din、CS)で接続し、タイミングチャートに従って制御するだけです。
そのAD変換したデータを文字列に変換してRS232CでPCへ送信します。
MCP3208の制御部分(Read部分)は関数化しました。
//********************************************************************** #define MCP3208_CS PORTA.F0 // output #define MCP3208_CLK PORTA.F1 // output #define MCP3208_DIN PORTA.F4 // output #define MCP3208_DOUT PORTA.F5 // input //********************************************************************** void Usart_Write_String(char *buf) { static int len, i; len = strlen(buf); for (i = 0; i < len; i++) { Usart_Write(buf[i]); } } //********************************************************************** unsigned int Adc_Read_mcp3208(unsigned char ch) { unsigned char cnt; unsigned int data; // MCP3208_CS = 0; // MCP3208_DIN = 1; // start MCP3208_CLK = 1; asm nop; MCP3208_CLK = 0; // MCP3208_DIN = 1; // single MCP3208_CLK = 1; asm nop; MCP3208_CLK = 0; // MCP3208_DIN = (ch >> 2) & 0x01; // D2 MCP3208_CLK = 1; asm nop; MCP3208_CLK = 0; // MCP3208_DIN = (ch >> 1) & 0x01; // D1 MCP3208_CLK = 1; asm nop; MCP3208_CLK = 0; // MCP3208_DIN = ch & 0x01; // D0 MCP3208_CLK = 1; asm nop; MCP3208_CLK = 0; // MCP3208_DIN = 0; // sample MCP3208_CLK = 1; asm nop; MCP3208_CLK = 0; // MCP3208_DIN = 0; // null MCP3208_CLK = 1; asm nop; MCP3208_CLK = 0; // data = 0; // data for (cnt = 0; cnt < 12; cnt++) { MCP3208_DIN = 0; MCP3208_CLK = 1; if (MCP3208_DOUT == 1) { data |= 0x01; } else { data |= 0x00; } data = data << 1; MCP3208_CLK = 0; } // MCP3208_CS = 1; MCP3208_CLK = 1; asm nop; MCP3208_CLK = 0; // data = data >> 1; // return(data); } //********************************************************************** void main() { unsigned char buf[20], cnt; unsigned int data; OSCCON.IRCF2 = 1; OSCCON.IRCF1 = 1; OSCCON.IRCF0 = 1; ADCON1 = 0b11111111; TRISA = 0b00100000; TRISB.F1 = 0; TRISB.F4 = 1; T0CON.T0CS = 0; // Usart_Init(9600); Delay_ms(100); // MCP3208_CS = 1; MCP3208_CLK = 0; while (1) { for (cnt = 0; cnt < 8; cnt++) { data = Adc_Read_mcp3208(cnt); data = data * 1.2; IntToStr(data, buf); Usart_Write_String(&buf[1]); Usart_Write_String("mv"); } Usart_Write_String("\r\n"); } } //**********************************************************************