acdt/board/Src/ads1256.c

266 lines
5.9 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;
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
ads1256_init();
ao_num = 0;
}
break;
}
}