frederic blanc / AD8556

Dependents:   AD8556_HelloWolrd

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers AD8556.cpp Source File

AD8556.cpp

00001 /**
00002  * @brief AD8556:  Digitally Programmable Sensor Signal Amplifier with EMI Filters
00003  * http://www.analog.com/en/specialty-amplifiers/instrumentation-amplifiers/ad8556/products/product.html
00004  * @date 05/09/2013
00005  * @author F.BLANC LAAS-CNRS
00006  * http://homepages.laas.fr/fblanc/
00007  */
00008 
00009 #include "AD8556.h"
00010 
00011 /**
00012  * @brief Constructor.
00013  *
00014  * @param dig
00015 
00016  */
00017 AD8556::AD8556(PinName dig) : _dig(dig)
00018 {
00019 }
00020 
00021 /**
00022  * @brief Destructor.
00023  */
00024 AD8556::~AD8556()
00025 {
00026 }
00027 
00028 
00029 
00030 
00031 
00032 /**
00033    * @brief init
00034    * @param mode
00035    * @param First_Stage_Gain_Code
00036    * @param Second_Stage_Gain_Code
00037    * @param Vdac_Code
00038    */
00039 int AD8556::init(unsigned char mode,unsigned char First_Stage_Gain_Code, unsigned char Second_Stage_Gain_Code,unsigned char Vdac_Code)
00040 {
00041     trame(ADC_Second_Stage_Gain_Code,mode,Second_Stage_Gain_Code);
00042     trame(ADC_First_Stage_Gain_Code,mode,First_Stage_Gain_Code);
00043     trame(ADC_Output_Offset_Code,mode,Vdac_Code);
00044     return 0;
00045 }
00046 
00047 /**
00048    * @brief trame
00049    * @param parameter
00050    * @param mode
00051    * @param data
00052    */
00053 void AD8556::trame(unsigned char parameter,unsigned char mode,unsigned char data)
00054 {
00055     //12-Bit Start of Packet 1000 0000 0001
00056     write_bit(1);
00057     for(unsigned char i=0; i<10; ++i)
00058         write_bit(0);
00059     write_bit(1);
00060     //2-Bit Function
00061     switch (mode) {
00062         case  ADC_MODE_SENSE_CURENT :
00063             write_bit(0);
00064             write_bit(0);
00065             break;
00066         case  ADC_MODE_SIMULATION :
00067             write_bit(0);
00068             write_bit(1);
00069             break;
00070         case  ADC_MODE_FUSE :
00071             write_bit(1);
00072             write_bit(0);
00073             break;
00074         case  ADC_MODE_READ :
00075             write_bit(1);
00076             write_bit(1);
00077             break;
00078     }
00079     //2-Bit Parameter
00080     switch (parameter) {
00081         case  ADC_Second_Stage_Gain_Code :
00082             write_bit(0);
00083             write_bit(0);
00084             break;
00085         case  ADC_First_Stage_Gain_Code :
00086             write_bit(0);
00087             write_bit(1);
00088             break;
00089         case  ADC_Output_Offset_Code :
00090             write_bit(1);
00091             write_bit(0);
00092             break;
00093         case  ADC_Other_Functions :
00094             write_bit(1);
00095             write_bit(1);
00096             break;
00097     }
00098 
00099 
00100     //2-Bit Dummy 10
00101     write_bit(1);
00102     write_bit(0);
00103     //8-Bit Value
00104     for(char i=0; i<8; ++i) {
00105         write_bit( data & (0x80>>i) );
00106     }
00107     //12-Bit End of Packet 1000 0000 0001
00108     write_bit(0);
00109     for(unsigned char i=0; i<10; ++i)
00110         write_bit(1);
00111     write_bit(0);
00112 }
00113 
00114 /**
00115  * @brief write_bit
00116  *
00117  * @param bit 1 or 0
00118  */
00119 void AD8556::write_bit(unsigned char bit)
00120 {
00121     _dig = 0;
00122     _dig.output();
00123     wait_us(10);
00124     _dig = 1;
00125     if ( bit )
00126         wait_us(50); //1
00127     wait_us(5);
00128     _dig = 0;
00129     wait_us(10);
00130 }
00131 
00132 /**
00133    * @brief vdac
00134    * @param vdac consigne (volt)
00135    * @param vdd positive voltage supply (volt)
00136    * @param vss nagative voltage supply (volt)
00137    * @param mode
00138    */
00139 void AD8556::prog_vdac(float vdac,float vdd,float vss, unsigned char mode)
00140 {
00141     unsigned char Vdac_Code;
00142     Vdac_Code=256*(vdac-vss)/(vdd-vss)-0.5;
00143     trame(ADC_Output_Offset_Code,mode,Vdac_Code);
00144 
00145 }
00146 /**
00147   * @brief prog_gain
00148   * @param gain 70 to 1280
00149   * @param mode
00150   */
00151 void AD8556::prog_gain(float gain, unsigned char mode)
00152 {
00153 float Second_Stage_Gain;
00154 int First_Stage_Gain_Code;
00155     if (gain<70) {
00156         trame(ADC_Second_Stage_Gain_Code,mode,0);
00157         trame(ADC_First_Stage_Gain_Code,mode,0);
00158     } else if (gain<100) {
00159         trame(ADC_Second_Stage_Gain_Code,mode,0);
00160         Second_Stage_Gain=17.5;
00161         First_Stage_Gain_Code=(int)(((gain/Second_Stage_Gain)-4.0)*66.7);
00162         trame(ADC_First_Stage_Gain_Code, mode, First_Stage_Gain_Code);
00163     } else if (gain<140) {
00164         trame(ADC_Second_Stage_Gain_Code,mode,1);
00165         int First_Stage_Gain_Code=(int)gain/25;
00166         Second_Stage_Gain=25;
00167         First_Stage_Gain_Code=(int)(((gain/Second_Stage_Gain)-4.0)*66.7);
00168         trame(ADC_First_Stage_Gain_Code, mode, First_Stage_Gain_Code);
00169     } else if (gain<200) {
00170         trame(ADC_Second_Stage_Gain_Code,mode,2);
00171         Second_Stage_Gain=35;
00172         First_Stage_Gain_Code=(int)(((gain/Second_Stage_Gain)-4.0)*66.7);
00173         trame(ADC_First_Stage_Gain_Code, mode, First_Stage_Gain_Code);
00174     } else if (gain<280) {
00175         trame(ADC_Second_Stage_Gain_Code,mode,3);
00176         Second_Stage_Gain=50;
00177         First_Stage_Gain_Code=(int)(((gain/Second_Stage_Gain)-4.0)*66.7);
00178         trame(ADC_First_Stage_Gain_Code, mode, First_Stage_Gain_Code);
00179     } else if (gain<400) {
00180         trame(ADC_Second_Stage_Gain_Code,mode,4);
00181         Second_Stage_Gain=70;
00182         First_Stage_Gain_Code=(int)(((gain/Second_Stage_Gain)-4.0)*66.7);
00183         trame(ADC_First_Stage_Gain_Code, mode, First_Stage_Gain_Code);
00184     } else if (gain<560) {
00185         trame(ADC_Second_Stage_Gain_Code,mode,5);
00186         Second_Stage_Gain=100;
00187         First_Stage_Gain_Code=(int)(((gain/Second_Stage_Gain)-4.0)*66.7);
00188         trame(ADC_First_Stage_Gain_Code, mode, First_Stage_Gain_Code);
00189     } else if (gain<800) {
00190         trame(ADC_Second_Stage_Gain_Code,mode,6);
00191         Second_Stage_Gain=140;
00192         First_Stage_Gain_Code=(int)(((gain/Second_Stage_Gain)-4.0)*66.7);
00193         trame(ADC_First_Stage_Gain_Code, mode, First_Stage_Gain_Code);
00194     } else if (gain<1280) {
00195         trame(ADC_Second_Stage_Gain_Code,mode,7);
00196         Second_Stage_Gain=200;
00197         First_Stage_Gain_Code=(int)(((gain/Second_Stage_Gain)-4.0)*66.7);
00198         trame(ADC_First_Stage_Gain_Code, mode, First_Stage_Gain_Code);
00199     } else if (gain>=1280) {
00200         trame(ADC_Second_Stage_Gain_Code,mode,7);
00201         trame(ADC_First_Stage_Gain_Code, mode, 127);
00202     }
00203    
00204 }