fm_ccjy/Board/Src/ads1256.c

387 lines
11 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "ADS1256.h"
#include "spi.h"
unsigned int sum;
long ulResult;
long double ldVolutage;
int ads_cnt = 0;
//-----------------------------------------------------------------//
// 功 能ADS1256 写数据
// 入口参数: /
// 出口参数: /
// 全局变量: /
// 备 注: 向ADS1256中地址为regaddr的寄存器写入一个字节databyte
//-----------------------------------------------------------------//
void ADS1256WREG(unsigned char regaddr,unsigned char databyte)
{
unsigned char cmd;
//CS_0;
while(ADS1256_DRDY)
{
ads_cnt++;
if(ads_cnt >= OVER_TIMES)
{
ads_cnt = 0;
return;
}
}//当AD2_DRDY为低时才能写寄存器
//向寄存器写入数据地址
cmd = ADS1256_CMD_WREG|(regaddr & 0x0F);
HAL_SPI_Transmit(&hspi3, &cmd, 1, 1);
//写入数据的个数n-1
cmd = 0x00;
HAL_SPI_Transmit(&hspi3, &cmd, 1, 1);
//向regaddr地址指向的寄存器写入数据databyte
HAL_SPI_Transmit(&hspi3, &databyte, 1, 1);
//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_30000SPS);// 数据30000sps
ADS1256WREG(ADS1256_IO,0x00);
}
//读取AD值
long double ADS1256ReadData(uint8_t channel)
{
unsigned char cmd;
unsigned char data[3];
while(ADS1256_DRDY)
{
ads_cnt++;
if(ads_cnt >= OVER_TIMES)
{
ads_cnt = 0;
return ldVolutage;
}
}//当AD2_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, 1);
cmd = ADS1256_CMD_WAKEUP;
HAL_SPI_Transmit(&hspi3, &cmd, 1, 1);
//发送单次读命令
cmd = ADS1256_CMD_RDATA;
HAL_SPI_Transmit(&hspi3, &cmd, 1, 1);
//读24位数据
HAL_SPI_Receive(&hspi3, (uint8_t *)data, 3, 1);
sum = (unsigned int)(data[0]<<16)|(data[1]<<8)|data[2];
//单位转换为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(uint8_t num)
{
LL_ADC_REG_StartConversionSWStart(ADC1);
switch(num)
{
case 0 :
{
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 ;
}
}
break;
case 1 :
{
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 ;
}
}
break;
case 2 :
{
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 ;
}
}
break;
case 3 :
{
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 ;
}
}
break;
case 4 :
{
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 ;
}
}
break;
case 5 :
{
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 ;
}
}
break;
case 6 :
{
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 ;
}
}
break;
case 7 :
{
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 ;
}
}
break;
}
}