Управление цифровым потенциометром (двухканальным) MCP42100 последовательное подключение

MokeevP
Offline
Зарегистрирован: 29.02.2020

Здравствуйте, Уважаемые форумчане!

У меня возникла проблема с пониманием как правильно нужно отправлять команды на два последовательно подключённых потенциометра MCP42100 и MCP41010

 

Не понимаю в какой момент нужно посылать команду на второй канал ЦП 100ком и почему у меня не приходит команда на ЦП 10ком

 

//настройка конфигурационного байта
byte MCP4xxxxConfig(int mode, int chan){
  byte byte_mode;
  byte byte_chan;
    switch (mode){
    case 1:         //write
      byte_mode = 16;
      break;
    case 2:         //shut down
      byte_mode = 32;
      break;
    default:        //none
      byte_mode = 0;
      break;
  }
    switch (chan){
    case 1:         // Command executed on Potentiometer 0
      byte_chan = 1;
      break;
    case 2:         // Command executed on Potentiometer 1
      byte_chan = 2;
      break;
    default:        //none
      byte_chan = 0;
      break;
  }
  return (byte_mode | byte_chan);
}

//попытка в лоб
void MCP4test() {
  digitalWrite(SS_NTC, LOW);          //включаем приём данных регистрами
  
  SPItransferByte(MCP4xxxxConfig(1, 1));     //отправляем первый байт в регистр конфигурации
  SPItransferByte(0);                    //отправляем второй байт в "регистр ползунка"  
  SPItransferByte(MCP4xxxxConfig(1, 2));     //отправляем первый байт в регистр конфигурации
  SPItransferByte(0);                    //отправляем второй байт в "регистр ползунка"  
  SPItransferByte(MCP4xxxxConfig(1, 1));     //отправляем первый байт в регистр конфигурации
  SPItransferByte(0);                    //отправляем второй байт в "регистр ползунка"

  digitalWrite(SS_NTC, HIGH);         //выключаем приём данных регистров
}

//другая попытка - настроить оба ЦП за раз через разные каналы первого
void MCP4xxxxWriteCascade(byte v1100, byte v2100, byte v110) {       
                                            // отправляет в каскад потенциометров значения
  //настраиваем 1й канал 100ком
  digitalWrite(SS_NTC, LOW);                //включаем приём данных регистрами
  SPItransferByte(MCP4xxxxConfig(1, 1));    //отправляем первый байт в регистр конфигурации
  SPItransferByte(v1100);                   //отправляем второй байт в "регистр ползунка"
  
  //настраиваем канал 10км
  SPItransferByte(MCP4xxxxConfig(1, 1));    //отправляем первый байт в регистр конфигурации
  SPItransferByte(v110);                   //отправляем второй байт в "регистр ползунка"
  digitalWrite(SS_NTC, HIGH);               //выключаем приём данных регистров

  //настраиваем 2й канал 100ком
  digitalWrite(SS_NTC, LOW);                //включаем приём данных регистрами
  SPItransferByte(MCP4xxxxConfig(1, 2));    //отправляем первый байт в регистр конфигурации
  SPItransferByte(v2100);                   //отправляем второй байт в "регистр ползунка"
  
  //настраиваем канал 10км
  SPItransferByte(MCP4xxxxConfig(1, 1));    //отправляем первый байт в регистр конфигурации
  SPItransferByte(v110);                   //отправляем второй байт в "регистр ползунка"
  digitalWrite(SS_NTC, HIGH);               //выключаем приём данных регистров
}
//функция отправки байта
void SPItransferByte(byte _byte){
  for(int i = 0; i < 8; i++) {
    SPItransferBit(bitRead(_byte, 7-i)); 
  }       
}

void SPItransferBit(boolean _bit) {
  digitalWrite(SPI_MOSI, _bit);
//  delay(300);
  digitalWrite(SPI_SCK, HIGH);
  digitalWrite(SPI_SCK, LOW);
  digitalWrite(SPI_MOSI, LOW);
}

Даташит на ЦП

Вообще поделка должна имитировать термосопротивление, но это совсем другая история... Очень прошу помочь - не хочется бросать это дело

 

MokeevP
Offline
Зарегистрирован: 29.02.2020

То что на картинке подписан Analog Devices прошу не обращать внимание, по факту там MCP