Проблема с мультиплексором CD74HC4067 при высоких значениях.
У меня возникла небольшая проблема с мультиплексором/демультиплексором CD74HC4067: я использую его для получения данных от массива датчиков (на данный момент у меня их всего 2, но в ближайшем будущем их будет больше). В частности, у меня есть датчик света и датчик звука.
Выход мультиплексора подключен к A0, поскольку показания, которые я делаю, являются аналоговыми. Для переключения каналов я использую контакты A3 и A2 (когда прибудут другие датчики, для этого будет выделен и A1).
Моя проблема в том, что при переключении между одним каналом и другим мои показания сильно колеблются, но только тогда, когда значение показания > 500 или около того, и я не понимаю почему. В простом скетче я попробовал добавить некоторую задержку (40 мс), и проблема исчезла. Но в моем проекте, который гораздо более сложен и использует также другие аналоговые каналы, мне нужна задержка примерно в 1 секунду, чтобы получить правильные показания, что абсолютно неприемлемо, поскольку мне нужно, чтобы он работал в реальном времени (почти). Я также пытался использовать цифровые контакты для управления мультиплексором, но безуспешно. Единственное, что, кажется, все стабилизирует, - это подключение конденсатора между выходом MUX и землей и использование задержки 20 мс, но это работает лишь на некоторое время.
Надеюсь, я выразился достаточно ясно и кто-нибудь сможет указать мне правильный путь!
РЕДАКТИРОВАТЬ:
Вот схема
(Ошибка на рисунке: «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 с.
Я также показываю, что в схеме есть таймер, который использует другие аналоговые контакты, но в код я не включил эту часть. Если нужно, я это тоже добавлю.
Датчик звука, Датчик освещенности
@Luca, 👍1
Обсуждение1 ответ
Лучший ответ:
Я не думаю, что вам следует оставлять s2 и s3 плавающими. Плавающий выход не означает ни 0, ни 1.
Подключите их обоих к земле.
- Отправка значения с одного Arduino на другой
- Arduino непрерывно считывает значение АЦП с помощью прерывания
- Колебания показаний датчика температуры LM35 (+- 5°C) с Arduino UNO
- Подключение нескольких TFT-панелей к Arduino Uno через SPI?
- Проблема с кодом для мультиплексора SDA/SCL TC9548A и датчиков HMC58 83L.
- Проблема с открытием нескольких текстовых файлов одновременно/по порядку с использованием <SD.h>
- Динамически обновить масштаб виджета Tkinter из портов Arduino с помощью python и firmata
- Считанное значение не меняется при вращении потенциометра в Arduino?
Было бы полезно опубликовать свой код и схему, даже если вы просто нарисуете его карандашом и отсканируете. Меня будет интересовать именно код. Пожалуйста, внесите изменения в свое сообщение и включите его. Насколько это возможно, сократите его до [Минимального, полного и проверяемого примера](http://stackoverflow.com/help/mcve). Спасибо!, @Nick Gammon
Хорошо, сделаю, спасибо! На данный момент я не могу ничего публиковать, поэтому вернусь через несколько часов! Ваше здоровье :), @Luca
@NickGammon добавил схемы и очень простой код, который работает с ошибками :), @Luca
Я не думаю, что вам следует оставлять s2 и s3 плавающими. Подключите их к земле., @Gerben
Это сработало! Если подумать, плавающая булавка не означает ни 0, ни 1, так что да, я был наивен, упустив эту деталь! Большое спасибо :), @Luca
@Gerben - возможно, добавь это как ответ с дополнительной информацией. Кажется, это сработало., @RSM