259 lines
6.0 KiB
C
259 lines
6.0 KiB
C
#include "ads1220.h"
|
||
|
||
int ads1 = 0,ads2 = 0,ads3 = 0,ads4 = 0;
|
||
uint8_t ads_ch = 0;
|
||
long ads1220_data[4];
|
||
long ads_v[4][50];
|
||
long long ads_sum = 0;
|
||
|
||
/************************************************
|
||
函数名称 : ads1220_write_byte
|
||
功 能 : SPI写读一个字节
|
||
参 数 : Byte ---- 数据
|
||
返 回 值 : Byte ---- 数据
|
||
*************************************************/
|
||
uint8_t ads1220_write_byte( uint8_t Byte )
|
||
{
|
||
uint8_t i;
|
||
|
||
ADS1220_SCK(0);
|
||
|
||
for(i = 0;i < 8;i++)
|
||
{
|
||
if(Byte & 0x80)
|
||
{
|
||
ADS1220_MOSI(1);
|
||
}
|
||
else
|
||
{
|
||
ADS1220_MOSI(0);
|
||
}
|
||
Byte <<= 1;
|
||
delay_us(1); // 空等待
|
||
|
||
ADS1220_SCK(1);
|
||
delay_us(2); // 空等待
|
||
|
||
ADS1220_SCK(0);
|
||
delay_us(1); // 空等待
|
||
Byte |= ADS1220_MISO;
|
||
}
|
||
|
||
return Byte;
|
||
}
|
||
|
||
/************************************************
|
||
函数名称 : ads1220_read_byte
|
||
功 能 : SPI只读一个字节
|
||
参 数 : 无
|
||
返 回 值 : temp ---- 数据
|
||
*************************************************/
|
||
uint8_t ads1220_read_byte(void)
|
||
{
|
||
uint8_t i;
|
||
uint8_t temp = 0;
|
||
|
||
ADS1220_SCK(0);
|
||
|
||
for(i = 0;i < 8;i++)
|
||
{
|
||
ADS1220_SCK(1);
|
||
//delay_us(10); // 空等待
|
||
temp <<= 1;
|
||
|
||
temp |= ADS1220_MISO;
|
||
|
||
delay_us(2); // 空等待
|
||
ADS1220_SCK(0);
|
||
delay_us(2); // 空等待
|
||
}
|
||
|
||
return temp;
|
||
}
|
||
|
||
/*******************************************************************************
|
||
函数名称 : ads1220_writeregister
|
||
功 能 : 数据写入到寄存器
|
||
参 数 : StartAddress--寄存器写入起始地址,NumRegs--寄存器数量,pData---写入的数据
|
||
返 回 值 : 无
|
||
*******************************************************************************/
|
||
void ads1220_writeregister(int StartAddress, int NumRegs, uint8_t * pData)
|
||
{
|
||
int i;
|
||
ADS1220_NSS(0);
|
||
/* send the command byte */
|
||
ads1220_write_byte( ADS1220_WREG | (((StartAddress << 2) & 0x0c) | ((NumRegs - 1) & 0x03)));
|
||
|
||
/* send the data bytes */
|
||
for(i = 0; i < NumRegs; i++)
|
||
{
|
||
ads1220_write_byte(*pData++);
|
||
}
|
||
|
||
ADS1220_NSS(1);
|
||
}
|
||
|
||
/*******************************************************************************
|
||
函数名称 : ads1220_init
|
||
功 能 : ads1220初始化
|
||
参 数 : 无
|
||
返 回 值 : 无
|
||
*******************************************************************************/
|
||
void ads1220_init(void)
|
||
{
|
||
uint8_t config_0 = 0x81; //写入配置寄存器0,使用AIN0,AVSS,1倍增益,禁用PGA
|
||
uint8_t config_1 = 0xC0; //写入配置寄存器1,使用正常工作模式,单次转换模式,
|
||
uint8_t config_2 = 0x40; //写入配置寄存器2,使用外部基准,同时抑制50Hz和60Hz
|
||
uint8_t config_3 = 0x00; //写入配置寄存器3,使用设置独立的DRY引脚
|
||
|
||
ADS1220_NSS(0);
|
||
ads1220_write_byte(ADS1220_RESET);//复位命令
|
||
delay_ms(10);
|
||
ADS1220_NSS(1);
|
||
|
||
ads1220_writeregister(0x00, 1, &config_0);
|
||
|
||
ads1220_writeregister(0x01, 1, &config_1);
|
||
|
||
ads1220_writeregister(0x02, 1, &config_2);
|
||
|
||
ads1220_writeregister(0x03, 1, &config_3);
|
||
|
||
ADS1220_NSS(0);
|
||
delay_ms(10);
|
||
ads1220_write_byte(ADS1220_START);//开启一次转换
|
||
}
|
||
|
||
|
||
|
||
/*******************************************************************************
|
||
函数名称 : ads1220_setchannl
|
||
功 能 : 设置转换通道
|
||
参 数 : channl--通道号
|
||
返 回 值 : 无
|
||
*******************************************************************************/
|
||
void ads1220_setchannl(uint8_t channl)
|
||
{
|
||
ads1220_writeregister(0x00, 1, &channl);
|
||
ads1220_write_byte(ADS1220_START);
|
||
|
||
while(ADS1220_DRDY);
|
||
}
|
||
|
||
/*******************************************************************************
|
||
函数名称 : ads1220_readdata
|
||
功 能 : 读取ads1220数据
|
||
参 数 : 无
|
||
返 回 值 : ads1220转换数据
|
||
*******************************************************************************/
|
||
unsigned int ads1220_readdata(void)
|
||
{
|
||
long ads_data;
|
||
ADS1220_NSS(0);
|
||
ads1220_write_byte(ADS1220_RDATA);
|
||
ads_data = ads1220_read_byte();
|
||
ads_data = (ads_data << 8) | ads1220_read_byte();
|
||
ads_data = (ads_data << 8) | ads1220_read_byte();
|
||
|
||
/* sign extend data */
|
||
if (ads_data & 0x800000)
|
||
{
|
||
//ads_data -= 0x800000;
|
||
ads_data |= 0xff000000;
|
||
}
|
||
|
||
ADS1220_NSS(1);
|
||
|
||
return ads_data;
|
||
}
|
||
|
||
/*******************************************************************************
|
||
函数名称 : get_data
|
||
功 能 : 获取四路输入电流并存储
|
||
参 数 : 无
|
||
返 回 值 : 无
|
||
*******************************************************************************/
|
||
void ads1220_get_data(void)
|
||
{
|
||
switch(ads_ch)
|
||
{
|
||
case 0://读取通道0 然后切换到通道1
|
||
{
|
||
ads1220_data[ads_ch] = ads1220_readdata();
|
||
ads_v[ads_ch][ads1] = (long)((float)( ads1220_data[ads_ch] * 2.5f / 8388608 ) * 10000);//转换为电流 单位uA
|
||
ads1++;
|
||
if(ads1 > 9)
|
||
{
|
||
ads1 = 0;
|
||
for(int i = 0;i < 10;i++)
|
||
{
|
||
ads_sum += ads_v[ads_ch][i];
|
||
}
|
||
InputReg[8] = ads_sum / 10;//;ads_v[ads_ch][0]
|
||
ads_sum = 0;
|
||
}
|
||
ads_ch = 1;
|
||
ads1220_setchannl(AIN1_AVSS);
|
||
}
|
||
break;
|
||
case 1://读取通道1 然后切换到通道2
|
||
{
|
||
ads1220_data[ads_ch] = ads1220_readdata();
|
||
ads_v[ads_ch][ads2] = (long)((float)( ads1220_data[ads_ch] * 2.5f / 8388608 ) * 10000);//转换为电流 单位uA
|
||
ads2++;
|
||
if(ads2 > 9)
|
||
{
|
||
ads2 = 0;
|
||
for(int i = 0;i < 10;i++)
|
||
{
|
||
ads_sum += ads_v[ads_ch][i];
|
||
}
|
||
InputReg[9] = ads_sum / 10;//;ads_v[ads_ch][0]
|
||
ads_sum = 0;
|
||
}
|
||
ads_ch = 2;
|
||
ads1220_setchannl(AIN2_AVSS);
|
||
}
|
||
break;
|
||
case 2://读取通道2 然后切换到通道3
|
||
{
|
||
ads1220_data[ads_ch] = ads1220_readdata();
|
||
ads_v[ads_ch][ads3] = (long)((float)( ads1220_data[ads_ch] * 2.5f / 8388608 ) * 10000);//转换为电流 单位uA
|
||
ads3++;
|
||
if(ads3 > 9)
|
||
{
|
||
ads3 = 0;
|
||
for(int i = 0;i < 10;i++)
|
||
{
|
||
ads_sum += ads_v[ads_ch][i];
|
||
}
|
||
InputReg[10] = ads_sum / 10;//;ads_v[ads_ch][0]
|
||
ads_sum = 0;
|
||
}
|
||
ads_ch = 3;
|
||
ads1220_setchannl(AIN3_AVSS);
|
||
}
|
||
break;
|
||
case 3://读取通道3 然后切换到通道0
|
||
{
|
||
ads1220_data[ads_ch] = ads1220_readdata();
|
||
ads_v[ads_ch][ads4] = (long)((float)( ads1220_data[ads_ch] * 2.5f / 8388608 ) * 10000);//转换为电流 单位uA
|
||
ads4++;
|
||
if(ads4 > 9)
|
||
{
|
||
ads4 = 0;
|
||
for(int i = 0;i < 10;i++)
|
||
{
|
||
ads_sum += ads_v[ads_ch][i];
|
||
}
|
||
InputReg[11] = ads_sum / 10;//;ads_v[ads_ch][0]
|
||
ads_sum = 0;
|
||
}
|
||
ads_ch = 0;
|
||
ads1220_setchannl(AIN0_AVSS);
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
|