АЦП модуль AD7606, подключение, использование (как измерять напряжение от -10В до +10В)

привет всем.
приехал ко мне модуль AD7606 - 16 битная АЦП на 8 каналов.
https://aliexpress.ru/item/1005005971620292.html?spm=a2g2w.orderdetail.0.0.49364aa6zS8hUd&sku_id=12000035112447061
позволяет мерить напряжения от -10В до +10В
про него в интернет написано и много, и мало. Он работает с параллельным кодом либо последовательно (SPI)
Не уверен, что кому то это интересно, но вот самый простой тестовый код.
Особенности:
НЕ подключаем сигналы на AD7606: RESET, FIRST, DB0-DB6, DB8-DB14
пины OS0, OS1,OS2, RANGE - аппаратно соединяем с GND или +5V, в зависимости от желаемой конфигурации работы
OS0…OS2 - конфигурация скорости обработки аналоговых сигналов, RANGE - диапазон измеряемого сигнала (GND : -/+5V, +5V : -/+10V)
пины DB14. DB15 - к GND,
DB7 - на SPI_MISO arduino (Nano : 12)
RO - на SPI_SCLK arduino (Nano : 13)
CS - на SPI_SS ардуино (Nano : 10)
CVB+CVA - на пин для сигнала начала преобразования аналогового сигнала в код (любой ардуино выходной)
VIO - +5V
BUSY - на пин для контроля готовности преобразования аналогового сигнала в код (любой ардуино входной)
+5V - на +5В
GND - GND (масса)

Особенности ещё: при отключенных каналах, то есть при неподключенных входах
модуль выдает примерно +1.6 … +1.9V при анализа каналов.
Но если подключить что-то для измерения, то нормально меряет.
Не претендую на супер-пупер реализацию, но может кому будет интересно.

/**
     тест АЦП AD7606
**/

#include <SPI.h>

#define pin_AD7606_START   7 // для запуска преобразования
#define pin_AD7606_BUSY   A0 // используем его как цифровой сигнал занятости AD7606
//#define pin_AD7606_RANGE  A1 //  используем его как цифровой сигнал для установки RANGE (-/+5V или -/+10V) 
//#define pin_AD7606_RESET  A2 // используем его как цифровой сигнал для RESET AD7606

#define pin_AD7606_CS     10  // SPI SS
#define pin_AD7606_DO7    12 // SPI MISO
#define pin_AD7606_RD     13    // SPI SCLK
// пин Dout7 на AD7606 подключаем к SPI_MISO : 12
// пин RD AD7606 подключаем к SPI_SCLK : 13

// хесткое подключение пинов AD7606
//      RANGE : + 5V   
//      OS2 : +5v
//      OS1 : +5V
//      OS0 : GND
//      D14 : GND
//      D15 : GND

// #define SCALE_FACTOR 0.000152587890625   // для 5В
#define SCALE_FACTOR 0.00030517578125       // для 10В
/*
voltage resolution = (2 * 5 V) / 65536 = 0.000152587890625 V
or
voltage resolution = (2 * 10 V) / 65536 = 0.00030517578125V for full-scale
*/

byte AD7606_Raw[16];
short int AD7606_Channels[8];

#define DEBUG
#ifdef DEBUG
#define Trace(a) Serial.print(a)
#else
#define Trace(a) ;
#endif


void setup()
{
   Serial.begin(19200);
   Serial.println("TEST AD7606");
   
   pinMode(pin_AD7606_BUSY, INPUT);
   //pinMode(pin_AD7606_RESET, OUTPUT);   // не нужен
   //pinMode(pin_AD7606_RANGE, OUTPUT);   // аппаратно установлен
   pinMode(pin_AD7606_START, OUTPUT);
   pinMode(pin_AD7606_CS,OUTPUT);
   pinMode(pin_AD7606_DO7, OUTPUT);
   pinMode(pin_AD7606_RD, OUTPUT);
   
   SPI.begin();
   
   digitalWrite(pin_AD7606_START, HIGH); // пока не запускаем обработку
   digitalWrite(pin_AD7606_CS, HIGH);  // пока не выбираем наш AD7606

   // set samples
   // мы просто жестко соединим входы OS2, OS1, OS0 с GND или +5V  - для 110 = OS2 +5V, OS1 +5V, OS0 - GND
   //-----------------------------------------
   /* OS2 OS1 OS0 
          oversampling
          000 No oversampling Maximum sampling rate is 200KSPS
          001  2 times        100 KSPS
          010  4 times        50 KSPS
          011  8 times        25 KSPS
          100 16 times        12.5 KSPS
          101 32 times        6.25 KSPS
          110 64 times        3.125 KSPS
    */
   AD7606_Read();
   Serial.println("SETUP finished");
}

//#define DEBUG_AD7606_Read
#ifdef  DEBUG_AD7606_Read
#define Trace_Read(a) Serial.print(a)
#else
#define Trace_Read(a) ;
#endif

void AD7606_Read()
{    
   /**/ // читаем из AD7606
   // 1- start conversion START_CONVERSION HIGH (impulse)
   digitalWrite(pin_AD7606_START,LOW);
   delayMicroseconds(1);
   digitalWrite(pin_AD7606_START,HIGH); 
   
   // 2- wait until the busy is LOW again 
   while (digitalRead(pin_AD7606_BUSY) == HIGH) 
   {
       //Serial.println("BUSY");
       delayMicroseconds(1);  //
   }
 
   // 3- put the CS to LOW - читаем из AD7606
   SPISettings _spiSettings;   // берем текущие установки SPI 
   SPI.beginTransaction(_spiSettings); // и устанавливаем их снова? - может быть это по умолчанию опустим?
   digitalWrite(pin_AD7606_CS, LOW); // включаем обращзение к AD7606
   // 4- Read a byte from the SPI 
   int bytesToRead = 16;
   Trace_Read("принимаем данные\n");
   while (bytesToRead > 0) 
   {
    AD7606_Raw[16 - bytesToRead] = SPI.transfer(0x00);
    Trace_Read(AD7606_Raw[16 - bytesToRead]); Trace_Read(" ");
    bytesToRead--;
  }
  Trace_Read('\n');
  digitalWrite(pin_AD7606_CS, HIGH); // выключаем обращение к AD7606
  SPI.endTransaction();

  for (byte i=0; i<8; i++)
  {
       AD7606_Channels[i] = (AD7606_Raw[i*2] << 8) + AD7606_Raw[i*2+1];  // обязательно операцию сдвига в скобках!
       Trace_Read(i); Trace_Read(" "); Trace_Read(AD7606_Channels[i]); Trace_Read('\n');
  }
  // теперь у нас массив готовый данных с 8 каналов AD7606 - в кодах.
  // тепреь пересчитываем их в V
}

void loop()
{
   //return;
   AD7606_Read(); 
   for (byte i=0; i<8; i++)
   {
      float V = AD7606_Channels[i] * SCALE_FACTOR;  // пересчет в мВ
      Serial.print (V*1000.0,3);
      Serial.print(" mV  ");    
   }
   Serial.println();

}