※AD9833信号発生器のスケッチは下記サイトを使用しました。
・ESP32のADC(A-Dコンバータ)分解能は最大12ビット0~4095
・ESP32の内蔵DAC(D-Aコンバータ)は8ビット 0~255
GPIO25(チャネル 1) ・GPIO26(チャネル 2)
ブロック図
参考サイト
●ESP32 で波形信号発生モジュール AD9833 を制御して サイン波 を発生させてみる
●github.com/JR3XNW
回路図
ESP32 AD9833
IO14 HSPI_SCK ー SCLK
IO13 HSPI_MOSI ー SDATA
IO12 ー FSYNC
Esp32-devkitc-32e 開発ボード
●Esp32-devkitc-32e 開発ボード
※アマゾンの写真には技適マークがありますが、送られた製品は技適マーク無し(証明書無)
AD9833 DDS信号発生器
●AD9833 波形発生器 DDS信号発生器モジュール 0〜12.5MHz DIY 波/三角波/方形波信号生成【https://www.amazon.co.jp/dp/B07KYYR1ML?ref_=ppx_hzsearch_conn_dt_b_fed_asin_title_1】
ボードマネージャ変更
追加ボードマネージャーURLを変更【https://raw.githubusercontent.com/espressif/arduino-esp32/ghpages/package_esp32_dev_index.json】
【esp 32】
【バージョン3.2.0】インストール
ADC入力波形・DAC出力波形
![]() |
CH1 - ADC入力波形 CH2 - DAC出力波形 |
シリアルプロッタ
adc = (adc / 2047.5) - 1.0;
ADC信号を-1~1に変換する。(信号処理(AM・SSBなど)を行う ー 今回処理無し)
![]() |
adc 信号 |
audio = ((adc + 1.0) * 127.5);
モード処理した信号を0~255範囲に変換する。
※シリアルプロッタ使用後はスケッチをコメントアウトする。
PWM出力波形・DAC出力波形
![]() |
CH1 - PWM出力波形 CH2 - DAC出力波形 |
プログラム Arduino IDE【ボード:ESP32 Dev Module】
const int ADC_Pin = 32;
const int DAC_Pin = 25;
const int PWM_Pin = 26;
//AD9833信号発生器
//https://www.mgo-tec.com/blog-entry-esp32-ad9833-wave-generator-sign.html
#include <SPI.h>
const uint8_t SCLK_OLED = 14; //SCLK
const uint8_t MOSI_OLED = 13; //MOSI (Master Output Slave Input)
const uint8_t Fsync_PIN = 12; //CS (Chip Select)
const int SINE = 0b0010000000000000; //0x2000
const int TRIANGLE = 0b0010000000000010; //0x2002
const int SQUARE = 0b0010000000100000; //0x2020
const int SQUARE_half = 0b0010000000101000;
const float refFreq = 25000000.0;
SPIClass spi(HSPI);
void AD9833_SetFrequency(uint32_t frequency, int Waveform) {
uint32_t FreqWord = (frequency * pow(2, 28)) / refFreq;
uint16_t MSB = (uint16_t)((FreqWord & 0xFFFC000) >> 14);
uint16_t LSB = (uint16_t)(FreqWord & 0x3FFF);
LSB |= 0b0100000000000000; //=0x4000
MSB |= 0b0100000000000000; //=0x4000
Control_Resister_Write(0b0010000000000000); //制御ワード書き込み
Control_Resister_Write(LSB);
Control_Resister_Write(MSB);
Control_Resister_Write(0b1100000000000000); //位相シフトはゼロ
Control_Resister_Write(Waveform);
}
void Control_Resister_Write(uint16_t b){
digitalWrite(Fsync_PIN, LOW);
spi.transfer16(b);
digitalWrite(Fsync_PIN, HIGH);
}
void setup() {
Serial.begin(115200);
pinMode(32, INPUT);
//ledcAttach(PWM_Pin,10000,8);
//AD9833信号発生器
spi.begin(SCLK_OLED, 12, MOSI_OLED, Fsync_PIN);
spi.setFrequency(40000000);
spi.setDataMode(SPI_MODE2);
pinMode(Fsync_PIN, OUTPUT);
digitalWrite(Fsync_PIN, HIGH);
Control_Resister_Write(0b0000000100000000); //Reset
delay(50);
AD9833_SetFrequency(1000, SINE); //sin波1000Hz
//AD9833_SetFrequency(1000, TRIANGLE);
//AD9833_SetFrequency(1000, SQUARE);
}
void loop() {
float adc = analogRead(ADC_Pin);
adc = (adc / 2047.5) - 1.0; //adc信号変換 -1~1
//Serial.println(adc); //シリアルプロッタ
uint8_t audio = (uint8_t)((adc + 1.0) * 127.5); //audio信号変換 0~256
//Serial.println(audio);
//ledcWrite(PWM_Pin,audio); //pwm Audio 出力
dacWrite(DAC_Pin,audio); //dac Audio 出力
}
0 件のコメント:
コメントを投稿