Мультиплексор 74HC4067, конфликт между каналами
В настоящее время я работаю над Arduino Zero с мультиплексором 74HC4067 и испытываю несоответствия при тестировании некоторых каналов.
Мой класс следующий (он должен быть функциональным для 8 или 16-канальных мультиплексоров).
Мультиплексор.ч :
#ifndef Multiplexer_h
#define Multiplexer_h
#include "Arduino.h"
class Mux
{
public:
Mux(uint8_t numberOfChannels, byte sigPin, byte adress1, byte adress2, byte adress3, byte adress4 = 0);
uint8_t muxRead(byte pin);//Read specific mux pin
void selectMuxPin(byte pin);
private:
uint8_t m_numberOfChannels;
byte m_sigPin ;
byte m_adress1 ;
byte m_adress2 ;
byte m_adress3 ;
byte m_adress4 ;
uint8_t m_numberOfAdressPins;
};
#endif
Multiplexer.cpp :
#include "Multiplexer.h"
//**************************************************************
Mux::Mux(uint8_t numberOfChannels,
byte sigPin,
byte adress1,
byte adress2,
byte adress3,
byte adress4)
: m_numberOfChannels(numberOfChannels),
m_sigPin(sigPin),
m_adress1(adress1),
m_adress2(adress2),
m_adress3(adress3),
m_adress4(adress4)
{
if(m_numberOfChannels > 8) {m_numberOfAdressPins = 4;}
else {m_numberOfAdressPins = 3;}
//Set adresses to OUTPUT
pinMode(m_adress1, OUTPUT);
pinMode(m_adress2, OUTPUT);
pinMode(m_adress3, OUTPUT);
if(m_numberOfChannels > 8){pinMode(m_adress4, OUTPUT);};
//Set adresses to LOW
digitalWrite(m_adress1, LOW);
digitalWrite(m_adress2, LOW);
digitalWrite(m_adress3, LOW);
if(m_numberOfChannels > 8){digitalWrite(m_adress4, LOW);};
pinMode(m_sigPin, INPUT_PULLUP);
}
//**************************************************************
uint8_t Mux::muxRead(byte pin)
{
selectMuxPin(pin);
bool value = digitalRead(m_sigPin);
return(value) ;
}
void Mux::selectMuxPin(byte pin)
{
const int selectPins[4] = {m_adress1, m_adress2, m_adress3, m_adress4};
if (pin > (m_numberOfChannels - 1)) return; // Exit if pin is out of scope
for (int i = 0; i < m_numberOfAdressPins; i++)
{
if (pin & (1<<i)) {digitalWrite(selectPins[i], HIGH);}
else {digitalWrite(selectPins[i], LOW);}
}
}
Чтобы провести тесты на 74HC4067, я подключаю свой мультиплексор, перевожу вывод 8 моего Arduino в "НИЗКОЕ" состояние и с помощью соединительного кабеля проверяю каждый из выводов с помощью следующего кода:
#include "Multiplexer.h"
//**************************************************************
Mux Mux0(16, 6, 2, 3, 4, 5);
//**************************************************************
void setup() {
Serial.begin(115200);
}
//**************************************************************
void loop() {
//Set pin 8 to LOW for the test with a jumper
analogWrite(8, LOW);
//For this test, we print the name of the multiplexer's channel if it's LOW
bool channel0 = Mux0.muxRead(0);
if(!channel0)
Serial.println("Channel 0");
bool channel1 = Mux0.muxRead(1);
if(!channel1)
Serial.println("Channel 1");
bool channel2 = Mux0.muxRead(2);
if(!channel2)
Serial.println("Channel 2");
bool channel3 = Mux0.muxRead(3);
if(!channel3)
Serial.println("Channel 3");
bool channel4 = Mux0.muxRead(4);
if(!channel4)
Serial.println("Channel 4");
bool channel5 = Mux0.muxRead(5);
if(!channel5)
Serial.println("Channel 5");
bool channel6 = Mux0.muxRead(6);
if(!channel6)
Serial.println("Channel 6");
bool channel7 = Mux0.muxRead(7);
if(!channel7)
Serial.println("Channel 7");
bool channel8 = Mux0.muxRead(8);
if(!channel8)
Serial.println("Channel 8");
bool channel9 = Mux0.muxRead(9);
if(!channel9)
Serial.println("Channel 9");
bool channel10 = Mux0.muxRead(10);
if(!channel10)
Serial.println("Channel 10");
bool channel11 = Mux0.muxRead(11);
if(!channel11)
Serial.println("Channel 11");
bool channel12 = Mux0.muxRead(12);
if(!channel12)
Serial.println("Channel 12");
bool channel13 = Mux0.muxRead(13);
if(!channel13)
Serial.println("Channel 13");
bool channel14 = Mux0.muxRead(14);
if(!channel14)
Serial.println("Channel 14");
bool channel15 = Mux0.muxRead(15);
if(!channel15)
Serial.println("Channel 15");
}
Для большинства каналов это работает довольно хорошо. Когда я подключаю перемычку (вывод 8) к каналу мультиплексора, в консоли отображается название соответствующего вывода.
Однако два канала являются проблематичными. Канал 0 и канал 8. Независимо от того, подключаю ли я перемычку к одному или другому, я вижу в консоли "Канал 0" и "Канал 8", как если бы оба были подключены, и изменение состояния одного вызвало бы изменение состояния другого.
Есть идеи, почему?
Спасибо
@Fanch, 👍2
Обсуждение1 ответ
Лучший ответ:
Я так понимаю, это часть учебного эксперимента. Логически это не вычисляется, однако есть много причин, по которым что-то подобное может произойти. Плохая микросхема-это первое, что приходит на ум, но, как правило, это очень прочные устройства. Если у вас есть прицел, проверьте источники питания, чтобы убедиться, что они чистые и стабильные, если это так, начните с удержания его в одном из плохих состояний и проведите измерения напряжения на VCC, заземлении, нескольких других контактах и связанных контактах. Ваше напряжение на каждом выводе должно быть в пределах 0,1 В от соответствующего вывода источника питания. Если нет, это будет означать короткое замыкание, особенно если оно происходит где-то в середине напряжения питания. Если это макет, выверните плохие контакты и проверьте еще раз. Если все в пятнах, это короткое замыкание, если оно все еще показывает, что у вас, вероятно, плохая микросхема.
Спасибо за ваш ответ (и извините за мой поздний ответ...). После некоторых тестов и исследований я думаю, что проблема кроется в аппаратном обеспечении. Я прототипирую на SMD-мультиплексорах, которые покупаю уже припаянными к небольшой микросхеме. В конструкции микросхемы должна быть проблема, которая создает помехи между дорожкой канала 0 и каналом 8... У меня нет области применения, но я попробую сделать несколько тестов с помощью мультиметра, это уже должно дать мне некоторые показания., @Fanch
Я провел дополнительные тесты с тем же компонентом, но предложенным другим поставщиком, и он отлично работает. Значит, проблема была в оборудовании., @Fanch
- C++ против языка Arduino?
- Как использовать SPI на Arduino?
- Какие накладные расходы и другие соображения существуют при использовании структуры по сравнению с классом?
- Ошибка: expected unqualified-id before 'if'
- Что лучше использовать: #define или const int для констант?
- Функции со строковыми параметрами
- Библиотека DHT.h не импортируется
- ошибка: ожидаемое первичное выражение перед токеном ','
Я понятия не имею, почему. Возможно, вам захочется проверить уровни на любом соответствующем выводе вручную с помощью какого-либо измерителя напряжения и изменить выбор с помощью последовательного монитора., @the busybee
Хм... идентификатор analogwrite(8,НИЗКИЙ) скорее использует digitalwrite(), @SBF