注册 登录
自由的生活_软路由 返回首页

心想事成的个人空间 https://bbs.routerclub.com/?681 [收藏] [复制] [分享] [RSS]

日志

直接读取n2000色谱仪的spi数据

已有 31 次阅读2024-9-11 09:49

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;
}





路过

雷人

握手

鲜花

鸡蛋

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

QQ|Archiver|手机版|小黑屋|软路由 ( 渝ICP备15001194号-1|渝公网安备 50011602500124号 )

GMT+8, 2024-9-19 09:16 , Processed in 0.075224 second(s), 5 queries , Gzip On, Redis On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

返回顶部