新會員
Joined
: 2006/8/16 15:34 最後登入時間
: 2006/12/12 13:10
Group:
註冊會員
Level : 1 HP : 0 / 5 MP : 1 / 282 EXP : 21
|
/////////////////////////////////////////////////////////////////////////////////////////////////////// //// AD7705.C //// //// Driver for analog device AD7705 //// //// adc_init() Call after power up //// //// read_adc_value(channel)Read adc value from the specified channel //// //// adc_disable() Disables the adc conversion //// /////////////////////////////////////////////////////////////////////////////////////////////////////// //// Driver routines for the AD7705 chip //Assuming a 2.4576 crystal ocsillator is used between MCLK IN and MCLK OUT
// ************************************************ // *************** AD7705 采样 ******************* ** // ************************************************ // connection pins to the PIC #define ADC_DRDY PIN_B0 // 数据准备好 #define ADC_DO PIN_B2 // SPI数据输出 #define ADC_DI PIN_B1 // SPI数据输入 #define ADC_CLK PIN_B3 // SPI数据时钟
//Operation modes #define ADC_NORMAL 0x00 #define ADC_SELF 0x40 #define ADC_ZERO_SCALE 0x80 #define ADC_FULL_SCALE 0xc0
//Gain settings #define ADC_GAIN_1 0x00 #define ADC_GAIN_2 0x08 #define ADC_GAIN_4 0x10 #define ADC_GAIN_8 0x18 #define ADC_GAIN_16 0x20 #define ADC_GAIN_32 0x28 #define ADC_GAIN_64 0x30 #define ADC_GAIN_128 0x38
//Polar operations #define ADC_BIPOLAR 0x00 #define ADC_UNIPOLAR 0x04
//update rates #define ADC_50 0x04 #define ADC_60 0x05 #define ADC_250 0x06 #define ADC_500 0x07
void adc_init(void); void write_adc_byte(BYTE data); unsigned long read_adc_word(); void setup_adc_device(int calmode, int gainsetting, int operation, int rate);
unsigned long read_adc_value(int1 ch); void adc_disable(); float convert_to_volts(long data);
//initailaization routine
void adc_init(void) { restart_wdt(); write_adc_byte( 0x04 ); setup_adc_device(ADC_SELF,ADC_GAIN_1,ADC_UNIPOLAR,ADC_50); }
void write_adc_byte(BYTE data) { BYTE i; for(i=1;i<=8;i++) { output_bit(ADC_DI, shift_left(&data,1,0)); output_low(ADC_CLK); output_high(ADC_CLK); } }
unsigned long read_adc_word() { BYTE i; unsigned long data;
for(i=1;i<=16;++i) { output_low(ADC_CLK); output_high(ADC_CLK); shift_left(&data,2,input(ADC_DO)); } return data; }
//setup the device paramaters(mode, gainsetting, polar operation and output rate) void setup_adc_device(int calmode, int gainsetting, int operation, int rate) { restart_wdt(); write_adc_byte( 0x20 ); //Communications Register set to write of clock register write_adc_byte( rate ); //Clock Register info here write_adc_byte( 0x10 ); //Communications Register set to write of setup register write_adc_byte( calmode|gainsetting|operation ); //calmode|gainsetting|operation); //Setup Register info here write_adc_byte( 0x21 ); //Communications Register set to write of clock register write_adc_byte( rate ); //Clock Register info here write_adc_byte( 0x11 ); write_adc_byte( calmode|gainsetting|operation ); }
//read an adc value from the specified channel unsigned long read_adc_value(int1 ch) { unsigned long value; while ( input(ADC_DRDY) ); if(!ch) write_adc_byte(0x38); //communications register set to read of data register of channel 1 else write_adc_byte(0x39); //communications register set to read of data register of channel 0 value=read_adc_word(); while ( !input(ADC_DRDY) );// return value; }
//disable the a/d conversion void adc_disable() { write_adc_byte( 0x20 );//Communications Register set to write of clock register write_adc_byte( 0x10 );//Clock Register info here }
//Convert the value read to volts float convert_to_volts(long data) { return ((float)data*2.498/0xffff); }
發表於: 2006/9/2 13:31
|