AD9833でファンクションジェネレータを作る16 番外編

published_with_changes 更新日: event_note 公開日:

labelAD9833 labelESP32 labelファンクションジェネレータ

前に、”Serial.begin(115200);を書くとロータリエンコーダの割り込みが効かなくなりました。”ということを書きました。
その時推定していたのが、
  • シリアル通信と割り込みとの相性
  • シリアル通信用のGPIOと割り込みに使ったGPIOが競合している
だったのですが、その時は深く調べなくてその場対応でSerial.printを使わないことにしていました。今になってやはりSrial.printが必要になり、ESP32のデータシートを改めて確認したらGPIOが競合していることが原因でした。

あらまし

ESP32-WROOM-32においてArduino標準ライブラリに搭載されているシリアル通信は3ポート(3系統)分準備されています。そして、ノーマルのSerial通信に使われているポートがGPIO1,3です。ここにロータリエンコーダを設定していたので、競合が起きていました。

シリアルポート

GPIO番号(シルク印刷)

Serial

送信:1ピン(TX) 受信:3ピン(RX)

Serial1

送信:10ピン(D3) 受信:9ピン(D2)

Serial2

送信:17ピン(17) 受信:16ピン(16)

Arduinoライブラリで搭載されているシリアルポート

GPIOGPIO#Device InterfaceESP32 InputESP32 Outputfunction備考
0GPIO0SSD1283ACD
1GPIO1Rot Enc IfreqUpPin周波数増
2GPIO2DC Cut outzeroPinDC cutモード出力用pinを設定
3GPIO3Sweep outsweepPinsweepモード出力用pinを設定
ESP32のピンアサイン(対策前)

対策

AD9833でファンクションジェネレータを作る4 ESP32で整理したESP32のピンアサインを次のように変更して、GPIO#1,3を空きにしました。

GPIODevice InterfaceESP32 InputESP32 Outputfunction備考
0SSD1283ACDブートストラップ
1UART0(USB接続した場合にPCと通信するシリアル) に使用
2DC Cut outzeroPinDC cutモード出力用pinを設定ブートストラップ
3UART0(USB接続した場合にPCと通信するシリアル) に使用
4Sweep outsweepPinsweepモード出力用pinを設定3.3Vで代用可能、その場合 #define LED -1
5SSD1283ACSブートストラップ
6使用不可
7使用不可
8使用不可
9Serial1 受信
10Serial1 送信
11使用不可
12Rot Enc IfreqUpPin周波数増ブートストラップ
13AD9833DATA
14AD9833CLK
15Rot Enc IfreqDownPin周波数減ブートストラップ
16SSD1283ARSTSerial2 受信
17AD9833FSYNCSerial2 送信
18SSD1283ASCK
19SSD1283AMISO
20
21Rot Enc IroundPin周波数まるめ
22Signal outoutPinoutput出力確認用pinを設定
23SSD1283ASDA
24
25Rot Enc IIincDownPin周波数レンジ増
26sinPin非Pulseモード出力用pinを設定
27Rot Enc IIincFreqPin周波数レンジ選択
28
29
30
31
32Rot Enc IIincUpPin周波数レンジ減ANALOG A4
33Millival DC outmillivalミリバル出力読み込みANALOG A5
34tact switchDC CutsetDCcutDC cutモード入力用pinを設定ANALOG A6
35tact switchWave SelctsetWave波形選択ANALOG A7
36tact switchOutputsetStStp出力させる/させないの切り換え入力用pinを設定ANALOG A0
37
38
39tact switchSweepsetSweepsweepモード割り込みpinを設定ANALOG A3


補足事項

ピンが足らないから使っていないGPIO#9,10をSerialに使おうと思って、GPIO9と10を使うSerial1を試してみましたが、ダメでした。

ESP32は3系統のSerial通信が備わっているのですが、Serial1(UART1)で使用するGPIO#6~11がESP32で使用不可になっているためデフォルト設定では使えないオチらしいです。

ただし、ピンアサインを変更すると使えるようになるそうです。詳細はここに書いてありました。引用させていただきます。


HardwareSerial mySerial1(1); // UART1 (RX=9, TX=10)
HardwareSerial mySerial2(2); // UART2 (RX=16, TX=17)

void setup() {
  mySerial1.begin(115200, SERIAL_8N1, 32, 33); // ピンを変更 (RX=32, TX=33)
  mySerial2.begin(115200);
}

void loop() {
  ...
}

Powered by Blogger | Designed by QooQ

keyboard_double_arrow_down

keyboard_double_arrow_down