Подключение мультиплексора.

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем varvik85, 28 мар 2013.

  1. varvik85

    varvik85 Нерд

    опять что то не так :(
    Код (Text):
    void setup() {
    #define ANALOG_PIN A0// аналоговый вход, на который пойдут сигналы через мультиплексор
    #define S0 2 // нога адреса мультиплексора
    #define S1 3 // вторая
    #define S2 4 // третья
    // макрос возвращает заданый разряд из числа
    #define GET_BIT(value, but_number) (((value) >> (bit_number)) & 0x1)
    // массив на 8 элемнтов
    int buffer[8];
    }
     
    void loop() {
     
     
    // функция перебирает все каналы мультиплексора и сохраняет данные в массиве
    void GetAnalogData()
    {
      // перебираем 8 каналов мультиплексора - с 0-го по 7-й включительно
      for(int i = 0; i < 8; i++)
      {
        // выставляем на мультиплексоре адрес очередного канала
        digitalWrite(S0, GET_BIT(i, 0));
        digitalWrite(S1, GET_BIT(i, 1));
        digitalWrite(S2, GET_BIT(i, 2));
        // выставили. теперь мультиплексор подает сигнал с ножки Yi на ножку z,
        // которая подключена к аналоговому входу A0 ардуины
     
        // читаем аналоговый вход и сохраняем его в i-й элемент массива
        buffer[i] = analogRead(A0);
      }
    }
     
    }
     
  2. Megakoteyka

    Megakoteyka Оракул Модератор

    Не за что :)
    Сначала изучите основы, потом двигайтесь дальше, иначе все только будет еще сильней запутываться.
    Как минимум Вам нужно понять, как пользоваться условиями, циклами, как вычислять выражения.
    Затем нужно будет на бумажке нарисовать алгоритм будущей программы, расписать всю логику ее работы как можно формальней. Подробная схема устройства тоже не повредит Тогда дело пойдет значительно веселей.
     
  3. varvik85

    varvik85 Нерд

    Да Вы правы,спасибо! Вот немного подшаманил програмку,какие будут замечания?
    Код (Text):
    int r0 = 0;   //value of select pin at the 4051 (s0)
    int r1 = 0;   //value of select pin at the 4051 (s1)
    int r2 = 0;   //value of select pin at the 4051 (s2)
    int count = 0;  //which y pin we are selecting
    int i = 0;
    byte analogueInputs[8];
    void setup(){
    pinMode(2, OUTPUT); // s0
    pinMode(3, OUTPUT); // s1
    pinMode(4, OUTPUT); // s2
     
     
    }
    void loop () {
    pinMode(0, INPUT);
      for (i = 0; i <=7; i++)
      {
        // multiplexor control
        r0 = i & 0x01;
        r1 = (i>>1) & 0x01;
        r2 = (i>>2) & 0x01;
     
        digitalWrite(2, r0);
        digitalWrite(3, r1);
        digitalWrite(4, r2);
        // Initialise the analogue value with a read to the input pin.
        analogueInputs[i] = analogRead(0)/8;
      }
     
     
    }
     
  4. Megakoteyka

    Megakoteyka Оракул Модератор

    Код (Text):
    #define S0 2    // нога адреса мультиплексора
    #define S1 3    // вторая
    #define S2 4    // третья
    int buffer[8];  // массив на 8 элементов для хранения данных с 8 каналов мультиплексора
     
    void setup()
    {
      pinMode(S0, OUTPUT);
      pinMode(S1, OUTPUT);
      pinMode(S2, OUTPUT);
     
      Serial.begin(9600);
    }
     
    // основной цикл - опрашиваем мультиплексор, выводим данные, делаем паузу
    void loop()
    {
      // запросили данные с 8 каналов мультиплексора
      GetAnalogData();
     
      // теперь используем эти данные - например, выводим все в терминал
      for(int i = 0; i < 8; i++)
        PrintMuxChannel(i);
     
      delay(500);
    }
     
    // функция перебирает все каналы мультиплексора и сохраняет данные в массиве buffer
    void GetAnalogData()
    {
      // перебираем 8 каналов мультиплексора - с 0-го по 7-й включительно
      for(int i = 0; i < 8; i++)
      {
        SetMuxAddress(i);           // выставляем на мультиплексоре адрес очередного канала
        buffer[i] = analogRead(A0);  // читаем аналоговый вход и сохраняем его в i-й элемент массива
      }
    }
     
    // функция выставляет на мультиплексоре адрес заданного канала
    void SetMuxAddress(int address)
    {
        digitalWrite(S0, (address >> 0) & 0x1);
        digitalWrite(S1, (address >> 1) & 0x1);
        digitalWrite(S2, (address >> 2) & 0x1);
    }
     
    // функция выводит один канал данных в терминал
    void PrintMuxChannel(int channel)
    {
      Serial.print(" Channel");
      Serial.print(channel);
      Serial.print(" = ");
      Serial.println(buffer[channel]);
    }
    Почитайте о структуре программы. Что такое функции и как ими пользоваться.
     
  5. Megakoteyka

    Megakoteyka Оракул Модератор

    Прежде всего - форматируйте код!
    Делайте отступы, как в моих примерах - так сразу становится видна структура программы и все уровни вложенности. Тут, раздел "О пустом месте и красивом коде".
     
  6. varvik85

    varvik85 Нерд

    Хорошо,спасибо!Много полезного я от Вас узнал,спасибо!
     
  7. varvik85

    varvik85 Нерд

    А как теперь расширить до двух или более плексоров?
     
  8. Megakoteyka

    Megakoteyka Оракул Модератор

    Нужно запараллелить адресные входы мультиплексоров - тогда они будут переключаться синхронно. Выходы z мультиплексоров подключить к аналоговым входам A0..A5. Останется только при каждом переключении канала мультиплексора опрашивать все 6 аналоговых входов Ардуино. Итого будет 48 каналов.
     
  9. varvik85

    varvik85 Нерд

    А програмно какие изменения придется внести? Большинство циклов и надстроек остается как есть,что то с буфером придется менять и числа как вытаскивать из него?
     
  10. Megakoteyka

    Megakoteyka Оракул Модератор

    Программно при каждой смене адреса на мультиплексоре нужно будет опрашивать не один аналоговый канал, а все 6. И буфер будет на 6*8=48 элементов.
     
  11. Megakoteyka

    Megakoteyka Оракул Модератор