#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(2); // 空等待 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(2); // 空等待 } return temp; } //-----------------------------------------------------------------// // 功 能:ADS1256 写数据 // 入口参数: / // 出口参数: / // 全局变量: / // 备 注: 向ADS1256中地址为regaddr的寄存器写入一个字节databyte //-----------------------------------------------------------------// void ADS1256WREG(unsigned char regaddr,unsigned char databyte) { unsigned char cmd; ADS1256_NSS(0); while(ADS1256_DRDY);//当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_write_byte(ADS1256_CMD_SELFCAL); 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 >= 65535) { 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(5); //读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]; delay_us(5); //单位转换为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) { //执行机构附件测试 -120 其余装置可改为 -150 视具体情况而定 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) - 150) / 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 ao_num = 0; } break; } }