This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMUX1108:示例代码

Guru**** 2391345 points
Other Parts Discussed in Thread: TMUX1108

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/switches-multiplexers-group/switches-multiplexers/f/switches-multiplexers-forum/1002217/tmux1108-sample-code

器件型号:TMUX1108

您好!

我的 TMUX1108有问题。

设置:

Arduino 型板上有两个 TMUX1108、它们均共享 A0、A1和 A2引脚、但具有不同的 EN 引脚。

现在、我将使用 AA 电池(1.5v)对 ADC 进行测试。  

问题:

问题是、即使我的 AA 输入仅通过一个通道、我也会在所有通道上获得相同的读数。

因此、当使能引脚为低电平时、我会在所有通道上遇到1.5v 信号、即使在另一个 TMUX1108上也是如此。

但是、如果我只读取单个通道、我将在该通道上获得正确的值、在其他通道上获得0.0v。

因此、它与调用所有通道有关。

我很确定我没有正确地调用地址引脚、因此我正在搜索一些 C/C++示例代码。

下面是我当前运行的代码片段、没有成功、但我还包括了一个更易于遵循的屏幕截图。

void setup(){

  Serial.begin(9600);

  pinMode(MUXA0, INPUT_PULLDOWN);
  pinMode(MUXA1, INPUT_PULLDOWN);
  pinMode(MUXA2, INPUT_PULLDOWN);
  pinMode(MUX1_EN, INPUT_PULLDOWN);
  digitalWrite(MUX1_EN, LOW);
}

void getMUX_Simple(){

  MCP.Configuration(1,16,0,1);// setup my ADC

  digitalWrite(MUX1_EN, HIGH); // Writing EN pin high to Enable the MUX
  //Should I enable the MUX before or after writing to the A0, A1, and A2 pins?

  for (int i = 0; i < 8; i++){//for loop to cycle through the 8 channels

    delay(200); // just being super safe with this delay
    
    switch (i){
      case 0: // channel 0
          //Writing A0 LOW, A1 LOW, A2 LOW per the truth table for TMUX1108
          digitalWrite(MUXA0, LOW); digitalWrite(MUXA1, LOW); digitalWrite(MUXA2, LOW); 
          break;
      case 1: //channel 1
          //Writing A0 HIGH, A1 LOW, A2 LOW per the truth table for TMUX1108
          digitalWrite(MUXA0, HIGH); digitalWrite(MUXA1, LOW); digitalWrite(MUXA2, LOW); 
          break;
      case 2: //channel 2
          //Writing A0 LOW, A1 HIGH, A2 LOW per the truth table for TMUX1108
          digitalWrite(MUXA0, LOW); digitalWrite(MUXA1, HIGH); digitalWrite(MUXA2, LOW); 
          break;
      case 3: //channel 3
          //Writing A0 HIGH, A1 HIGH, A2 LOW per the truth table for TMUX1108
          digitalWrite(MUXA0, HIGH); digitalWrite(MUXA1, HIGH); digitalWrite(MUXA2, LOW); 
          break;        
      case 4: //channel 4
          //Writing A0 LOW, A1 LOW, A2 HIGH per the truth table for TMUX1108
          digitalWrite(MUXA0, LOW); digitalWrite(MUXA1, LOW); digitalWrite(MUXA2, HIGH); 
          break;         
      case 5: //channel 5
          //Writing A0 HIGH, A1 LOW, A2 HIGH per the truth table for TMUX1108
          digitalWrite(MUXA0, HIGH); digitalWrite(MUXA1, LOW); digitalWrite(MUXA2, HIGH); 
          break;                
      case 6: //channel 6
          //Writing A0 LOW, A1 HIGH, A2 HIGH per the truth table for TMUX1108
          digitalWrite(MUXA0, LOW); digitalWrite(MUXA1, HIGH); digitalWrite(MUXA2, HIGH); 
          break;                
      case 7: //channel 7
          //Writing A0 HIGH, A1 LOW, A2 LOW per the truth table for TMUX1108
          digitalWrite(MUXA0, HIGH); digitalWrite(MUXA1, HIGH); digitalWrite(MUXA2, HIGH); 
          break;          
    }

    MCP.NewConversion(); //initiate ADC conversion
    ORP[i] = (MCP.Measure()/1000.00); //take measurement

    digitalWrite(MUX1_EN, LOW);//disable the MUX

  }

}
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Sam:

    当 ENABLE 引脚为低电平时、所有通道将关闭。 当 ENABLE 为高电平时、根据 A0/A1/A2引脚设置、由于这是一个1:8多路复用器、在可用的8个通道中的任何给定时间内、只有一个通道处于开启状态。  

    如果您希望在连接的通道上实现可预测性、则可以在设置 A0/A1/A2后打开 EN。 您还可以在设置 A0/A1/A2之前设置 EN、但在这种情况下、将根据这些引脚上的浮动电压/电荷来选择通道。

    我认为您的读取变量或阵列设置不正确、因为器件功能不允许在给定时间开启多个通道。

    谢谢、

    此致、

    Sandesh

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的回答。

    我已经尝试了我能想到的一切,但它仍然无法正常工作。

    我甚至更换了组件。

    有人可以向我提供示例代码吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    下面是我可以得到的最简单的代码、但仍然很不幸运:

    const int MUXA0 = D3;
    const int MUXA1 = D4;
    const int MUXA2 = D5;
    const int MUX1_EN = D2;
    const int MUX2_EN = D8;
    
    void setup(){
    
      Serial.begin(9600);
    
      pinMode(MUXA0, OUTPUT);
      pinMode(MUXA1, OUTPUT);
      pinMode(MUXA2, OUTPUT);
      pinMode(MUX1_EN, OUTPUT);
      pinMode(MUX2_EN, OUTPUT);
      digitalWrite(MUX1_EN, LOW);
      digitalWrite(MUX2_EN, LOW);
      
    }
    
    
    
    void try89(int i){
    
      MCP.Configuration(1,16,0,1);// setup my ADC
    
      for (int i = 0; i < 8; i++){//for loop to cycle through the 8 channels
    
        delay(200); // just being super safe with this delay
        
        switch (i){
          case 0: // channel 0
              //Writing A0 LOW, A1 LOW, A2 LOW per the truth table for TMUX1108
              digitalWrite(MUXA0, LOW); digitalWrite(MUXA1, LOW); digitalWrite(MUXA2, LOW); 
              break;
          case 1: //channel 1
              //Writing A0 HIGH, A1 LOW, A2 LOW per the truth table for TMUX1108
              digitalWrite(MUXA0, HIGH); digitalWrite(MUXA1, LOW); digitalWrite(MUXA2, LOW); 
              break;
          case 2: //channel 2
              //Writing A0 LOW, A1 HIGH, A2 LOW per the truth table for TMUX1108
              digitalWrite(MUXA0, LOW); digitalWrite(MUXA1, HIGH); digitalWrite(MUXA2, LOW); 
              break;
          case 3: //channel 3
              //Writing A0 HIGH, A1 HIGH, A2 LOW per the truth table for TMUX1108
              digitalWrite(MUXA0, HIGH); digitalWrite(MUXA1, HIGH); digitalWrite(MUXA2, LOW); 
              break;        
          case 4: //channel 4
              //Writing A0 LOW, A1 LOW, A2 HIGH per the truth table for TMUX1108
              digitalWrite(MUXA0, LOW); digitalWrite(MUXA1, LOW); digitalWrite(MUXA2, HIGH); 
              break;         
          case 5: //channel 5
              //Writing A0 HIGH, A1 LOW, A2 HIGH per the truth table for TMUX1108
              digitalWrite(MUXA0, HIGH); digitalWrite(MUXA1, LOW); digitalWrite(MUXA2, HIGH); 
              break;                
          case 6: //channel 6
              //Writing A0 LOW, A1 HIGH, A2 HIGH per the truth table for TMUX1108
              digitalWrite(MUXA0, LOW); digitalWrite(MUXA1, HIGH); digitalWrite(MUXA2, HIGH); 
              break;                
          case 7: //channel 7
              //Writing A0 HIGH, A1 LOW, A2 LOW per the truth table for TMUX1108
              digitalWrite(MUXA0, HIGH); digitalWrite(MUXA1, HIGH); digitalWrite(MUXA2, HIGH); 
              break;          
        }
    
        delay(100);
        digitalWrite(MUX1_EN, HIGH); // Writing EN pin high to Enable the MUX
        delay(100);
        MCP.NewConversion(); //initiate ADC conversion
    
        Serial.printlnf("Channel %d: %.2f mV", i, (MCP.Measure()/1000.00)); //take measurement
    
        digitalWrite(MUX1_EN, LOW);//disable the MUX
    
      }
    }

    这里是串行输出:

    Serial monitor opened successfully:
    Channel 0: 1227.19 mV
    Channel 1: 1195.44 mV
    Channel 2: 1211.19 mV
    Channel 3: 1586.12 mV
    Channel 4: 1141.31 mV
    Channel 5: 1169.56 mV
    Channel 6: 1225.75 mV
    Channel 7: 1211.25 mV

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Sam:

    我建议确保您施加到器件上的电压和负载正确。 最好在所有设置位置(设置电压和电流)放置一个断点、然后在您使用的电路板上使用万用表或测量仪器、以确保正确应用器件(需要注意的事项: 为所选通道更正地址引脚上的 VIH/VIL 电平、VDD 电压开启、S 引脚的输入电压符合预期)。

    完成后、您应该逐步浏览代码、找出开始读取错误的位置、而不是仅仅查看最终结果。

    谢谢!

    Bryan