Мультиплексор 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", как если бы оба были подключены, и изменение состояния одного вызвало бы изменение состояния другого.

Есть идеи, почему?

Спасибо

, 👍2

Обсуждение

Я понятия не имею, почему. Возможно, вам захочется проверить уровни на любом соответствующем выводе вручную с помощью какого-либо измерителя напряжения и изменить выбор с помощью последовательного монитора., @the busybee

Хм... идентификатор analogwrite(8,НИЗКИЙ) скорее использует digitalwrite(), @SBF


1 ответ


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

2

Я так понимаю, это часть учебного эксперимента. Логически это не вычисляется, однако есть много причин, по которым что-то подобное может произойти. Плохая микросхема-это первое, что приходит на ум, но, как правило, это очень прочные устройства. Если у вас есть прицел, проверьте источники питания, чтобы убедиться, что они чистые и стабильные, если это так, начните с удержания его в одном из плохих состояний и проведите измерения напряжения на VCC, заземлении, нескольких других контактах и связанных контактах. Ваше напряжение на каждом выводе должно быть в пределах 0,1 В от соответствующего вывода источника питания. Если нет, это будет означать короткое замыкание, особенно если оно происходит где-то в середине напряжения питания. Если это макет, выверните плохие контакты и проверьте еще раз. Если все в пятнах, это короткое замыкание, если оно все еще показывает, что у вас, вероятно, плохая микросхема.

,

Спасибо за ваш ответ (и извините за мой поздний ответ...). После некоторых тестов и исследований я думаю, что проблема кроется в аппаратном обеспечении. Я прототипирую на SMD-мультиплексорах, которые покупаю уже припаянными к небольшой микросхеме. В конструкции микросхемы должна быть проблема, которая создает помехи между дорожкой канала 0 и каналом 8... У меня нет области применения, но я попробую сделать несколько тестов с помощью мультиметра, это уже должно дать мне некоторые показания., @Fanch

Я провел дополнительные тесты с тем же компонентом, но предложенным другим поставщиком, и он отлично работает. Значит, проблема была в оборудовании., @Fanch