2016年11月28日月曜日

SVF(State Variable Filter)をブレッドボードで実験。WaveGeneとWaveSpectraで周波数特性を見てみる。

前回LTSpiceでSVFのシミュレーションをしてまあまあうまくいきそうだったので、ブレッドボードで実験してみた。

電源電圧を±5V、OPAMPをNJM4580、CRの定数を手持ちのものの値に変更して再度シミュレーション。

回路図

AC解析

配線図


NJM4580の片チャンネルだけ使って実験してみた。

実測値

名称 実測値 備考
R1 992.4Ω
R2 19.992kΩ Q設定
R3 9.843kΩ
R4 9.987kΩ
R5 14.887kΩ 周波数設定
R6 14.904kΩ 周波数設定
C1 9.766nF
C2 9.747nF

WaveGeneとWaveSpectraで周波数特性を測定


WaveGeneのユーザー波形でサンプル数32768のFLATSWEEP_032768.WAVを読み込ませ、WaveSpectraのFFTのサンプル数を32768、窓関数を「なし(矩形)」にして測定した。計測の途中で入力オーバーで歪んだりしたので入出力レベルを調整した。なので、レベル(RMS)に関しては正しく見れない。

Loop Back (オーディオインターフェースの入力と出力を直結)

いつもの通り高域で出力レベルが落ちている。「オーディオ・インタフェースの出力特性の劣化?(TASCAM US-144MKII)」でオシロを使ってUSBオーディオインターフェースからの出力を見る実験をして、オーディオインターフェースの劣化かな?と思っていたが、「迷走の果て・Tiny Objects」さんの「AD9850 DDSモジュールを試す(9) またまたフィルタの変更とsinc関数」の記事を読むと、もしかするとDAC特有の問題が原因かもしれない?という気がしてきた。

R5、R6の値を変えて周波数を変更


R5 = R6 = 15kΩ、R2 = 20kΩ

理論値で、fc = 1 / (2 * pi * C * R) ≒ 1061.6(Hz)

LPF

BPF

HPF

LP/BP/HPでカットオフ周波数/共振周波数がちょっとずつずれている。

R5 = R6 = 1kΩ、R2 = 20kΩ

fc = 1 / (2 * pi * C * R) ≒ 15,924(Hz)

実測値:
R5: 991.5Ω
R6: 989.2Ω

LPF

BPF

HPF

R5 = R6 = 100kΩ、R2 = 20kΩ

fc = 1 / (2 * pi * C * R) ≒ 159.24(Hz)

実測値:
R5: 99.69kΩ
R6: 100.46kΩ

LPF

BPF

HPF

R2の値を変えてQを変更


R5 = R6 = 15kΩ、R2 = 1kΩ


実測値:
R2: 989.2Ω


R5 = R6 = 15kΩ、R2 = 10kΩ


実測値:
R2: 9.895kΩ


R5 = R6 = 15kΩ、R2 = 100kΩ


実測値:
R2: 99.67kΩ



R5 = R6 = 15kΩ、R2 = Open



R2を取り去ってみた。Qはかなり上がるが、発振はしない。安定してるな~

ベースマシン パターンの保存(EEPROM使用)

SDカードではなく、EEPROM(AT24C1024B)を使ってシーケンスパターンをSave/Load出来るようにしてみた。

追加機能:

  • シーケンスパターンのSave/Load (16Slot)
  • パターンのCopy/Paste


配線図


mbed repository:

BaseMachineUIController Test
https://developer.mbed.org/users/ryood/code/BaseMachine_UIController_Test/ Revison:14

BaseMachine
https://developer.mbed.org/users/ryood/code/BaseMachine/ Revision:16

2016年11月25日金曜日

I2C EEPROM(AT24C1024B)をArduino UnoとNucleo F401RE(mbed)で使う。

1MbitのI2C EEPROMのAT24C1024Bの手持ちがあったのでテストしてみた。

仕様としては、I2C接続で電源電圧は2.5V~5.5VなのでArduinoでもNucleoでも気軽に使える。

書き込みはバイト単位、ページ単位、読み込みはランダムリードとシーケンシャルリードができる。

メモリの構成は、512Page × 256Byteになっていてアドレス指定は17bitで行う。

バイト単位の書き込み


1byte目 デバイス・アドレス ( 0x1010 | A2 | A1 | P0 | W )
2byte目 上位アドレス
3byte目 下位アドレス
4byte目 書き込みデータ

となっていて、1byte目のデバイスアドレスは、0x1010は固定、A2/A1はピンの接続と合わせて指定する(1個だけ使う場合はGNDに落として0を指定すると楽)。アドレス17bitのうち最上位1bitをP0で指定する。

バイト単位の読み込み


読み込みの場合は書き込みの1~3byte目と同じものをWモードで送信してアドレスを指定。4byte目のデータは送らずに、再びSTARTコンディションにしてRモードでデバイスアドレスを送信するとデータが返ってくる仕様。

Arduino


配線図


デバイスアドレスのA1/A2はGNDに落とし、I2CのSCL、SDAは1kΩでプルアップした。

ライブラリはArduinoのPlaygroundの「Arduino AT24C1024 I2C EEPROM Library」を使わせてもらった。(バイト単位の読み書きのみに対応)

http://playground.arduino.cc/Code/I2CEEPROM24C1024
https://github.com/jwhiddon/AT24C1024

ExampleのAT24C1024_EEPROM_Benchmarkをそのまま動作させることができた。全アドレスを読み書きするのでシリアル・コンソールにしばらく何も表示されないが、少し待てば「.」が表示されていく。

シリアル出力結果

AT24C1024 EEPROM Library Benchmark Sketch
--------------------------------
Write By Byte Test:
Writing data:...........................DONE
Total Time (seconds): 722
Write operations per second: 181
--------------------------------
--------------------------------
Read By Byte Test:
Reading data:..
Address: 9265 Should be: 25 Read val: 255
.........................DONE
Total Test Time (secs): 82
Read operations per second: 1598
Total errors: 1
--------------------------------

書き込みは181Byte/s、読み込みは1,598Byte/sで、1バイト読み書きに失敗したようだ。

I2C通信のようす

書き込み

ch1:SDA ch2:SCL

読み込み

Nucleo F401RE(mbed)

配線図


こちらも1kΩでプルアップ。

ライブラリはKenji Araiさんの「AT24C1024」ライブラリ(https://developer.mbed.org/users/kenjiArai/code/AT24C1024/)を使わせてもらった。こちらはページ単位の読み書きにも対応している。

テスト・プログラム main.cpp

#include "mbed.h"
#include "AT24C1024.h"

I2C         i2c(D14, D15);      // SDA, SCL
AT24C1024   at24c1024(i2c);     // Atmel 1Mbit EE-PROM

DigitalOut led1(LED1);

int main()
{
    printf("\r\n*** AT24C1024 Test ***\r\n");

    // Byte Read/Write
    // 
    uint8_t dt = 0x55;
    printf("Byte Write: %02x\r\n", dt);
    at24c1024.write(0, dt);     // write addr=0 data=dt
    wait_ms(5);
    dt = at24c1024.read(0);     // read addr=0
    printf("Byte Read: %02x\r\n", dt);

    // Page Read/Write
    // 
    uint8_t eep_buf[258];
    for (int i = 0; i < 256; i++) {
        eep_buf[i] = i;
    }
    printf("Page Write: 0..255\r\n");
    AT24C_STATUS status = at24c1024.write_page(0x1ff00, eep_buf, sizeof(eep_buf));
    wait_ms(5);
    printf("Status: %d\r\n", status);
    printf("Page Read:\r\n");
    status = at24c1024.read_page(0x1ff00, eep_buf, sizeof(eep_buf));
    printf("Status: %d\r\n", status);
    for (int i = 0; i < sizeof(eep_buf); i++) {
        printf("%d ", eep_buf[i]);
    }
    printf("\r\n");

    while(1) {
        led1 = !led1;
        wait(0.2);
    }
}

AT24C1024のWriteはDATASHEETを見ると5msかかるようなのでwait_ms(5)を入れている。waitをかけないと読み込みに失敗する。また、ページ単位の読み書きのバッファ、はメンバ関数内部でI2C通信用に2バイト使うので258バイト確保する必要がある。データはインデックス0から埋める。

<追記:2016.11.25>

write_page()とread_page()はエラーステータス(AT24C_STATUS)を返しますが、I2C通信がうまくいったかどうかは見ない仕様のようです。AT24C_OK = 0が返ってきても通信が失敗している場合もあります。

</追記>

I2C通信のようす


ch1:SDA ch2:SCL

メモ:


SDカードに比べるとR/Wの速度は遅いが、実装面積が節約できるし値段も安い。1Mbitの品種を使っているが、ベースマシンのデータ保存用ならそんなには必要ない。

2016年11月22日火曜日

Nucleo F401RE(mbed)でSDカードを使う

Nucleo F401REでSDカードを動作させてみた。以前、Arduinoで動かせたので(「ArduinoでSDカードを使ってみる。74HC4050でレベルシフト」)軽く考えていたが結構ハマってしまった。

まず、mbedオフィシャルの「SDFileSystem https://developer.mbed.org/users/mbed_official/code/SDFileSystem/」はうまく動かせなかった。SPI信号は出力されるようだが、カードを認識してくれなかった。

かなりあ~だこ~だやった末、Neil Thiessenさんがre-writtenされたバージョンのSDFileSystem (https://developer.mbed.org/users/neilt6/code/SDFileSystem/)で動作させることができた。

配線図



Nucleoは3.3V駆動なので信号線は直結した。

mbed repository:
https://developer.mbed.org/users/ryood/code/SDFileSystem_Test/

main.cpp

/*
 * SDFileSystem Test
 * 
 * Library
 * SDFileSystem: https://developer.mbed.org/users/neilt6/code/SDFileSystem/ Revision:26
 * mbed: Revision: 124
 *
 * 2016.11.22 created
 *
 */

#include "mbed.h"
#include "SDFileSystem.h"

//Create an SDFileSystem object
SDFileSystem sd(D11, D12, D13, D10, "sd");

int main()
{
    //Mount the filesystem
    sd.mount();

    //Perform a write test
    printf("\nWriting to SD card...");
    FILE *fp = fopen("/sd/sdtest.txt", "w");
    if (fp != NULL) {
        fprintf(fp, "We're writing to an SD card!");
        fclose(fp);
        printf("success!\n");
    } else {
        printf("failed!\n");
    }

    //Perform a read test
    printf("Reading from SD card...");
    fp = fopen("/sd/sdtest.txt", "r");
    if (fp != NULL) {
        char c = fgetc(fp);
        if (c == 'W')
            printf("success!\n");
        else
            printf("incorrect char (%c)!\n", c);
        fclose(fp);
    } else {
        printf("failed!\n");
    }

    //Unmount the filesystem
    sd.unmount();
}

APIドキュメントに載っているExampleから

SDFileSystem sd(D11, D12, D13, D10, "sd");

とNucleoのArduino HeaderのPinNameに変更した。

I/OエキスパンダーのMCP23S17とSPIバスを共用するテスト


製作中のベースマシンで使う予定だが、3つあるSPIをすでに全部使ってしまっている。

SPI1: シンセの制御
SPI2: Graphic LCD
SPI3: I/Oエキスパンダー

SPI1はシンセ本体用なのであまり他と干渉させたくないし、SPI2のLCDも処理が重いので専用にしたい。I/Oエキスパンダーが一番余裕がありそうなのでSPI3を共用することにした。

が、SDFileSystemは

SDFileSystem (PinName mosi, PinName miso, PinName sclk, PinName cs, const char *name, PinName cd=NC, SwitchType cdtype=SWITCH_NONE, int hz=1000000)

とPinNameを渡してSPIオブジェクトをコンストラクタ内で生成し、privateなメンバ変数として持つ仕様になっているのでそのままでは共用(アクセス)できない。

しかたがないので、

    SPI* SpiPointer() { return &m_Spi; }

というアクセサを追加して、外部からSPIオブジェクトを参照出来るようにした。ホントは人様の作ったライブラリに手を入れるのは好ましくないが、慎重に使うことにする。

配線図


mbed repository:
https://developer.mbed.org/users/ryood/code/SDFileSystem_Bin_Test/

main.cpp

/*
 * SDFileSystem Binary R/W Test
 *
 * Library
 * SDFileSystem: https://developer.mbed.org/users/neilt6/code/SDFileSystem/ Revision:26
 * mbed: Revision: 124
 * mbed-rtos: Revision: 117
 *
 * 2016.11.22 created
 *
 */
 
#include "mbed.h"
#include "rtos.h"
#include "SDFileSystem.h"
 
#include "ExioMcp23s17.h" 
#include "ExioInBuffer.h"
#include "ExioBufferedIn.h"
#include "ExioBufferedDebounceIn.h"
 
typedef struct {
    uint8_t x;
    uint8_t y;
    uint8_t z;
} DataT;
 
//SPI Spi(PC_12, PC_11, PC_10); // SPI3: mosi, miso, sclk
SDFileSystem sd(PC_12, PC_11, PC_10, PA_14, "sd"); // SPI3: mosi, miso, sclk, cs
 
void writeSD(DataT* data)
{
    //Mount the filesystem
    sd.mount();
 
    //Perform a write test
    printf("\r\nWriting binary data to SD card...");
    FileHandle* file = sd.open("Test File.bin", O_WRONLY | O_CREAT | O_TRUNC);
    if (file != NULL) {
        if (file->write(data, sizeof(*data)) != sizeof(*data)) {
            error("write error!\r\n");
        }
        if (file->close()) {
            printf("failed to close file!\r\n");
        } else {
            printf("done!\r\n");
        }
    } else {
        printf("failed to create file!\r\n");
    }
 
    //Unmount the filesystem
    sd.unmount();
}
 
void readSD(DataT* data)
{
    //Mount the filesystem
    sd.mount();
 
    //Perform a read test
    printf("\r\nReading binary data from SD card...");
    FileHandle* file = sd.open("Test File.bin", O_RDONLY);
    if (file != NULL) {
        if (file->read(data, sizeof(*data)) != sizeof(*data)) {
            error("read error!\r\n");
        }
        if (file->close()) {
            printf("failed to close file!\r\n");
        } else {
            printf("done!\r\n");
        }
    } else {
        printf("failed to open file!\r\n");
    }
 
    //Unmount the filesystem
    sd.unmount();
}
 
int main()
{
    DataT data, rdata;
 
    data.x = 0xff;
    data.y = 0x55;
    data.z = 0xaa;
 
    printf("*** Test SDFileSystem & ExioBufferedDebounceIn ***\r\n");
    
    // ExioMcp23s17(int hardwareaddress, SPI& spi, PinName nCs, PinName nReset);
    ExioMcp23s17 Exio(0x00, *sd.SpiPointer(), PD_2, PA_13);
    
    // Reset MCP23S17 (初期化時にreset()が必要)
    Exio.reset();
 
    ExioInBuffer inBufferB(&Exio, ExioPortB);
    ExioBufferedDebounceIn inB[] = {
        ExioBufferedDebounceIn(&inBufferB, 0),
        ExioBufferedDebounceIn(&inBufferB, 1),
        ExioBufferedDebounceIn(&inBufferB, 2),
        ExioBufferedDebounceIn(&inBufferB, 3),
        ExioBufferedDebounceIn(&inBufferB, 4),
        ExioBufferedDebounceIn(&inBufferB, 5),
        ExioBufferedDebounceIn(&inBufferB, 6),
        ExioBufferedDebounceIn(&inBufferB, 7)
    };
 
    // Start Timers
    inBufferB.run(10);
    for (int i = 0; i < 8; i++) {
        inB[i].set_debounce_us(10000);
    }
 
    // SDカードの読み書きの前にExioのSPIアクセスを停止
    inBufferB.stop();
      
    writeSD(&data);
    readSD(&rdata);
    
    // ExioのSPIアクセスを再開
    inBufferB.run(10);
 
    printf("data: x:%02x y:%02x z:%02x\r\n", rdata.x, rdata.y, rdata.z);
    
    while(1) {
        uint8_t x = 0;
        for (int i = 0; i < 8; i++) {
            int vb = inB[i].read();
            x |= (vb << i);
        }
        if (x != 0 && data.x != x) {
            data.x = x;
            printf("Write to SD: x:%02x y:%02x z:%02x\r\n", data.x, data.y, data.z);
            // SDカードの読み書きの前にExioのSPIアクセスを停止
            inBufferB.stop();
            writeSD(&data);
            readSD(&rdata);
            // ExioのSPIアクセスを再開
            inBufferB.run(10);
            printf("Read from SD: x:%02x y:%02x z:%02x\r\n", rdata.x, rdata.y, rdata.z);
        }
    }
}

MCP23S17は通信コストを下げるためにバッファリングするようにした自作のExioBufferedControllerライブラリを使った。ExioBufferedDebounceInクラスはチャタリング対策したもの。

オブジェクトの生成がかなりめんどくさいことになっているが、SPIオブジェクト(の参照)を渡して初期化できるようになっている。

SPIバスを共用するのでSDカードを使う場合は、

inBufferB.stop();

としてSPI経由のMCP23S17への定期的な問い合わせを停止する。

また、SDカードの読み書きは低レベルなファイルハンドルを使ってバイナリの読み書きをしている。

SDカードとMCP23S17のCS

ch1: MCP23S17 ch2:SD

波形が込み入っているが、SDカードに読み書きしている間はMCP23S17のCSはhiになっていて問い合わせは停止している。

メモ:


SPIバスを共用しているのでSDカードの読み書き中はI/Oエキスパンダー経由の入力は受け付けなくなる。

SDカードの読み書きはファイルを変えていくつかのパターンを保存できるようにしたい。(ファイル名は単純に番号を振ればいいか?)

2016年11月20日日曜日

SVF(State Variable Filter)のシミュレーション その2

SVFについてわかりやすく解説されている「Electronics Tutorials」を読んでみた。英語だがDeep LarningでGoogle翻訳の精度が上がったらしいのでコピペで翻訳しながら。

いやほんと翻訳の精度あがってるわこれ

結論だけまとめると


C=C1=C2、R=R5=R6とすると、カットオフ周波数は

fc = 1 / (2 * pi * C * R)

で決まる。

カットオフ周波数fcは他のCR類と独立しているのでCを10nF(0.01uF)で固定するとR5、R6を同じ値で変化させると変更できる。

シミュレーション回路図

R5、R6の値をRfcとしてパラメータ解析してみた。

AC解析

Qや増福率に影響を与えずカットオフ周波数を可変できている。見難くなるのでLPFの出力しか表示していないが、HPFもLPFもちゃんと周波数可変できている。

フィルタのQ(レゾナンス)は、

で決まる。R3=R4=10kΩで固定すると

Q = ( R1 * (10kΩ + 10kΩ) / ( 10kΩ * (R1 + R2) )
   = (2 * R1) / (R1 + R2)

となるので分母にだけ現れるR2を変化させてみた。

シミュレーション回路図

AC解析

カットオフ周波数は変わらずにQが変化している。

DCレベルでは+8dB程度までで増幅率が変化しているが、発振はしないようだ。

DCレベルの増幅率は

A0 = (R2 * (R3 + R4)) / (R3 * (R1 + R2))

で決まるようなので、これもR3=R4=10kΩで固定すると

A0 = (R2 * 20kΩ) / (10kΩ * (R1 + R2))
     = (2 * R2) / (R1 + R2)

R1 = R2のとき増幅率は1で一定になるが、Qも1になってしまうので、R1とR2のどちらかを可変にしてQを制御したほうが良さそうだ。

メモ:


カットオフ周波数付近では40dB(100倍)近くまで増幅率が上がっても発振はしない感じだ。VCVS LPFが3倍で発振するのと比べるとおとなしいフィルタなのかも。

<追記:2016.11.22>

VCVS LPFが発振する増幅率もDCレベルでした。DCレベルの増幅率で3倍(10dB程度)です。

参考:「デジタル・ポテンショメータでLPFのQをコントロールする

</追記>

LPF/HPF/BPFが同時に得られて、あと1つOPAMPを使った回路を追加すればノッチフィルタもできるようだ。

積分器2個と加算/減算回路1個でこんなフィルタが作れるとは驚き(@@;

2016年11月18日金曜日

SVF(State Variable Filter)のシミュレーション

ベースマシンのフィルタにはVCVS DCFを使っていてそれなりにいい感じだが、フィルタを取り替えて出音の違いが出るかどうか試してみたい。

普通のフィルタはいらない帯域を削る目的で使うが、シンセの場合はポジティブ・フィードバックをかけてQをあげて発振すれすれでギョンギョンいわせるのが結構重要。

Moog Ladder Filterもデジタル制御してみたいけどまだちゃんと実験できるかどうか自信がない。

選択肢を増やす意味でもSVFフィルターのシミュレーションをしてみた。

参考にしたのはElectronics Tutorialsというサイト
http://www.electronics-tutorials.ws/filter/state-variable-filter.html

英語だし数式がいっぱい出てくるのでちゃんと読んでなくて、書いてある回路図の定数通りでやってみた。

回路図


AC解析

緑がハイパス、青がバンドパス、赤がローパス。Qがすごくあがっているが、掲載されているグラフと似た感じだ。

周波数帯域やQを決めるにはちゃんと読まないとダメそうだが、難しい微分方程式やラプラス変換は出てこないようなのでなんとかなる?

2016年11月17日木曜日

ベースマシン ファームウェアの改良


やったこと


シーケンスパターンの切り替えの実装

休符時にブツブツ言うのを修正
単純にプログラム・ミスでした。

アクセントレベルの変更
Duration(音符長)とのからみで、まだあまり効果的ではないようなので調べる

mbed repository:
https://developer.mbed.org/users/ryood/code/BaseMachine/ Revision:8

冬コミも行けそうにないので、音出しのライブ配信をUstreamかツイキャスでしてみようと思っています。汚い部屋での作業風景だとおもいますが、準備できたら告知します。

メモ:


SDカード?にパラメータを保存

I/Oエクスパンダーにもう少しスイッチやロータリーエンコーダをつなげてみる

SequenceSender ClassからDCOの制御を分離することを検討

リズム・マシンとのSyncを検討

2016年11月14日月曜日

ベースマシンでMCP23S17を使う&SPIバス・バッファ(TC74HC541)基板を使う。

I/OエキスパンダーのMCP23S17を使ってIOピンを増やしてみた。

配線図

ファームウェア
BaseMachineUIControler Classのテスト
https://developer.mbed.org/users/ryood/code/BaseMachine_UIController_Test/ Revision:7

BaseMachine本体
https://developer.mbed.org/users/ryood/code/BaseMachine/ Revision:4

UI系ボード


ブレッドボード上のMCP23S17につなげたのはタクトスイッチを8個並べたもので、再生中のシーケンスパターンを切り替える予定。まだパターン切替の機能は実装していないが、MCP23S17から値を読み取ってLCDに表示するところまでは動作確認した(^q^/

MCP23S17の仕様としては単体でもあと8bit増やせるし、MCP23S17を何個か並べてデバイスのアドレスを指定すれば16bit×8まで信号線を増やさずに拡張できるようだ。 

Synth系ボード


NucleoのSPI出力はSPIバスバッファに入れてDCO、DCF、DCAに分配する。SPIバスバッファから信号が出力されているのと、DCOが制御できているのを確認した。


2016年11月12日土曜日

SPIバス・バッファ(TC74HC541)基板の製作

ブレッドボードで実験しているとケーブルが抜けたりしてややこしいので、以前考えていた基板を作ってみた。(ほんとはプログラミングするのに疲れたので息抜き(^q^;)

回路図

基板図

使いやすいようにピンヘッダを変更。バス・バッファと状態表示用のLEDx8のGNDを分離。

Github:
https://github.com/ryood/BaseMachine/tree/master/SPI%20Bus%20Buffer

部品面

TC74HC541の出力に入れるダンピング抵抗は値を変更できるようにピンヘッダを使って実装した。写真はブレッドボード用のジャンパを使ってショートした状態。

出力は4系統のピンソケットと測定用のピンヘッダ。

ハンダ面

ジャンパ配線がないのではんだ付けは楽ちん。ピンソケットが格子状になっているところはハンダブリッジだけでつなぐのは至難の技なので抵抗とうの切った足を中に仕込んでいる。

ダンピング抵抗のテスト



NucleoからSPI信号を出力してArduinoで受信するようにテストプログラムを書いて実験してみた。赤色LEDはSPIバス・バッファとは全く関係なくて基板面積が余ったのでベースマシンのデバッグ用に載せてみた。

ダンピング抵抗の値を変えつつ、SPIのSCK信号を拾ってみた。(東芝製TC74HC541AP使用)

0Ω (ショート)

ch1:74HC541の入力 ch2:ダンピング抵抗からの出力

22Ω

33Ω

47Ω

68Ω

100Ω

TC74HC541を通すとダンピング抵抗を入れなくても波形の暴れは抑えられるが、20ns秒程度遅れるようだ。

100Ωは波形のなまりが顕著だが、その他は評価が難しい。とりあえずショートさせた状態で様子見しようかな?

東芝製TC74HC541APと日立製HD74HC541Pの比較


同じ74HC541でも型番によってDATASHEETのスペックが少し違う。aitendoでHD74HC541Pを仕入れてみたので比較。どちらもダンピング抵抗は0Ωにして測定した。

東芝製TC74HC541AP (50円@秋月)


日立製HD74HC541(100円@aitendo)

これも評価が難しい(@@;