#include "ADS1256.h" #include "spi.h" unsigned int sum; long ulResult; long double ldVolutage; //-----------------------------------------------------------------// // 功 能:ADS1256 写数据 // 入口参数: / // 出口参数: / // 全局变量: / // 备 注: 向ADS1256中地址为regaddr的寄存器写入一个字节databyte //-----------------------------------------------------------------// void ADS1256WREG(unsigned char regaddr,unsigned char databyte) { unsigned char cmd; //CS_0; while(ADS1256_DRDY);//当AD2_DRDY为低时才能写寄存器 //向寄存器写入数据地址 cmd = ADS1256_CMD_WREG|(regaddr & 0x0F); HAL_SPI_Transmit(&hspi3, &cmd, 1, 10); //写入数据的个数n-1 cmd = 0x00; HAL_SPI_Transmit(&hspi3, &cmd, 1, 10); //向regaddr地址指向的寄存器写入数据databyte HAL_SPI_Transmit(&hspi3, &databyte, 1, 10); //CS_1; } //初始化ADS1256 void ADS1256_Init(void) { //CS_0; LL_GPIO_SetOutputPin(ADS1256_PDWN_GPIO_Port,ADS1256_PDWN_Pin); ADS1256WREG(ADS1256_STATUS,0x06);// 高位在前、校准、使用缓冲 ADS1256WREG(ADS1256_MUX,ADS1256_MUXP_AIN0 | ADS1256_MUXN_AINCOM);// 初始化端口A0为‘+’,AINCOM位‘-’ ADS1256WREG(ADS1256_ADCON,0x00);// 放大倍数1 ADS1256WREG(ADS1256_DRATE,ADS1256_DRATE_100SPS);// 数据30000sps ADS1256WREG(ADS1256_IO,0x00); } //读取AD值 long double ADS1256ReadData(uint8_t channel) { //unsigned char data1,data2,data3; unsigned char cmd; unsigned char data[3]; while(ADS1256_DRDY); //切换通道 //注意:本次写入的新通道在下次读取时才会生效,本次读到的是上一次的值 switch(channel) { case 0: ADS1256WREG(ADS1256_MUX, ADS1256_MUXP_AIN0 | ADS1256_MUXN_AINCOM); break; case 1: ADS1256WREG(ADS1256_MUX, ADS1256_MUXP_AIN1 | ADS1256_MUXN_AINCOM); break; case 2: ADS1256WREG(ADS1256_MUX, ADS1256_MUXP_AIN2 | ADS1256_MUXN_AINCOM); break; case 3: ADS1256WREG(ADS1256_MUX, ADS1256_MUXP_AIN3 | ADS1256_MUXN_AINCOM); break; case 4: ADS1256WREG(ADS1256_MUX, ADS1256_MUXP_AIN4 | ADS1256_MUXN_AINCOM); break; case 5: ADS1256WREG(ADS1256_MUX, ADS1256_MUXP_AIN5 | ADS1256_MUXN_AINCOM); break; case 6: ADS1256WREG(ADS1256_MUX, ADS1256_MUXP_AIN6 | ADS1256_MUXN_AINCOM); break; case 7: ADS1256WREG(ADS1256_MUX, ADS1256_MUXP_AIN7 | ADS1256_MUXN_AINCOM); break; } //CS_0; cmd = ADS1256_CMD_SYNC; HAL_SPI_Transmit(&hspi3, &cmd, 1, 10); cmd = ADS1256_CMD_WAKEUP; HAL_SPI_Transmit(&hspi3, &cmd, 1, 10); //发送单次读命令 cmd = ADS1256_CMD_RDATA; HAL_SPI_Transmit(&hspi3, &cmd, 1, 10); //读24位数据 HAL_SPI_Receive(&hspi3, (uint8_t *)data, 3, 10); // HAL_SPI_Receive(&hspi3, &data1, 1, 10); // HAL_SPI_Receive(&hspi3, &data2, 1, 10); // HAL_SPI_Receive(&hspi3, &data3, 1, 10); // sum = (unsigned int)(data1<<16)|(data2<<8)|data3; sum = (unsigned int)(data[0]<<16)|(data[1]<<8)|data[2]; //CS_1; //sum = 0x7fffff - sum; //单位转换为mV (VREF=2.5V) ulResult = sum; if(ulResult & 0x800000) { ulResult = ~(unsigned long)ulResult; ulResult &= 0x7fffff; ulResult += 1; ulResult = -ulResult; ldVolutage = (long double)ulResult*0.000596046518808; } else ldVolutage = (long double)ulResult*0.000596046518808; return ldVolutage; } void adc_task(void) { LL_ADC_REG_StartConversionSWStart(ADC1); InputReg[2] = (uint16_t)((ADS1256ReadData(1) * 10));// - 1507.8) / 0.082);//阀位反馈(0-25000uA) // //分段标定,采样值减去段首值除以标定后的增益加段首的理论值 // if(InputReg[2] <= 18312) // { // InputReg[2] = (uint16_t)((float)(InputReg[2] - 15036) / 0.819f) + 0 ; // } // else if(InputReg[2] > 18312 && InputReg[2] <= 21588) // { // InputReg[2] = (uint16_t)((float)(InputReg[2] - 18312) / 0.819f) + 4000 ; // } // else if(InputReg[2] > 21588 && InputReg[2] <= 24864) // { // InputReg[2] = (uint16_t)((float)(InputReg[2] - 21588) / 0.819f) + 8000 ; // } // else if(InputReg[2] > 24864 && InputReg[2] <= 28139) // { // InputReg[2] = (uint16_t)((float)(InputReg[2] - 24864) / 0.81875f) + 12000 ; // } // else if(InputReg[2] > 28139 && InputReg[2] <= 31414) // { // InputReg[2] = (uint16_t)((float)(InputReg[2] - 28139) / 0.81875f) + 16000 ; // } // else // { // InputReg[2] = (uint16_t)((float)(InputReg[2] - 31414) / 0.81875f) + 20000 ; // } InputReg[3] = (uint16_t)((ADS1256ReadData(2) * 10));// - 1507.9) / 0.082);//阀前压力(0-25000uA) // //分段标定,采样值减去段首值除以标定后的增益加段首的理论值 // if(InputReg[3] <= 18312) // { // InputReg[3] = (uint16_t)((float)(InputReg[3] - 15037) / 0.81875f) + 0 ; // } // else if(InputReg[3] > 18312 && InputReg[3] <= 21587) // { // InputReg[3] = (uint16_t)((float)(InputReg[3] - 18312) / 0.81875f) + 4000 ; // } // else if(InputReg[3] > 21587 && InputReg[3] <= 24862) // { // InputReg[3] = (uint16_t)((float)(InputReg[3] - 21587) / 0.81875f) + 8000 ; // } // else if(InputReg[3] > 24862 && InputReg[3] <= 28137) // { // InputReg[3] = (uint16_t)((float)(InputReg[3] - 24862) / 0.81875f) + 12000 ; // } // else if(InputReg[3] > 28137 && InputReg[3] <= 31410) // { // InputReg[3] = (uint16_t)((float)(InputReg[3] - 28137) / 0.81825f) + 16000 ; // } // else // { // InputReg[3] = (uint16_t)((float)(InputReg[3] - 31410) / 0.81825f) + 20000 ; // } InputReg[11] = (uint16_t)((ADS1256ReadData(3) * 10));// - 1507.8) / 0.082);//ADS1256数据备用(0-25000uA) // //分段标定,采样值减去段首值除以标定后的增益加段首的理论值 // if(InputReg[11] <= 18311) // { // InputReg[11] = (uint16_t)((float)(InputReg[11] - 15032) / 0.81975f) + 0 ; // } // else if(InputReg[11] > 18311 && InputReg[11] <= 21590) // { // InputReg[11] = (uint16_t)((float)(InputReg[11] - 18311) / 0.81975f) + 4000 ; // } // else if(InputReg[11] > 21590 && InputReg[11] <= 24868) // { // InputReg[11] = (uint16_t)((float)(InputReg[11] - 21590) / 0.8195f) + 8000 ; // } // else if(InputReg[11] > 24868 && InputReg[11] <= 28143) // { // InputReg[11] = (uint16_t)((float)(InputReg[11] - 24868) / 0.81975f) + 12000 ; // } // else if(InputReg[11] > 28143 && InputReg[11] <= 31419) // { // InputReg[11] = (uint16_t)((float)(InputReg[11] - 28143) / 0.81925f) + 16000 ; // } // else // { // InputReg[11] = (uint16_t)((float)(InputReg[11] - 31419) / 0.81925f) + 20000 ; // } InputReg[12] = (uint16_t)((ADS1256ReadData(4) * 10));// - 1507.8) / 0.082);//ADS1256数据备用(0-25000uA) // //分段标定,采样值减去段首值除以标定后的增益加段首的理论值 // if(InputReg[12] <= 18313) // { // InputReg[12] = (uint16_t)((float)(InputReg[12] - 15036) / 0.81925f) + 0 ; // } // else if(InputReg[12] > 18313 && InputReg[12] <= 21590) // { // InputReg[12] = (uint16_t)((float)(InputReg[12] - 18313) / 0.81925f) + 4000 ; // } // else if(InputReg[12] > 21590 && InputReg[12] <= 24867) // { // InputReg[12] = (uint16_t)((float)(InputReg[12] - 21590) / 0.81925f) + 8000 ; // } // else if(InputReg[12] > 24867 && InputReg[12] <= 28143) // { // InputReg[12] = (uint16_t)((float)(InputReg[12] - 24867) / 0.819f) + 12000 ; // } // else if(InputReg[12] > 28143 && InputReg[12] <= 31419) // { // InputReg[12] = (uint16_t)((float)(InputReg[12] - 28143) / 0.819f) + 16000 ; // } // else // { // InputReg[12] = (uint16_t)((float)(InputReg[12] - 31419) / 0.819f) + 20000 ; // } InputReg[13] = (uint16_t)((ADS1256ReadData(5) * 10));// - 1507.6) / 0.082);//ADS1256数据备用(0-25000uA) // //分段标定,采样值减去段首值除以标定后的增益加段首的理论值 // if(InputReg[13] <= 18312) // { // InputReg[13] = (uint16_t)((float)(InputReg[13] - 15035) / 0.81925f) + 0 ; // } // else if(InputReg[13] > 18312 && InputReg[13] <= 21589) // { // InputReg[13] = (uint16_t)((float)(InputReg[13] - 18312) / 0.81925f) + 4000 ; // } // else if(InputReg[13] > 21589 && InputReg[13] <= 24866) // { // InputReg[13] = (uint16_t)((float)(InputReg[13] - 21589) / 0.81925f) + 8000 ; // } // else if(InputReg[13] > 24866 && InputReg[13] <= 28142) // { // InputReg[13] = (uint16_t)((float)(InputReg[13] - 24866) / 0.819f) + 12000 ; // } // else if(InputReg[13] > 28142 && InputReg[13] <= 31417) // { // InputReg[13] = (uint16_t)((float)(InputReg[13] - 28142) / 0.81875f) + 16000 ; // } // else // { // InputReg[13] = (uint16_t)((float)(InputReg[13] - 31417) / 0.81875f) + 20000 ; // } InputReg[14] = (uint16_t)((ADS1256ReadData(6) * 10));// - 1508.1) / 0.082);//ADS1256数据备用(0-25000uA) // //分段标定,采样值减去段首值除以标定后的增益加段首的理论值 // if(InputReg[14] <= 18308) // { // InputReg[14] = (uint16_t)((float)(InputReg[14] - 15034) / 0.8185f) + 0 ; // } // else if(InputReg[14] > 18308 && InputReg[14] <= 21581) // { // InputReg[14] = (uint16_t)((float)(InputReg[14] - 18308) / 0.81825f) + 4000 ; // } // else if(InputReg[14] > 21581 && InputReg[14] <= 24854) // { // InputReg[14] = (uint16_t)((float)(InputReg[14] - 21581) / 0.81825f) + 8000 ; // } // else if(InputReg[14] > 24854 && InputReg[14] <= 28127) // { // InputReg[14] = (uint16_t)((float)(InputReg[14] - 24854) / 0.81825f) + 12000 ; // } // else if(InputReg[14] > 28127 && InputReg[14] <= 31400) // { // InputReg[14] = (uint16_t)((float)(InputReg[14] - 28127) / 0.81825f) + 16000 ; // } // else // { // InputReg[14] = (uint16_t)((float)(InputReg[14] - 31400) / 0.81825f) + 20000 ; // } InputReg[15] = (uint16_t)((ADS1256ReadData(7) * 10));// - 1507.6) / 0.082);//ADS1256数据备用(0-25000uA) // //分段标定,采样值减去段首值除以标定后的增益加段首的理论值 // if(InputReg[15] <= 18312) // { // InputReg[15] = (uint16_t)((float)(InputReg[15] - 15035) / 0.81925f) + 0 ; // } // else if(InputReg[15] > 18312 && InputReg[15] <= 21589) // { // InputReg[15] = (uint16_t)((float)(InputReg[15] - 18312) / 0.81925f) + 4000 ; // } // else if(InputReg[15] > 21589 && InputReg[15] <= 24865) // { // InputReg[15] = (uint16_t)((float)(InputReg[15] - 21589) / 0.819f) + 8000 ; // } // else if(InputReg[15] > 24865 && InputReg[15] <= 28141) // { // InputReg[15] = (uint16_t)((float)(InputReg[15] - 24865) / 0.819f) + 12000 ; // } // else if(InputReg[15] > 28141 && InputReg[15] <= 31416) // { // InputReg[15] = (uint16_t)((float)(InputReg[15] - 28141) / 0.81875f) + 16000 ; // } // else // { // InputReg[15] = (uint16_t)((float)(InputReg[15] - 31416) / 0.81875f) + 20000 ; // } InputReg[16] = (uint16_t)((ADS1256ReadData(0) * 10));// - 1507.8) / 0.082);//ADS1256数据备用(0-25000uA) // //分段标定,采样值减去段首值除以标定后的增益加段首的理论值 // if(InputReg[16] <= 18312) // { // InputReg[16] = (uint16_t)((float)(InputReg[16] - 15035) / 0.81925f) + 0 ; // } // else if(InputReg[16] > 18312 && InputReg[16] <= 21588) // { // InputReg[16] = (uint16_t)((float)(InputReg[16] - 18312) / 0.819f) + 4000 ; // } // else if(InputReg[16] > 21588 && InputReg[16] <= 24864) // { // InputReg[16] = (uint16_t)((float)(InputReg[16] - 21588) / 0.819f) + 8000 ; // } // else if(InputReg[16] > 24864 && InputReg[16] <= 28140) // { // InputReg[16] = (uint16_t)((float)(InputReg[16] - 24864) / 0.819f) + 12000 ; // } // else if(InputReg[16] > 28140 && InputReg[16] <= 31416) // { // InputReg[16] = (uint16_t)((float)(InputReg[16] - 28140) / 0.819f) + 16000 ; // } // else // { // InputReg[16] = (uint16_t)((float)(InputReg[16] - 31416) / 0.819f) + 20000 ; // } }