割り込み処理で一定間隔のサンプリングをして、4096個のデータを集めて、TCPサーバーにリクエストが来たときに送り出します。ADS8688の時のプログラムを少し変更すればできます。
受け取り側のLabVIEWプログラムはデータを受け取ってからI16に変換します。AD7606の設定が +/- 5Vで16ビットだからです。
青がCS信号で、オレンジがクロックです。
130kHzまではOKのようですが、140kHzで割り込みに間に合わなくなりました。
このプログラムでは変換開始パルスを出して、Busy信号の解除を待たずに1回前のデータを読み出しています。(Busy解除を待っているとかなり遅くなります。)
//esp32 board manager ver2.0.6
//Arduino ide 1.8.19
//Mac OS 12.5.1
//Koji Ohashi 230125
/*
AD7606 ESP32 SPI
D7(MISO)--IO19
BUSY--IO35
CS--IO5
RD(CLK)--IO18
RST--IO34
CB,CA--IO33
RANGE--GND(+/-5V)
OS0,OS1,OS2--GND(No Over Sampling)
GND--GND
5V--5V
*/
//Special Thanks to
//https://forum.pjrc.com/threads/64097-Teensy-3-2-with-AD7606
#include <SPI.h>
#define BUSY 35
#define RESET 34
#define START_CONVERSION 33
#define SCK 18
#define MISO 19
#define MOSI 23//Not Connected
#define CS 5
//uint16_t dataRead16;
#define SCALE_FACTOR 0.000152587890625
//TCP data server:Special thanks to
//https://tsunelab-programming.com/esp32-socket
//https://lang-ship.com/blog/work/esp32-tcp-ip-socket/
#include <WiFi.h>
#include <WiFiClient.h>
#include <WiFiAP.h>
#include <ESPmDNS.h>
const IPAddress ip(192,168,10,30);
const IPAddress subnet(255,255,255,0);
WiFiServer server(5000);
#define CMND_SIZE 256
byte myCmnd[CMND_SIZE];
#define DATA_SIZE 4096
volatile int16_t dataArray[DATA_SIZE];
byte dataArrayByte[DATA_SIZE*2];
volatile int read_count=0;
volatile int16_t sensorValue=0;
//TrigAI
#define LEDC_CHANNEL_TrigAI 4 //channel max 15//CHANNEL_4とCHANNEL_5は周波数とタイマービットを同一値
#define LEDC_TIMER_BIT_TrigAI 6 //64(0-63)
//#define LEDC_BASE_FREQ_TrigAI 50000.0// 50kHz
//#define LEDC_BASE_FREQ_TrigAI 80000.0// 80kHz
#define LEDC_BASE_FREQ_TrigAI 100000.0// 100kHz
//#define LEDC_BASE_FREQ_TrigAI 130000.0// 130kHz--OK
//#define LEDC_BASE_FREQ_TrigAI 140000.0// 140kHz--NG
//#define LEDC_BASE_FREQ_TrigAI 200000.0// 200kHz
#define DUTY_TrigAI 8//50% 0x20 = 32
#define GPIO_PIN_TrigAI 26 //GPIO #36~#39 は設定不可
//割り込み関数***************
void IRAM_ATTR readAI(){
digitalWrite(START_CONVERSION, LOW);
delayMicroseconds(1); //minimum 25ns
digitalWrite(START_CONVERSION, HIGH);
digitalWrite(START_CONVERSION, HIGH);//dummy for wait
dataArray[read_count]=SPI.transfer16(0x0000);
read_count++;
}
//割り込み関数***************
void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_AP);
WiFi.softAP("", "");
delay(100);
WiFi.softAPConfig(ip,ip,subnet);
IPAddress myIP = WiFi.softAPIP();
server.begin();
MDNS.begin("MaDALab");
ledcSetup(LEDC_CHANNEL_TrigAI, LEDC_BASE_FREQ_TrigAI, LEDC_TIMER_BIT_TrigAI);
ledcAttachPin(GPIO_PIN_TrigAI, LEDC_CHANNEL_TrigAI);
ledcWrite(LEDC_CHANNEL_TrigAI, DUTY_TrigAI);
pinMode(BUSY, INPUT);
pinMode(RESET, OUTPUT);
pinMode(START_CONVERSION, OUTPUT);
Serial.begin(115200);
SPI.begin(SCK, MISO, MOSI, CS);
SPI.setHwCs(true); //Hardware control Cs pin
digitalWrite(START_CONVERSION, HIGH);
resetAD7606();
}
void loop() {
int time0,time1;
ReadData();
setDataArrayByte();
WiFiClient client = server.available();
if (client) {
Serial.println("New Client.");
String currentLine = "";
while (client.connected()) {
int available_count = client.available();
if (available_count) {
client.read(myCmnd,available_count);
Serial.write(myCmnd,available_count);
Serial.println("");
setDataArrayByte();
time0=millis();
client.write(dataArrayByte,DATA_SIZE*2);
time1=millis();
Serial.print(time1-time0);
Serial.println(" msec taken to send all data.");
}
}
client.stop();
Serial.println("Client Disconnected.");
}
delay(1000);
}
void ReadData(){
read_count=0;
SPI.beginTransaction(SPISettings(16000000, MSBFIRST, SPI_MODE0));
attachInterrupt(GPIO_PIN_TrigAI, readAI, RISING);//SOの読み取りタイミング
while(read_count<DATA_SIZE){} //全画素取り込み
detachInterrupt(GPIO_PIN_TrigAI);//SOの読み取り終了
SPI.endTransaction();
}
void resetAD7606(){
digitalWrite(RESET, HIGH);
delayMicroseconds(1); //tipically 50ns
digitalWrite(RESET, LOW);
delayMicroseconds(1);
}
void printData(){
for(int i=0; i<DATA_SIZE; i++){
Serial.println(dataArray[i]);
}
}
void setDataArrayByte(){
for(int i=0; i<DATA_SIZE; i++){
int16_t myData=dataArray[i];
dataArrayByte[i*2]= myData >> 8;
dataArrayByte[i*2+1]= myData & 0x00ff;
}
}
ESP32用のプログラムとLabVIEWプログラムを添付します。
ノコギリ波のデータを見ていると時々ノコギリのスロープが部分的に膨らむようなグラフが表示されます。原因はわかりませんが、ADS8688の方が安心かなという気になります。