acdt/board/Src/ads1220.c

251 lines
6.0 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 "ads1220.h"
#include "provalctrl.h"
int ads1 = 0,ads2 = 0,ads3 = 0,ads4 = 0;
uint8_t ads_ch = 0;
long ads1220_data[4];
long ads_v[4][10];
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++)
{
ADS1220_SCK(1);
delay_us(1); // 空等待
if(Byte & 0x80)
{
ADS1220_MOSI(1);
}
else
{
ADS1220_MOSI(0);
}
Byte <<= 1;
delay_us(1); // 空等待
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(1); // 空等待
temp <<= 1;
temp |= ADS1220_MISO;
delay_us(1); // 空等待
ADS1220_SCK(0);
delay_us(1); // 空等待
}
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,使用外部基准,无滤波
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_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
ads_v[ads_ch][ads2] = (long)(ads1220_data[ads_ch]/8388608.0*2500);
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.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_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
ads_v[ads_ch][ads2] = (long)(ads1220_data[ads_ch]/8388608.0*2500);
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_sum = 0;
ads_ch = 0;
ads1220_setchannl(AIN0_AVSS);
}
break;
}
}