2019年2月24日 星期日

【單晶片】擴充arduino接腳 CD4051 8 channel analog MUX/DMUX

最近發現arduino接腳不夠用,找到一顆多工器(Multiplexer),而且這顆很不一樣,一般的多工器用在數位電路上做資料選擇用的,只有0(HIGH)及1(LOW)這兩個訊號。

相似文章


CD4051特點

  • 具有類比輸入類比輸出的特性
  • 具有8個Channel及一個COM
  • 雙向傳輸,COM->CH0CH0->COM
  • 3條選擇線,以及一條致能線(Enable)
  • DIP封裝,開發方便
  • 可做多工器/解多工器


簡介

CD4051等效功能圖
CD4051有點像繼電器,可雙向通行,最後資料經由選擇後,將Chx接至COM腳。
A、B、C為選擇線。

CD4051為CMOS,選擇線的邏輯準位為:
LOW=VIL=0.3VDD
HIGH=VIH=0.7VDD

VDD=5V時:
LOW=VIL=0.3*5=1.5V
HIGH=VIH=0.7*5=3.5V


接腳定義

Arduino實現

電路圖



程式碼
int values[8];
int analong_max=0;
void setup() {
  Serial.begin(115200);
  pinMode(4, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(2, OUTPUT);
  select(0);
  analong_max=900;
  //analong_max=analogRead(A5);
}
int channel;
void loop() {
  if(Serial.available()>0){
    channel=Serial.read()-0x30; //ASCII 0x30 -> 0
    }
 
  select(channel);
  //int curr_value=analogRead(A5);  //最大值約落在900

  int curr_value=map(analogRead(A5),0,analong_max,0,127);//將0~900轉成0~127,增加則訊邊界處理能力。

  if (range(values[channel], curr_value, 1) != values[channel]) {
      values[channel]=curr_value;
      Serial.print("ch:");
      Serial.print(channel);
      Serial.print("\t");
      Serial.println(curr_value);
    }

}

int range(int privious, int current, int d) {
  //過濾雜訊
  if (current > privious && current - d == privious)return privious;
  else if (current < privious && privious - d == current)return privious;
  else if (current == privious)return privious;
  return current;
}


short select(int select) {
  switch (select) {
    case 0:
      digitalWrite(4, LOW);
      digitalWrite(3, LOW);
      digitalWrite(2, LOW);
      break;
    case 1:
      digitalWrite(4, LOW);
      digitalWrite(3, LOW);
      digitalWrite(2, HIGH);
      break;
    case 2:
      digitalWrite(4, LOW);
      digitalWrite(3, HIGH);
      digitalWrite(2, LOW);
      break;
    case 3:
      digitalWrite(4, LOW);
      digitalWrite(3, HIGH);
      digitalWrite(2, HIGH);
      break;
    case 4:
      digitalWrite(4, HIGH);
      digitalWrite(3, LOW);
      digitalWrite(2, LOW);
      break;
    case 5:
      digitalWrite(4, HIGH);
      digitalWrite(3, LOW);
      digitalWrite(2, HIGH);
      break;
    case 6:
      digitalWrite(4, HIGH);
      digitalWrite(3, HIGH);
      digitalWrite(2, LOW);
      break;
    case 7:
      digitalWrite(4, HIGH);
      digitalWrite(3, HIGH);
      digitalWrite(2, HIGH);
      break;

  }
}


測試結果

使用int curr_value=analogRead(A5);
讀取A5 ADC電位,將可變電阻催到底只有到900,可能是因CD4051接腳內阻造成的電壓降。



在初始時將可變電阻催到底,使電壓為最大值
analong_max=analogRead(A5);


將0~900轉成0~127,增加則訊邊界處理能力。
int curr_value=map(analogRead(A5),0,analong_max,0,127);



在序列監控視窗輸入0~7,可切換不同的可變電阻


沒有留言:

張貼留言