16ch Analog Multiplexer CD74HC4067を使った
📌

16ch Analog Multiplexer CD74HC4067を使った

Tags
Research
Published
August 5, 2019
日付8/5

CD74HC4067(16ch Analog Multiplexer)を使った

以前のMCP3208で通信ができなかったので、今回は基本的に通信を必要としないCD74HC4067を使ってアナログを16ch読むことにした。
notion image
Aliexpressで一個56円で購入した。届くまでに2週間ほどかかった。
左にピンが16個、右は8個。右のS0,S1,S2,S3にデジタル信号を入力し、16パターンの信号で左側の16ピンのうち、どのピンを使うかを選択する、Zというピンに選択したピンの状態が反映される。出力、入力どちらとも可能である。デジタルピン5本でリレー16個制御したり、2つこのICがあれば16個の相手とUARTで通信することも可能である。色々と使えそうなICだという印象だ。

実際に使ってみた

notion image
今回はアナログを16個読みたかったのでそれの実験をした。D8,9,10,11のピンをS0,1,2,3に接続して16パターンを表現します。それでどのピンを使うのかを選択してからA0をZにつないでそれぞれのアナログの値を読み取ります。
ピンがかなり多くて大変でした。

プログラム

こちらが今回使用したプログラムです。
#include "mbed.h" Serial pc(PA_2,NC); BusOut ADC16(D8,D9,D10,D11); AnalogIn analog(A0); uint16_t analogValue[16]; Timer timer; uint16_t delay; void readPins(){ timer.start(); timer.reset(); for(uint8_t i = 0; i < 16; i++) { ADC16 = i; //wait_us(1);//重要 analogValue[i] = (uint16_t)(analog.read()*1000); } delay = timer.read_us(); } int main(){ pc.baud(230400); while (1) { readPins(); pc.printf("Time:%d\t",delay); for (uint8_t i = 0; i < 16; i++) { pc.printf("%d\t",analogValue[i]); } pc.printf("\r\n"); } }
シリアル表示結果
今はCH1にセンサが繋がっています。ダイセンのホワイトラインセンサがついていて、
緑で100、白で700くらいの値が出ます
notion image
ご覧の通り、CH1以外のピンにはセンサが接続されていないのにも関わらず、CH1以降のピンにもなぜかセンサの値が継承されているように見えます。しかもその値は緩やかに減っていっています。ここから察するに、センサのコンデンサか何かに充電されていて、こうなっているのかと思いました。それか、チャンネル切り替えが早すぎるから、次のチャンネルに切り替えが間に合っていなくて、前のセンサの状態が継承されているのかと思いました。
#include "mbed.h" Serial pc(PA_2,NC); BusOut ADC16(D8,D9,D10,D11); AnalogIn analog(A0); uint16_t analogValue[16]; Timer timer; uint16_t delay; void readPins(){ timer.start(); timer.reset(); for(uint8_t i = 0; i < 16; i++) { ADC16 = i; wait_us(50);//重要 analogValue[i] = (uint16_t)(analog.read()*1000); } delay = timer.read_us(); } int main(){ pc.baud(230400); while (1) { readPins(); pc.printf("Time:%d\t",delay); for (uint8_t i = 0; i < 16; i++) { pc.printf("%d\t",analogValue[i]); } pc.printf("\r\n"); } }
次はwait_usの値を0から50にしてみました。
notion image
前よりはマシになりましたが、まだまだですね。よくないと思います。それに読みにかかる時間が以前よりもかなり増えて最悪です。
こんな感じで全くダメだったので、次にやったのはアナログが出てくるポート(Z)とグランドの間に抵抗を入れてプルダウンにしてみました。たまたま転がっていた330Ωをさしてみることにしました。
notion image
値は700前後から550前後に落ちましたが、wait_usがなくても継承されずに読み出しができています!!
プルダウンの効果は絶大だということがわかりました。
notion image
もう少し抵抗値を大きくして試してみたいと思います。

プルダウン抵抗3.3KΩ

白の時に値が700になりました。いい感じです。手持ちで多く持っているのが10Kと1Kなのでそこらへんでいい感じになれはいいなっていうのが僕の希望というか、なれば嬉しいなと思います。

結論

プルダウン抵抗をつければ結構いける。
16個読みも90us程度で読めるので優秀である。アナログの決定版。

Loading Comments...