วันอาทิตย์ที่ 3 ตุลาคม พ.ศ. 2553

Lab11: การใช้งาน MCP4922(Digital to Analog 12 bits)


การใช้งาน IC MCP4922 เป็น IC D to A ขนาด 12 bits ซึ่งสามารถหาซื้อได้ทั่วไปในเมืองไทย

#include <16F877A.h>
#DEVICE ADC=10
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600,  parity=N, Bits=8, xmit=PIN_C6, rcv=PIN_C7)

#define MCP4922_CS    PIN_B1
#define MCP4922_CLK   PIN_B2
#define MCP4922_DIN   PIN_B3
#define MCP4922_LDAC  PIN_B4
#define MCP4922_SHDN  PIN_B5

// กำหนดค่า Register ต่างๆ ของ MCP4922
#define MCP4922_DAC_A_BUFFERED_GAIN_1X_NON_SHDN      0x70  // DAC A, Buffered, Gain 1x, Output power control
#define MCP4922_DAC_A_BUFFERED_GAIN_2X_NON_SHDN      0x50  // DAC A, Buffered, Gain 2x, Output power control
#define MCP4922_DAC_A_NON_BUFFERED_GAIN_1X_NON_SHDN  0x30  // DAC A, Non buffered, Gain 1x, Output power control
#define MCP4922_DAC_A_NON_BUFFERED_GAIN_2X_NON_SHDN  0x10  // DAC A, Non buffered, Gain 2x, Output power control
#define MCP4922_DAC_B_BUFFERED_GAIN_1X_NON_SHDN      0xF0  // DAC B, Buffered, Gain 1x, Output power control
#define MCP4922_DAC_B_BUFFERED_GAIN_2X_NON_SHDN      0xD0  // DAC B, Buffered, Gain 2x, Output power control
#define MCP4922_DAC_B_NON_BUFFERED_GAIN_1X_NON_SHDN  0xB0  // DAC B, Non buffered, Gain 1x, Output power control
#define MCP4922_DAC_B_NON_BUFFERED_GAIN_2X_NON_SHDN  0x90  // DAC B, Non buffered, Gain 2x, Output power control

void mcp4922_init() {  //ฟังก์ชั่นเริ่มต้นการทำงาน
   output_high(MCP4922_CS);
   output_high(MCP4922_CLK);
   output_high(MCP4922_DIN);
   output_high(MCP4922_LDAC);
   output_high(MCP4922_SHDN);
}

void main()
{
   int8 cmd[2],i;              //ประกาศตัวแปร cmd, I เป็น integer 8 bits
   int16 data;                  //ประกาศตัวแปร data เป็น integer 16 bits
   mcp4922_init();           //กำหนดฟังก์ชั่นเริ่มต้นการทำงาน

   while(TRUE) {

   data =  4095;            //กำหนด data = 4095((4095 * 5)/(2^12-1) = 5 V)
   cmd[0]=data;              // cmd[0] = data 8 bits ล่าง
   cmd[1]=(data>>8)|MCP4922_DAC_B_BUFFERED_GAIN_1X_NON_SHDN;
                                    // cmd[0] = data 4 bits บน

   output_low(MCP4922_CS);               //เริ่มต้นการแปลงสัญญาณด้วย MCP4922
   output_low(MCP4922_CLK);
   output_high(MCP4922_LDAC);

   for(i=0;i<=15;i++) {
      output_bit(MCP4922_DIN,shift_left(cmd,2,1));
      output_high(MCP4922_CLK);
      output_low(MCP4922_CLK);
   }
   output_high(MCP4922_CS);
   output_low(MCP4922_LDAC);
   delay_us(10);
   output_HIGH(MCP4922_LDAC);
   delay_us(10);
    
  }
}