2025年7月 3日 (木)

回路屋にとっては不気味な音:「プチっ」

ついさっき、私の作業机の後方で「プチっ」という音が一発。
ちょいと離れたところにいる同僚も「んっ!?」っと反応
するくらいの音の大きさ。
あれこれ電子回路が作動しているときの「プチっ」音は
なかなか不気味です。
  デバイスやコンデンサの破裂の可能性。
「どこや?!」っと耳を澄ましているともう一発「プチっ」。
しかし、臭いは感じません。 音だけ。

単発の音ですので、場所の特定が困難。
「このあたりか?」を見てみると、充電中のニッ水電池
がありました。

この記事にある
 ・パナの充電器BQ-321は劣化ニッ水でも充電してくれる(かも)
ということで、BQ-321死亡電池HHR-3XPS(2400mAh)を充電して
いたのです。 (2005年5月の刻印)

Bq333
Bq334

コンセントから充電器を外してから、電池を触っても
びっくりするくらいの熱さではありません。
充電してたらまぁこんなくらいやろの熱。
液体が漏れているということもありませんでした。
充電はしっかりされてました。

その後、音は聞こえずで、おそらくこれが原因。
「プチっ」音、電池の中の圧力逃がし弁が働いた
音なのかと推定。

※関連
アルカリ電池の液漏れで「音」!?
  TVのリモコンから小さな「プチプチ」音が


| | コメント (0)

DDS IC「AD9833」をArduino UNO R3で制御:箱入れ #2

DDS IC「AD9833」をArduino UNO R3で制御:箱に入れる
ここからちょっと手直し。
 ・高い周波数で方形波を出力するとちゃんとした
  波形が出てこない。原因はアンプの飽和。
 ・AD9833の出力、正弦波と三角波だとおよそ
  0.6V(p-p)なのが、方形波だと電源電圧フルスイング
  になってしまう。
 ・このため、前の回路では前段のアンプ(4V(p-p)まで増幅)
  が飽和。
 ・そこで、方形波の時にレベルを下げるような細工
  を入れ込む。
 ・使ったのは2入力のアナログマルチプレクサ。
    74LVC2G53 8pinのIC
      「2G」なんで2ゲートかと思いきや
      機能ブロック的には一つだけ。
      なんかへんな感じ。
 ・方形波を出力する時は、出力レベルを1/9した側に
  切り替える。
 ・飽和しないしLPFを通らないので、まっとうな
  方形波(今度はアンプでの帯域制限)が出るように。

ということで、こんな回路になりました。
Ad9833
・BSch3Vのデータ
   ・ダウンロード - ad9833_04.ce3

切り替え機能を追加したスケッチ。
   ・ダウンロード - ad9833_03.zip

AD9833を使う時の参考にどうぞ。

周波数を高くするときにいるのは、やっぱ、フィルタです。
これ以上の高速アンプは電気食いだし、電池運用はちょい
としんどいか。

※回路図をちょっと訂正
LVC2G53の手前の2段CRフィルタ。
マルチプレクサの入力容量がけっこうあるようなので
(データシートでオン時約20PF)フィルタ部を変更しました。
9833a
  入力部の抵抗を200Ω→1Kに。
  コンデンサをなしに。
1MHzあたりからレベルが落ち始めます。
4MHzになると出力電圧はほぼ半分に。

※追記
AD9833の出力を
  ・出力レベルを可変したい
  ・出力ののDCオフセット電圧を可変したい
ときの方法、面倒でもこんな構成かと。
Pm4
方形波の時はLPFを通さずできるだけ「生」信号
を使えるよう、MPXで分けます。
正弦波、三角波の時だけLPFを通します。
12dB/octので描きましたが、2段にして24dB/octや
LCフィルタでも良いわけです。
方形波出力のとき、後段アンプを飽和させないように
します。
  飽和させると電源ラインが汚くなります。
周波数が高くなると、高抵抗が使えなくなるので
ボリュームの入力部が面倒になります。

| | コメント (0)

2025年6月30日 (月)

DDS IC「AD9833」をArduino UNO R3で制御:箱に入れる

DDS IC「AD9833」をArduino UNO R3で制御
DDS IC「AD9833」の出力にバッファアンプを
DDS IC「AD9833」の出力にバッファアンプを #2

この時は、むき出しのユニバーサル基板でした。
便利に使おうとすると、
 ・箱に入ってて欲しい
 ・電池運用したい
となってしまいます。

百均屋で買ってきた透明樹脂の「箱」に入れました。
  回路は、元のとほぼ同じ。
  出力アンプはOPA2863で。
  1MHzちょいが安定して出ればOK。
  ほんとは出力レベルを可変したかったけど、
  DCオフセットの調整だけ。

Sw11
手組みした基板の様子。
Ss12_20250630150301
回路図。 (クリックで拡大↓)
Ad9833_dds03
スケッチ
  ・ダウンロード - ad9833_02.zip

AD9833のクロックをATmega328Pから出してますんで
ヒューズを書き換えて、16MHzクロックを出すようにし
なくちゃなりません。
  テストするだけならPB1に出してる8MHzも
  使えます。

役に立つかどうかは不明ですが、周波数スイープ機能を
入れてます。
  ラジオのIFトランスの調整あたりに
  使えないかなぁ。
ジャンクボックス内で拾った455kHzのセラミック・フィルタ
とTrラジオのIFTで試してみました。
Sw13

Sw14
フィルタの中心、455kHzが見えています。

スイープ速度を速くすると、周波数計算を行っている
サイクルが見えてきます。
Sw15
計算はもっと早くできるんですが液晶表示が遅い。
液晶表示は0.1秒に1回。

もうひとつ。
AD9833をはじめ、さまざまなDDS IC、無線家の皆さんが
VFOとして使われることが多いようで「スプリアス」を
気にされています。
しかし・・・原理的に、クロック周波数に近い、高い周波数
を出そうとすると、DDS処理に絡むジッタの割合が大きく
なり、きれいな波形が得られません。

これ、正弦波じゃなく方形波(DACデータのMSB)で見ると、
「なんじゃこりゃ」が見えてきます。
今回の回路では16MHzが基準クロック。
割り切れる8MHzや4MHz、2MHz、1.6MHz、1MHzは
きれいな波が出てきます。

4MHzだとまっとうな方形波。
Aa001_20250630170201
16クロックで1μsになり、そこに4発の方形波
が並びます。
1発あたり4クロック。

ところが5MHzになると・・・
  発生周波数を自由にできるのが
  DDSの取り柄なんですけれど。
Aa000_20250630170401
1μs間に5発のパルスが続くんで間違いなく5MHz。
でもそのパルスの間隔、周期は1クロック幅で右に
行ったり左に行ったり。

例えば、1秒ゲートの周波数カウンタで計ったら
こんな波形でもほんとにジャスト5MHzになります。
  それがDDSの原理。

オシロで単発波形を採るんじゃなくちょいと
流してみるとこんな波形になります。
Aa002
「なんじゃこりゃ」のデジタルデータを使って正弦波の
データが入ったROMをアクセスしてD/A変換。
周波数が高いほど、影響が大きく出てきます。
この波形が元になるんで、
  「スプリアス、そりゃ出まっせ」
かと。
クロック周波数に近い、高い周波数が欲しいときは、
出す周波数ギリギリのフィルタで高調波を落と
すしかないでしょ。

※追記
もう一つ、スイープ波形。
制限波出力で1kHz→4MHzを4秒かけてスイープ。
 上段がスイープトリガ用出力。
 中段がAD9833の出力。
 下段だOPA2863を2段通った出力。
  リニアでのスイープなんでこういった周波数特性
  を見る時はLOGスイープが欲しくなります。

Wv12
4MHzになるとレベルが約半分に。
OPA2863の性能が見えてます。
  オペアンプ前段に入れた220Ω+100PF2段の
  LPFのせいです。
  OPA2863はもっと優秀。

※MAX038発振器では ・・・
昔に組んだMAX038発振器では出力オペアンプとして
「AD811」を使ってました。
  帯域幅    140MHz
  スルーレート 2500V/μs
DigiKeyでの現在価格2200円。

※続き
DDS IC「AD9833」をArduino UNO R3で制御:箱入れ #2


| | コメント (0)

2025年6月26日 (木)

Arduino UNO R4の割り込み処理・・・まだまだ勉強不足

Arduino UNO R4の割り込み処理、まだ、使いこなせません。
ライブラリというか、備え付けの関数を使ってということではなく
もっと複雑な(ちゃうちゃう、シンプルに)処理をしたいぞと
なるとRA4M1マイコンのレジスタを直接操作してとなります。
  UNO R3のATmega328Pは分かりやすく
  あれこれできました
そのあたりがまだまだ勉強不足。

・備え付けの関数の例
  attachInterrupt(なんたら);
  #include "FspTimer.h"であれこれ

割り込みの設定状態を調べるため、とりあえず、こんなスケッチを。
割り込みのイベントリンクを設定する「IELSR」というレジスタ
が32個あって、割り込み元を設定するということなんです。
それをシリアル出力してみました。

//  イベントリンクコントローラの設定を見る
#include "Wire.h" // ヘッダファイル ★あれこれ記述してみる
const char *const elc_event_msg[]={ // ELC_EVENT名
"-", // 0 Link disabled
"ICU_IRQ0", // 1 External pin interrupt 0
"ICU_IRQ1", // 2 External pin interrupt 1
"ICU_IRQ2", // 3 External pin interrupt 2
"ICU_IRQ3", // 4 External pin interrupt 3
"ICU_IRQ4", // 5 External pin interrupt 4
"ICU_IRQ5", // 6 External pin interrupt 5
"ICU_IRQ6", // 7 External pin interrupt 6
"ICU_IRQ7", // 8 External pin interrupt 7
"ICU_IRQ8", // 9 External pin interrupt 8
"ICU_IRQ9", // 10 External pin interrupt 9
"ICU_IRQ10", // 11 External pin interrupt 10
"ICU_IRQ11", // 12 External pin interrupt 11
"ICU_IRQ12", // 13 External pin interrupt 12
"ICU_IRQ13", // 14 External pin interrupt 13
"ICU_IRQ14", // 15 External pin interrupt 14
"ICU_IRQ15", // 16 External pin interrupt 15
"DMAC0_INT", // 17 DMAC transfer end 0
"DMAC1_INT", // 18 DMAC transfer end 1
"DMAC2_INT", // 19 DMAC transfer end 2
"DMAC3_INT", // 20 DMAC transfer end 3
"DTC_COMPLETE", // 21 DTC last transfer
"DTC_END", // 22 DTC transfer end
"ICU_SNOOZE_CANCEL", // 23 Canceling from Snooze mode
"FCU_FRDYI", // 24 Flash ready interrupt
"LVD_LVD1", // 25 Voltage monitor 1 interrupt
"LVD_LVD2", // 26 Voltage monitor 2 interrupt
"LVD_VBATT", // 27 VBATT low voltage detect
"CGC_MOSC_STOP", // 28 Main Clock oscillation stop
"LPM_SNOOZE_REQUEST", // 29 Snooze entry
"AGT0_INT", // 30 AGT interrupt
"AGT0_COMPARE_A", // 31 Compare match A
"AGT0_COMPARE_B", // 32 Compare match B
"AGT1_INT", // 33 AGT interrupt
"AGT1_COMPARE_A", // 34 Compare match A
"AGT1_COMPARE_B", // 35 Compare match B
"IWDT_UNDERFLOW", // 36 IWDT underflow
"WDT_UNDERFLOW", // 37 WDT underflow
"RTC_ALARM", // 38 Alarm interrupt
"RTC_PERIOD", // 39 Periodic interrupt
"RTC_CARRY", // 40 Carry interrupt
"ADC0_SCAN_END", // 41 A/D scan end interrupt
"ADC0_SCAN_END_B", // 42 A/D scan end interrupt for group B
"ADC0_WINDOW_A", // 43 Window A Compare match
"ADC0_WINDOW_B", // 44 Window B Compare match
"ADC0_COMPARE_MATCH", // 45 Compare match
"ADC0_COMPARE_MISMATCH", // 46 Compare mismatch
"ACMPLP0_INT", // 47 Analog Comparator Channel 0 interrupt
"ACMPLP1_INT", // 48 Analog Comparator Channel 1 interrupt
"USBFS_FIFO_0", // 49 DMA transfer request 0
"USBFS_FIFO_1", // 50 DMA transfer request 1
"USBFS_INT", // 51 USBFS interrupt
"USBFS_RESUME", // 52 USBFS resume interrupt
"IIC0_RXI", // 53 Receive data full
"IIC0_TXI", // 54 Transmit data empty
"IIC0_TEI", // 55 Transmit end
"IIC0_ERI", // 56 Transfer error
"IIC0_WUI", // 57 Slave address match
"IIC1_RXI", // 58 Receive data full
"IIC1_TXI", // 59 Transmit data empty
"IIC1_TEI", // 60 Transmit end
"IIC1_ERI", // 61 Transfer error
"SSI0_TXI", // 62 Transmit data empty
"SSI0_RXI", // 63 Receive data full
"SSI0_INT", // 65 Error interrupt
"CTSU_WRITE", // 66 Write request interrupt
"CTSU_READ", // 67 Measurement data transfer request interrupt
"CTSU_END", // 68 Measurement end interrupt
"KEY_INT", // 69 Key interrupt
"DOC_INT", // 70 Data operation circuit interrupt
"CAC_FREQUENCY_ERROR", // 71 Frequency error interrupt
"CAC_MEASUREMENT_END", // 72 Measurement end interrupt
"CAC_OVERFLOW", // 73 Overflow interrupt
"CAN0_ERROR", // 74 Error interrupt
"CAN0_FIFO_RX", // 75 Receive FIFO interrupt
"CAN0_FIFO_TX", // 76 Transmit FIFO interrupt
"CAN0_MAILBOX_RX", // 77 Reception complete interrupt
"CAN0_MAILBOX_TX", // 78 Transmission complete interrupt
"IOPORT_EVENT_1", // 79 Port 1 event
"IOPORT_EVENT_2", // 80 Port 2 event
"IOPORT_EVENT_3", // 81 Port 3 event
"IOPORT_EVENT_4", // 82 Port 4 event
"ELC_SOFTWARE_EVENT_0", // 83 Software event 0
"ELC_SOFTWARE_EVENT_1", // 84 Software event 1
"POEG0_EVENT", // 85 Port Output disable interrupt A
"POEG1_EVENT", // 86 Port Output disable interrupt B
"GPT0_CAPTURE_COMPARE_A", // 87 Compare match A
"GPT0_CAPTURE_COMPARE_B", // 88 Compare match B
"GPT0_COMPARE_C", // 89 Compare match C
"GPT0_COMPARE_D", // 90 Compare match D
"GPT0_COMPARE_E", // 91 Compare match E
"GPT0_COMPARE_F", // 92 Compare match F
"GPT0_COUNTER_OVERFLOW", // 93 Overflow
"GPT0_COUNTER_UNDERFLOW", // 94 Underflow
"GPT1_CAPTURE_COMPARE_A", // 95 Compare match A
"GPT1_CAPTURE_COMPARE_B", // 96 Compare match B
"GPT1_COMPARE_C", // 97 Compare match C
"GPT1_COMPARE_D", // 98 Compare match D
"GPT1_COMPARE_E", // 99 Compare match E
"GPT1_COMPARE_F", // 100 Compare match F
"GPT1_COUNTER_OVERFLOW", // 101 Overflow
"GPT1_COUNTER_UNDERFLOW", // 102 Underflow
"GPT2_CAPTURE_COMPARE_A", // 103 Compare match A
"GPT2_CAPTURE_COMPARE_B", // 104 Compare match B
"GPT2_COMPARE_C", // 105 Compare match C
"GPT2_COMPARE_D", // 106 Compare match D
"GPT2_COMPARE_E", // 107 Compare match E
"GPT2_COMPARE_F", // 108 Compare match F
"GPT2_COUNTER_OVERFLOW", // 109 Overflow
"GPT2_COUNTER_UNDERFLOW", // 110 Underflow
"GPT3_CAPTURE_COMPARE_A", // 111 Compare match A
"GPT3_CAPTURE_COMPARE_B", // 112 Compare match B
"GPT3_COMPARE_C", // 113 Compare match C
"GPT3_COMPARE_D", // 114 Compare match D
"GPT3_COMPARE_E", // 115 Compare match E
"GPT3_COMPARE_F", // 116 Compare match F
"GPT3_COUNTER_OVERFLOW", // 117 Overflow
"GPT3_COUNTER_UNDERFLOW", // 118 Underflow
"GPT4_CAPTURE_COMPARE_A", // 119 Compare match A
"GPT4_CAPTURE_COMPARE_B", // 120 Compare match B
"GPT4_COMPARE_C", // 121 Compare match C
"GPT4_COMPARE_D", // 122 Compare match D
"GPT4_COMPARE_E", // 123 Compare match E
"GPT4_COMPARE_F", // 124 Compare match F
"GPT4_COUNTER_OVERFLOW", // 125 Overflow
"GPT4_COUNTER_UNDERFLOW", // 126 Underflow
"GPT5_CAPTURE_COMPARE_A", // 127 Compare match A
"GPT5_CAPTURE_COMPARE_B", // 128 Compare match B
"GPT5_COMPARE_C", // 129 Compare match C
"GPT5_COMPARE_D", // 130 Compare match D
"GPT5_COMPARE_E", // 131 Compare match E
"GPT5_COMPARE_F", // 132 Compare match F
"GPT5_COUNTER_OVERFLOW", // 133 Overflow
"GPT5_COUNTER_UNDERFLOW", // 134 Underflow
"GPT6_CAPTURE_COMPARE_A", // 135 Compare match A
"GPT6_CAPTURE_COMPARE_B", // 136 Compare match B
"GPT6_COMPARE_C", // 137 Compare match C
"GPT6_COMPARE_D", // 138 Compare match D
"GPT6_COMPARE_E", // 139 Compare match E
"GPT6_COMPARE_F", // 140 Compare match F
"GPT6_COUNTER_OVERFLOW", // 141 Overflow
"GPT6_COUNTER_UNDERFLOW", // 142 Underflow
"GPT7_CAPTURE_COMPARE_A", // 143 Compare match A
"GPT7_CAPTURE_COMPARE_B", // 144 Compare match B
"GPT7_COMPARE_C", // 145 Compare match C
"GPT7_COMPARE_D", // 146 Compare match D
"GPT7_COMPARE_E", // 147 Compare match E
"GPT7_COMPARE_F", // 148 Compare match F
"GPT7_COUNTER_OVERFLOW", // 149 Overflow
"GPT7_COUNTER_UNDERFLOW", // 150 Underflow
"OPS_UVW_EDGE", // 151 UVW edge event
"SCI0_RXI", // 152 Receive data full
"SCI0_TXI", // 153 Transmit data empty
"SCI0_TEI", // 154 Transmit end
"SCI0_ERI", // 155 Receive error
"SCI0_AM ", // 156 Address match event
"SCI0_RXI_OR_ERI", // 157 Receive data full/Receive
"SCI1_RXI", // 158 Received data full
"SCI1_TXI", // 159 Transmit data empty
"SCI1_TEI", // 160 Transmit end
"SCI1_ERI", // 161 Receive error
"SCI1_AM", // 162 Address match event
"SCI2_RXI", // 163 Received data full
"SCI2_TXI", // 164 Transmit data empty
"SCI2_TEI", // 165 Transmit end
"SCI2_ERI", // 166 Receive error
"SCI2_AM", // 167 Address match event
"SCI9_RXI", // 168 Received data full
"SCI9_TXI", // 169 Transmit data empty
"SCI9_TEI", // 170 Transmit end
"SCI9_ERI", // 171 Receive error
"SCI9_AM", // 172 Address match event
"SPI0_RXI", // 173 Receive buffer full
"SPI0_TXI", // 174 Transmit buffer empty
"SPI0_IDLE", // 175 Idle
"SPI0_ERI", // 176 Error
"SPI0_TEI", // 177 Transmission complete event
"SPI1_RXI", // 178 Receive buffer full
"SPI1_TXI", // 179 Transmit buffer empty
"SPI1_IDLE", // 180 Idle
"SPI1_ERI", // 181 Error
"SPI1_TEI", // 182 Transmission complete event
"SCE_PROC_BUSY", // 183
"SCE_ROMOK", // 184
"SCE_LONG_PLG", // 185
"SCE_TEST_BUSY", // 186
"SCE_WRRDY_0", // 187
"SCE_WRRDY_4", // 188
"SCE_RDRDY_0", // 189
"SCE_INTEGRATE_WRRDY", // 190
"SCE_INTEGRATE_RDRDY", // 191
};
/***** SETUP *****/
void setup(){
pinMode(13, OUTPUT); // D13:P111 LEDポート出力に
Serial.begin(9600); // 9600BPSで出力
while (!Serial); // USB接続チェック
Serial.println("ELC_EVENT01"); // タイトル
// 追加割り込み処理 ★あれこれ記述してみる
Serial1.begin(9600); // シリアル1 9600BPSで
tone(8, 10000, 0); // D8へ10kHz出力
Wire.begin(); // I2C
}
/***** LOOP *****/
void loop(){
int i;
volatile uint32_t d, *p;
char str_bff[80]; // 文字出力用バッファ
p = (volatile uint32_t *)0x40006300u; // IELSR先頭
for(i = 0; i < 32; i++){ // 32個
d = *p; // IELSRの内容
sprintf(str_bff, "%2d %08LX %02X %s",
i, // 番号 0~31
p, // IELSRアドレス
d & 0xFF, // ICUリンク番号
elc_event_msg[d & 0xFF]); // リンク説明
Serial.println(str_bff);
p++;
}
Serial.println("Stop");
while(1){
R_PORT1->PODR_b.PODR11 = !(R_PORT1->PODR_b.PODR11); // D13トグル
}
}


こんな出力が得られます。

ELC_EVENT01
0 40006300 33 USBFS_INT USB関連
1 40006304 34 USBFS_RESUME
2 40006308 31 USBFS_FIFO_0
3 4000630C 32 USBFS_FIFO_1
4 40006310 1E AGT0_INT delayやmillis用1msタイマ
5 40006314 A4 SCI2_TEI serial1関連
6 40006318 A5 SCI2_ERI
7 4000631C A3 SCI2_TXI
8 40006320 A6 SCI2_AM
9 40006324 7D GPT4_COUNTER_UNDERFLOW tone()
10 40006328 3B IIC1_TXI    I2C関連
11 4000632C 3A IIC1_RXI
12 40006330 3C IIC1_TEI
13 40006334 3D IIC1_ERI
14 40006338 00 -
15 4000633C 00 -
16 40006340 00 -
17 40006344 00 -
18 40006348 00 -
19 4000634C 00 -
20 40006350 00 -
21 40006354 00 -
22 40006358 00 -
23 4000635C 00 -
24 40006360 00 -
25 40006364 00 -
26 40006368 00 -
27 4000636C 00 -
28 40006370 00 -
29 40006374 00 -
30 40006378 00 -
31 4000637C 00 -
Stop

最初の4つがSerial.begin()でのUSB通信関連。
そしてAGTを使った1ms割り込み。delayやmillisを処理します。
そしてsetupの中に入れたSerial1.begin() の割り込みが4つ。
番号9がtone()。
GPT4のアンダーフロー割り込みが有効になっているのだと推測
できます。
最後が「Wire.begin()」によるI2C関連が4つ。

まだまだ勉強不足です。


※割り込みが足りなくなるかも・・・
IELSRは0~31の32個。
割り込みベクトルに直接飛ぶんじゃない(ようだ)。
割り込みの数、足りなくなる?
仕事で使ったcortex M4 STM32F407となんか違う。

※追記
Arduino UNO R4のシリアル通信ポートを増やす

この記事に、Serialとserila1以外にシリアルポートを2つ増やす
方法が記述されていたんで、前述のスケッチに追記してみ
ました。

最初のヘッダーファイルのところにこの2行。
  UART Aux0(A4, A5);
  UART Aux8(11, 12)
そしてsetup()にこの2行。
  HeySeri1.begin(115200); //A4, A5ポートを使った追加のシリアル通信
  HeySeri2.begin(115200); //11, 12ポートを使った追加のシリアル通信

結果、イベントリンクが8つ増えて、空き残が10個に。
ELC_EVENT01
0 40006300 33 USBFS_INT
1 40006304 34 USBFS_RESUME
2 40006308 31 USBFS_FIFO_0
3 4000630C 32 USBFS_FIFO_1
4 40006310 1E AGT0_INT
5 40006314 A4 SCI2_TEI
6 40006318 A5 SCI2_ERI
7 4000631C A3 SCI2_TXI
8 40006320 A6 SCI2_AM
9 40006324 7D GPT4_COUNTER_UNDERFLOW
10 40006328 3B IIC1_TXI
11 4000632C 3A IIC1_RXI
12 40006330 3C IIC1_TEI
13 40006334 3D IIC1_ERI
14 40006338 99 SCI0_TEI
15 4000633C 9A SCI0_ERI
16 40006340 98 SCI0_TXI
17 40006344 9B SCI0_AM
18 40006348 A9 SCI9_TEI
19 4000634C AA SCI9_ERI
20 40006350 A8 SCI9_TXI
21 40006354 AB SCI9_AM
22 40006358 00 -
23 4000635C 00 -
24 40006360 00 -
25 40006364 00 -
26 40006368 00 -
27 4000636C 00 -
28 40006370 00 -
29 40006374 00 -
30 40006378 00 -
31 4000637C 00 -
Stop

「ACIn_AM」って何だろ?
  アドレス一致イベント:調歩同期式モードにおいて
  比較データと受信データの1フレームが一致したとき
だと

 

| | コメント (0)

DDS IC「AD9833」の出力にバッファアンプを #2

2025年5月27日:DDS IC「AD9833」の出力にバッファアンプを
この記事でチラリと書いた、高速オペアンプ。

この時は手持ちの「AD823」を使いました。
その後、OPA2863(バイポーラのdual op-amp)と
OPA810(SOT23のsingle FET入力OP-AMP)とを手
に入れて比較してみました。

AD823
 FET-input
 Output swings rail-to-rail
 -3dB bandwidth of 16MHz, G = +1
 Slew rate of 22V/μs
 maximum input bias current: 25pA

OPA2863
 rail-to-rail input and output,
 Unity-gain bandwidth: 110MHz
 Gain-bandwidth product: 50MHz
 Slew rate: 105V/μs
 Input bias current: 300nA

OPA810
 FET-input
 Rail-to-rail input and output
 Small-signal bandwidth: 140MHz
 Gain-bandwidth product: 70MH
 Slew rate: 200V/μs
 Input bias current: 2pA

AD9833 DDS ICが出す出力波形は、
  正弦波、三角波、方形波が
選べます。
正弦波と三角波は、L電圧が0.038V、H電圧が0.65Vで
P-P値で0.6Vほど。
方形波にすると、0V~5Vのフルスイング波が出てきちゃう
のです。
こんな回路でバッファしたので、方形波を出すとAMP1が
飽和してしまいます。
Cc05
3種のアンプで、出力波形がどうなるか、方形波を
出力して比較してみました。
Cc02
それぞれの波形、
  上からDDS出力につながるAMP1の+入力。
  真ん中がAMP1の出力。
  下が出力波形。 (AMP2は反転増幅)
AD823は1MHzになるとまともな波形が出てきません。
  ※正弦波だとレベルは下がるけどちゃんと
   見えます。
他の二つはさすがに高速アンプ。
飽和した方形波でも頑張って出してくれました。

DigiKey調べだと
 AD823  1400円  昔はもっと安かった
 OPA2863 360円
 OPA2810 730円
  (実験で使ったのはsingleのOPA810を二つ)

OPA2863がリーズナブルでしょか。
ただし、バイポーラなんで入力バイアス電流が300nAと
だいぶと大きいです。
汎用のLM358の入力バイアス電流が20nAですんで、
15倍の差があります。
  LM1458は200nA。
帰還抵抗をあまり大きくできません。
バイアス電流の小さなFET入力のだと、自由に決められるんで
便利です。

| | コメント (0)

«「タカチ」の「ゴム足」にもの申す!