Nikolai Trushnikov / ADS1248-1

Dependents:   Chromatograph_Mobile

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers ads1248.cpp Source File

ads1248.cpp

00001 #include "ads1248.h"
00002 
00003 unsigned char ADS1248SleepCommand( void )
00004 {    
00005     DS1248_CS = 0;    
00006     SPI1MasterTransferByte(DS1248_SLEEP_COMMAND);
00007     DS1248_CS=1;
00008     DS1248_START = 0;
00009     return 0;                
00010 }
00011 
00012 unsigned char ADS1248WakeupCommand( void )
00013 {     
00014     DS1248_CS = 0;
00015     DS1248_START = 1;                   
00016     SPI1MasterTransferByte(DS1248_WAKEUP_COMMAND);
00017     DS1248_CS = 1;    
00018     return 0;    
00019 }
00020 
00021 unsigned char ADS1248ReadRegister( unsigned char reg, unsigned char num )
00022 {
00023     char res[num];
00024     DS1248_CS = 0;
00025     SPI1MasterTransferByte(DS1248_RREG_COMMAND | ( reg & 0x0F ));
00026     SPI1MasterTransferByte(num - 1);
00027     while (num--)
00028     {
00029         res[num]=SPI1MasterTransferByte(DS1248_NOP_COMMAND);
00030     }
00031     DS1248_CS = 1;
00032      return res[0];
00033 }
00034 
00035 unsigned char ADS1248WriteRegister( unsigned char reg, unsigned char num, uint8_t data)
00036 {
00037     DS1248_CS = 0;
00038     SPI1MasterTransferByte(DS1248_WREG_COMMAND | ( reg & 0x0F ));
00039     SPI1MasterTransferByte(num - 1);    
00040     SPI1MasterTransferByte(data);
00041     SPI1MasterTransferByte(DS1248_NOP_COMMAND);
00042     DS1248_CS = 1;    
00043     return 0;    
00044 }
00045 
00046 unsigned char ADS1248StartConversion( void )
00047 {
00048     DS1248_START = 1;
00049     
00050     //delay_us ( 5 );
00051     
00052     DS1248_START = 0;
00053     return 0;
00054 }
00055 
00056 unsigned long ADS1248ReadData( ADS1248_t * ads )
00057 {
00058     
00059     union{
00060         struct{
00061         uint8_t
00062         b1,b2,b3;
00063         };
00064         uint32_t all;
00065     }data;
00066     data.all=0;
00067     
00068     DS1248_CS = 0;
00069     wait_us(1);    
00070     SPI1MasterTransferByte(DS1248_RDATA_COMMAND);
00071     data.b3=SPI1MasterTransferByte(DS1248_NOP_COMMAND);
00072     data.b2=SPI1MasterTransferByte(DS1248_NOP_COMMAND);
00073     data.b1=SPI1MasterTransferByte(DS1248_NOP_COMMAND);
00074     wait_us(1);
00075     DS1248_CS = 1;
00076         
00077     return data.all;
00078 }
00079 
00080 unsigned char ADS1248SettingReg ( ADS1248_t * ads )
00081 {
00082     DS1248_START = 1;
00083     DS1248_CS = 0;
00084     wait_us(1);
00085     SPI1MasterTransferByte(DS1248_RESET_COMMAND);
00086     wait_us(600);
00087     SPI1MasterTransferByte(DS1248_SDATAC_COMMAND);
00088     
00089     ADS1248WriteRegister ( DS1248_REGISTER_MUX0, 1, ads->MUX0.all );    
00090     ADS1248WriteRegister ( DS1248_REGISTER_VBIAS, 1,ads->VBIAS.all);
00091     ADS1248WriteRegister ( DS1248_REGISTER_MUX1, 1, ads->MUX1.all );    
00092     ADS1248WriteRegister ( DS1248_REGISTER_SYS0, 1, ads->SYS0.all );
00093     ADS1248WriteRegister ( DS1248_REGISTER_IDAC0,1, ads->IDAC0.all);
00094     ADS1248WriteRegister ( DS1248_REGISTER_IDAC1,1, ads->IDAC1.all);    
00095     ADS1248WriteRegister ( DS1248_REGISTER_FSC0,1, ads->FSC.FSC0);
00096     ADS1248WriteRegister ( DS1248_REGISTER_FSC1,1, ads->FSC.FSC1);
00097     ADS1248WriteRegister ( DS1248_REGISTER_FSC2,1, ads->FSC.FSC2);
00098     
00099     DS1248_CS = 0;
00100     SPI1MasterTransferByte(DS1248_SYNC_COMMAND);
00101     wait_us(1);
00102     DS1248_CS = 1;
00103     return 0;
00104     
00105 }
00106 
00107 //вызывать вместо простого чтения АЦП
00108 unsigned long ADS1248ReadCalibratedData(ADS1248_t * ads)
00109 {
00110     unsigned long result=0;
00111     //проверка адекватности коэффициентов (не доделана)
00112     if ((ads->Calibr.k>0)&&(ads->Calibr.b<0x8000000))
00113     result = ads->Calibr.k*ADS1248ReadData(ads)+ads->Calibr.b;
00114     else return (0);
00115     if (result & 0xFF000000) 
00116     /*Если результат переполнен из-за коэффициентов то данные испорчены.
00117     Наверное можно просто отбросить старший байт или лучше приравнять максимальному 0x00FFFFFF*/
00118     return 0;
00119 }
00120 
00121 //программная калибровка через терминал, без использования регистров микросхемы
00122 void ADS1248CalibrateSoft(ADS1248_t * ads, /*костыль костылей*/float (*btf)(unsigned char*))
00123 {
00124     //тут остановить все управляющие воздействия и считывание. Или перед использованием функции.
00125     /*
00126     
00127     */
00128     UART.printf("ADS CALIBRATE:\r\n");
00129     __disable_irq ();
00130     UART_gets(16);
00131     UART.printf("%s\r\n",str);
00132     if(str[0]=='k'){    
00133     float result = btf(str);    
00134     UART.printf("%f\r\n",result);
00135     }
00136     __enable_irq ();
00137 }