#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][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++) { 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,使用外部基准,无滤波 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; } }