266 lines
5.9 KiB
C
266 lines
5.9 KiB
C
#include "ADS1256.h"
|
||
#include "spi.h"
|
||
|
||
unsigned int sum;
|
||
long ulResult;
|
||
long double ldVolutage;
|
||
|
||
int ads_cnt = 0;
|
||
|
||
int ao_num = 0;
|
||
|
||
/************************************************
|
||
函数名称 : ads1256_write_byte
|
||
功 能 : SPI写读一个字节
|
||
参 数 : Byte ---- 数据
|
||
返 回 值 : Byte ---- 数据
|
||
*************************************************/
|
||
uint8_t ads1256_write_byte( uint8_t Byte )
|
||
{
|
||
uint8_t i;
|
||
|
||
ADS1256_SCK(0);
|
||
|
||
for(i = 0;i < 8;i++)
|
||
{
|
||
ADS1256_SCK(1);
|
||
delay_us(1); // 空等待
|
||
|
||
if(Byte & 0x80)
|
||
{
|
||
ADS1256_MOSI(1);
|
||
}
|
||
else
|
||
{
|
||
ADS1256_MOSI(0);
|
||
}
|
||
|
||
Byte <<= 1;
|
||
//delay_us(1); // 空等待
|
||
ADS1256_SCK(0);
|
||
delay_us(1); // 空等待
|
||
Byte |= ADS1256_MISO;
|
||
}
|
||
|
||
return Byte;
|
||
}
|
||
|
||
/************************************************
|
||
函数名称 : ads1256_read_byte
|
||
功 能 : SPI只读一个字节
|
||
参 数 : 无
|
||
返 回 值 : temp ---- 数据
|
||
*************************************************/
|
||
uint8_t ads1256_read_byte(void)
|
||
{
|
||
uint8_t i;
|
||
uint8_t temp = 0;
|
||
|
||
ADS1256_SCK(0);
|
||
|
||
for(i = 0;i < 8;i++)
|
||
{
|
||
ADS1256_SCK(1);
|
||
delay_us(1); // 空等待
|
||
temp <<= 1;
|
||
|
||
temp |= ADS1256_MISO;
|
||
|
||
//delay_us(1); // 空等待
|
||
ADS1256_SCK(0);
|
||
delay_us(1); // 空等待
|
||
}
|
||
|
||
return temp;
|
||
}
|
||
|
||
|
||
//-----------------------------------------------------------------//
|
||
// 功 能:ADS1256 写数据
|
||
// 入口参数: /
|
||
// 出口参数: /
|
||
// 全局变量: /
|
||
// 备 注: 向ADS1256中地址为regaddr的寄存器写入一个字节databyte
|
||
//-----------------------------------------------------------------//
|
||
void ADS1256WREG(unsigned char regaddr,unsigned char databyte)
|
||
{
|
||
unsigned char cmd;
|
||
ADS1256_NSS(0);
|
||
while(ADS1256_DRDY)
|
||
{
|
||
ads_cnt++;
|
||
if(ads_cnt >= 4096)
|
||
{
|
||
ads_cnt = 0;
|
||
return;
|
||
}
|
||
|
||
}//当AD2_DRDY为低时才能写寄存器
|
||
//向寄存器写入数据地址
|
||
cmd = ADS1256_CMD_WREG|(regaddr & 0x0F);
|
||
ads1256_write_byte(cmd);
|
||
//写入数据的个数n-1
|
||
cmd = 0x00;
|
||
ads1256_write_byte(cmd);
|
||
//向regaddr地址指向的寄存器写入数据databyte
|
||
ads1256_write_byte(databyte);
|
||
ADS1256_NSS(0);
|
||
}
|
||
|
||
//初始化ADS1256
|
||
void ads1256_init(void)
|
||
{
|
||
ADS1256_NSS(0);
|
||
ADS1256_PDWN(1);
|
||
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_1000SPS);// 数据1000sps
|
||
ADS1256WREG(ADS1256_IO,0x00);
|
||
ADS1256_NSS(0);
|
||
}
|
||
|
||
//读取AD值
|
||
long double ADS1256ReadData(uint8_t channel)
|
||
{
|
||
unsigned char cmd;
|
||
unsigned char data[3];
|
||
while(ADS1256_DRDY)
|
||
{
|
||
ads_cnt++;
|
||
if(ads_cnt >= 4096)
|
||
{
|
||
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;
|
||
}
|
||
|
||
ADS1256_NSS(0);
|
||
cmd = ADS1256_CMD_SYNC;
|
||
ads1256_write_byte(cmd);
|
||
cmd = ADS1256_CMD_WAKEUP;
|
||
ads1256_write_byte(cmd);
|
||
|
||
//发送单次读命令
|
||
cmd = ADS1256_CMD_RDATA;
|
||
ads1256_write_byte(cmd);
|
||
delay_us(10);
|
||
|
||
//读24位数据
|
||
data[0] = ads1256_read_byte();
|
||
data[1] = ads1256_read_byte();
|
||
data[2] = ads1256_read_byte();
|
||
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 ads1256_get_data(void)
|
||
{
|
||
switch(ao_num)
|
||
{
|
||
case 0 :
|
||
{
|
||
InputReg[0] = (uint16_t)(((ADS1256ReadData(1) * 10) / 0.82 - 150) / 0.99);//阀位反馈(0-25000uA) - 140) / 0.99
|
||
ao_num = 1;
|
||
}
|
||
break;
|
||
|
||
case 1 :
|
||
{
|
||
InputReg[1] = (uint16_t)(((ADS1256ReadData(2) * 10) / 0.82 - 150) / 0.99);//阀前压力(0-25000uA) - 150) / 0.99
|
||
ao_num = 2;
|
||
}
|
||
break;
|
||
|
||
case 2 :
|
||
{
|
||
InputReg[2] = (uint16_t)(((ADS1256ReadData(3) * 10) / 0.82 - 150) / 0.99);//ADS1256数据备用(0-25000uA) - 140) / 0.99
|
||
ao_num = 3;
|
||
}
|
||
break;
|
||
|
||
case 3 :
|
||
{
|
||
InputReg[3] = (uint16_t)(((ADS1256ReadData(4) * 10) / 0.82 - 150) / 0.99);//ADS1256数据备用(0-25000uA) - 120) / 0.99
|
||
ao_num = 4;
|
||
}
|
||
break;
|
||
|
||
case 4 :
|
||
{
|
||
InputReg[4] = (uint16_t)(((ADS1256ReadData(5) * 10) / 0.82 - 150) / 0.99);//ADS1256数据备用(0-25000uA) - 130) / 0.99
|
||
ao_num = 5;
|
||
}
|
||
break;
|
||
|
||
case 5 :
|
||
{
|
||
InputReg[5] = (uint16_t)(((ADS1256ReadData(6) * 10) / 0.82 - 150) / 0.99);//ADS1256数据备用(0-25000uA) - 140) / 0.99
|
||
ao_num = 6;
|
||
}
|
||
break;
|
||
|
||
case 6 :
|
||
{
|
||
InputReg[6] = (uint16_t)(((ADS1256ReadData(7) * 10) / 0.82 - 150) / 0.99);//ADS1256数据备用(0-25000uA) - 130) / 0.99
|
||
ao_num = 7;
|
||
}
|
||
break;
|
||
|
||
case 7 :
|
||
{
|
||
InputReg[7] = (uint16_t)(((ADS1256ReadData(0) * 10) / 0.82 - 150) / 0.99);//ADS1256数据备用(0-25000uA) - 150) / 0.99
|
||
// InputReg[7] = ( (InputReg[7] - 4000)/(float)16000.0 ) * 2000; //4~20mA->0~200Kpa,单位0.1Kpa
|
||
ao_num = 0;
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
|