n2000色谱仪主板上主要有以下芯片:
单片机:STC(宏晶科技)公司的 STC AT89C2051 24P1,用于读取spi数据后转为串口输出
光耦合器:美国仙童(FAIRCHILD)公司的6N137、4N25、817B,用于电信号的隔离传输
电压放大:美国TI(德州仪器)公司的OP07,用于微弱信号的精密运放
模数转换:Cirrus Logic(美国凌云逻辑)公司的cs5513,用于将模拟信号经24位高精度A/D转换后输出spi数据
基准电压源:仙童公司的LM336(2.5V),作为基准电压
隔离电源:深圳安时捷公司的HDN1-5D05 DC-DC微功率直流变换器,用于将从USB取电的5V变换为±5V稳压电源,隔离噪声干扰
n2000色谱仪用料精良,用于微弱电压信号的放大采集非常实用。但因为是多年前设计生产,只有串口输出,且必须使用配套的n2000系列软件。低版本的软件只能在windows xp上运行,高版本的软件需要另外的加密锁,在应用上较为不便。
n2000色谱仪通电后即会在cs5513芯片的spi接口输出数据信号,于是想到通过esp32直接读取cs5513的spi数据,然后esp32再将数据通过wifi传送到电脑上进一步处理和分析。
esp32使用arduino编写代码,其中读取cs5513 spi的核心代码为:
int32_t cs5513::readDataIfReady() {
int32_t ii,jj,kk;
// Check if there is new data to read
vspi->beginTransaction(SPISettings(spiClk, MSBFIRST, SPI_MODE0));
digitalWrite(VSPI_SS, LOW);
if (digitalRead(VSPI_MISO) != LOW )
{
digitalWrite(VSPI_SS, HIGH);
vspi->endTransaction();
return 0;
} ;
// if (digitalRead(VSPI_MISO) == LOW)
{
// Read data via SPI if /DRDY is low
int32_t sample = 0;
ii = vspi->transfer(0);
sample |= ii;
sample <<= 8;
jj = vspi->transfer(0);
sample |= jj;
sample <<= 8;
kk = vspi->transfer(0);
sample |= kk;
// sample <<= 8;
// sample /= 1L << 12;
// sample >>= 4;
// // 'sample' contains a 20-bit, offset binary value. Convert to 32-bit, signed value.
// sample -= INT32_C(1) << 20;
_raw = sample;
}
digitalWrite(VSPI_SS, HIGH);
vspi->endTransaction();
if (_raw & 0x80000)
{
_raw = ~_raw;
_raw = -1 * (_raw & 0x7FFFF);
}
int height = ((ii & 0xf0) >> 4);
int low = (ii & 0x0f);
if (height) _raw = 0;
if (ii == 0xff)
{
digitalWrite(VSPI_SCLK, HIGH);
delayMicroseconds(220);
digitalWrite(VSPI_SCLK, LOW);
delayMicroseconds(20);
}
// Serial.printf("cc %02x %02x %02x %02x %x %x",ii,jj,kk,_raw,height,low);
// Serial.println();
return _raw;
}
float cs5513::getMilliVolt()
{
float mv = 0.0;
// int32_t raw = AD_filter();
int32_t raw = readDataIfReady();
mv = (float)((float)(2.5 * 0.8) * raw / 0X7FFFF)*100 ;
return mv;
}