Проблема с мультиплексором CD74HC4067 при высоких значениях.

У меня возникла небольшая проблема с мультиплексором/демультиплексором CD74HC4067: я использую его для получения данных от массива датчиков (на данный момент у меня их всего 2, но в ближайшем будущем их будет больше). В частности, у меня есть датчик света и датчик звука.

Выход мультиплексора подключен к A0, поскольку показания, которые я делаю, являются аналоговыми. Для переключения каналов я использую контакты A3 и A2 (когда прибудут другие датчики, для этого будет выделен и A1).

Моя проблема в том, что при переключении между одним каналом и другим мои показания сильно колеблются, но только тогда, когда значение показания > 500 или около того, и я не понимаю почему. В простом скетче я попробовал добавить некоторую задержку (40 мс), и проблема исчезла. Но в моем проекте, который гораздо более сложен и использует также другие аналоговые каналы, мне нужна задержка примерно в 1 секунду, чтобы получить правильные показания, что абсолютно неприемлемо, поскольку мне нужно, чтобы он работал в реальном времени (почти). Я также пытался использовать цифровые контакты для управления мультиплексором, но безуспешно. Единственное, что, кажется, все стабилизирует, - это подключение конденсатора между выходом MUX и землей и использование задержки 20 мс, но это работает лишь на некоторое время.

Надеюсь, я выразился достаточно ясно и кто-нибудь сможет указать мне правильный путь!

РЕДАКТИРОВАТЬ:

Вот схема Schematic

(Ошибка на рисунке: «temp» на самом деле является «датчиком освещенности», как указано внизу поста...)

И мой код:

#define MUX A0
#define S0 A2
#define S1 A3

void setup() {
  Serial.begin(9600);
  pinMode(S0, OUTPUT);
  pinMode(S1, OUTPUT);
  
  selectMux(1);
}

void loop() {
  
  //selectMux(0);
  //Serial.println(analogRead(MUX));
  //selectMux(1);
  Serial.println(analogRead(MUX));

}

void selectMux(byte port) {
//  pinMode(MUX, mode);
  int r0 = bitRead(port, 0);
  int r1 = bitRead(port, 1);
  
  digitalWrite(S0, r0);
  digitalWrite(S1, r1);
  analogRead(MUX);
}

analogRead(MUX) в функции selectMux был добавлен, потому что я прочитал в сообщении, что они предлагали сделать это, чтобы получить более точные показания. В этом коде уже колеблются только результаты:

Output:
76
41
77
76
76
75
36
75
74
76
77
106
76
76
76
76

но это сходит с ума, когда входное напряжение выше, близко к 5 В:

Output:
948
780
340
948
948
635
437
949
948
499
551
949
950
396
684
950

Если вы включите закомментированный код, который начнет переключать выходы, будет еще хуже. Как я уже сказал, добавление задержек помогает, но в моем окончательном приложении я не могу позволить себе задержку в 1 с.

Я также показываю, что в схеме есть таймер, который использует другие аналоговые контакты, но в код я не включил эту часть. Если нужно, я это тоже добавлю.

Датчик звука, Датчик освещенности

, 👍1

Обсуждение

Было бы полезно опубликовать свой код и схему, даже если вы просто нарисуете его карандашом и отсканируете. Меня будет интересовать именно код. Пожалуйста, внесите изменения в свое сообщение и включите его. Насколько это возможно, сократите его до [Минимального, полного и проверяемого примера](http://stackoverflow.com/help/mcve). Спасибо!, @Nick Gammon

Хорошо, сделаю, спасибо! На данный момент я не могу ничего публиковать, поэтому вернусь через несколько часов! Ваше здоровье :), @Luca

@NickGammon добавил схемы и очень простой код, который работает с ошибками :), @Luca

Я не думаю, что вам следует оставлять s2 и s3 плавающими. Подключите их к земле., @Gerben

Это сработало! Если подумать, плавающая булавка не означает ни 0, ни 1, так что да, я был наивен, упустив эту деталь! Большое спасибо :), @Luca

@Gerben - возможно, добавь это как ответ с дополнительной информацией. Кажется, это сработало., @RSM


1 ответ


Лучший ответ:

2

Я не думаю, что вам следует оставлять s2 и s3 плавающими. Плавающий выход не означает ни 0, ни 1.

Подключите их обоих к земле.

,