привет всем.
приехал ко мне модуль 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();
}