Цифровой потенциометр MCP 41010

VictorArx

★★★✩✩✩✩
22 Мар 2021
656
104
@SlavaZagaynov, трудность в том, что все эти скетчи, то бишь коды я использовал. Проблема в том, что потенциометр только уменьшает сопротивление. Он работает в одну сторону, начинает с 1023 доходит до 0, затем снова 1023 и по кругу.

@r4wabr,
C++:
// Определение контактов X9C
// В зависимости от модели, контакты могут отличаться.
// Подключитесь к даташиту вашего чипа X9C для точных контактов.
const int CS_PIN = 4; // Chip Select
const int INS_PIN  = 3;  // Up
const int UD_PIN  = 2;  // Down
const int pot = A0;
int val =0 ;


void setup() {
  Serial.begin(9600);
   // Инициализация SPI
  pinMode(CS_PIN, OUTPUT);
  pinMode(INS_PIN, OUTPUT);
  pinMode(UD_PIN, OUTPUT);
   pinMode(pot,INPUT);
  // Начальное состояние потенциометра
  digitalWrite(CS_PIN, HIGH);
  digitalWrite(INS_PIN, HIGH);
  digitalWrite(UD_PIN, HIGH);
}

void loop() {
  // Проверка на максимальное сопротивление

  digitalWrite(UD_PIN,LOW);

  digitalWrite(CS_PIN,LOW);
for (int i = 0; i < 100; i++) {
  digitalWrite(INS_PIN,LOW);
  delayMicroseconds(1);
   digitalWrite(INS_PIN,HIGH);
  delayMicroseconds(1);

}

digitalWrite(CS_PIN, HIGH);
   
   
  {
   
    int val = analogRead(pot); // Считываем аналоговое значение с пина A0 (от 0 до 1023)
  Serial.println(val); // Выводим считанное значение в монитор порта
  delay(500); // НебольшаяdigitalWrite(INS_PIN, LOW);
 
   
    digitalWrite(UD_PIN, HIGH); // Направление "вверх"
   
    // Небольшая задержка для стабилизации
 




  }
   digitalWrite(UD_PIN,HIGH);
digitalWrite(CS_PIN, LOW);

  for (int i = 100; i > 0; i--) {
  digitalWrite(INS_PIN,LOW);
  delayMicroseconds(1);
   digitalWrite(INS_PIN,HIGH);
  delayMicroseconds(1);




   
   
   
   
    int val = analogRead(pot); // Считываем аналоговое значение с пина A0 (от 0 до 1023)
  Serial.println(val); // Выводим считанное значение в монитор порта
  delay(500); // НебольшаяdigitalWrite(INS_P

  // После проверки можно провести дополнительную проверку,
  // подключив потенциометр как реостат
  // и измерив сопротивление с помощью мультиметра
  }  // при различных положениях потенциометра.
}

Что в коде неправильно?
 

poty

★★★★★★★
19 Фев 2020
3,612
1,027
@VictorArx, много чего...
Что делается в loop:
  • устанавливаем направление - вверх;
  • выбираем устройство;
  • в цикле for за около 200 микросекунд поднимаем сопротивление до максимального;
  • отключаем устройство (!!!)
  • и только после этого ОДИН РАЗ выводим значение напряжения!

  • далее - устанавливаем направление вниз
  • выбираем устройство;
  • в цикле for примерно раз в полсекунды уменьшаем сопротивление и ВЫВОДИМ значение напряжения!
  • далее всё бросаем (не отключаем устройство) и снова начинаем заново.

Что Вы хотите увидеть в порту? То, что написали, то и увидели.
 
  • Лойс +1
Реакции: bort707

viktor1703

★★★★✩✩✩
9 Дек 2021
801
203
в коде делал инкремент и декремент
for (int i=0; i<100; i++)
for (int i=100; i>percent; i--) ничего не меняется
А ничего и не будет меняться. Я же вам писал уже об этом.
Хоть так
for (int i=100; i>=0; i--);
Хоть так
for (int i=0; i<100; i++)
микроконтроллеру не важно в какую сторону считать, а микросхеме сопротивлений вообще фиолетово, что кто и как считает
Но вы упорно это игнорируете, придумали себе что именно из-за i++ или из-за i-- и происходит изменение сопротивления. НЕТ. В этой строке вы прописали сколько раз нужно повторить действия в цикле for, то есть всё то, что написано после фигурных скобок.
В одном случае вы даете указание микроконтроллеру считать от i=100 до момента пока i больше нуля, вычитая каждый раз единицу.
В другом случае вы даёте указание микроконтроллеру считать от i=0 до момента пока i меньше, чем percent, каждый раз прибавляя единицу. А в loop у вас percent тоже завернут в цикл for и несколько раз подряд меняет своё значение
Цифровой резистор не знает об этом счете. Его дергаете за ноги в определенной даташитом комбинации, он и меняет сопротивление. Можете выкинуть нафиг микроконтроллер и тыкать проводками вручную, цифровой потенциометр будет реагировать. Но нет, вы уперлись, что микросхемы бракованные, ваш код правильный, а помочь никто не хочет, и не желаете больше ничего слышать. А вам уже и рабочий кусок кода написали даже.
 
Изменено:

poty

★★★★★★★
19 Фев 2020
3,612
1,027

@viktor1703, не совсем так, как Вы описали. Микросхема X9C103 имеет отдельный пин управления UD, который изменяет направление изменения сопротивления при подаче на него логической 1 или 0. При этом одни и те же импульсы на INS приводят к инкременту или декременту сопротивления в зависимости от потенциала на UD.
Так что в целом код рабочий, просто в первой части вывод в монитор не осуществляется, поэтому ничего и не видно.
 
  • Лойс +1
Реакции: VictorArx

r4wabr

★✩✩✩✩✩✩
21 Май 2019
73
18
42
Ижевск
C++:
#define CS 4
#define INC 3
#define UD 2
#define POT A0




void wiperUp(void);
void wiperDown(void);


void setup() {
    pinMode(CS,OUTPUT);
    pinMode(INC,OUTPUT);
    pinMode(UD,OUTPUT);
 
 
    Serial.begin(9600);
 
 
}

void loop(){
 
    for(int i=0;i<100;i++){
        wiperUp();
        Serial.println(analogRead(POT));
     
    }
 
    for(int i=0;i<100;i++){
        wiperDown();
        Serial.println(analogRead(POT));
     
    }
 
    delay(3000);
}


void wiperUp(void) {
  digitalWrite(CS,HIGH);
  digitalWrite(UD,HIGH);
  delay(1);
  digitalWrite(INC,HIGH);
  delay(1);
  digitalWrite(CS,LOW);
  delay(1);
  digitalWrite(INC,LOW);
  delay(1);
  digitalWrite(INC,HIGH);
  delay(1);
  digitalWrite(CS,HIGH);

}


void wiperDown(void) {
  digitalWrite(CS,HIGH);
  digitalWrite(UD,LOW);
  delay(1);
  digitalWrite(INC,HIGH);
  delay(1);
  digitalWrite(CS,LOW);
  delay(1);
  digitalWrite(INC,LOW);
  delay(1);
  digitalWrite(INC,HIGH);
  delay(1);
  digitalWrite(CS,HIGH);

}
 
Изменено:

SlavaZagaynov

★✩✩✩✩✩✩
27 Ноя 2019
246
46
www.youtube.com
void wiperUp(void); void wiperDown(void);
после этих проц следует добавить задержку на 500-1000 мс, а то так они пролетают так быстро, что глазом моргнуть не успеешь. а неумеющие читать чужой код это не понимают.
 

bort707

★★★★★★✩
21 Сен 2020
3,419
984
@r4wabr, это вы delay(1) имеете в виду? Серьезно?
@SlavaZagaynov прав, надо добавить задержку чтобы быстро сменяющиеся числа на мониторе была хотя бы возможность прочитать...
 

VictorArx

★★★✩✩✩✩
22 Мар 2021
656
104
@r4wabr, скопировал ваш код, но там настолько быстро в мониторе порта ничего не могу разобрать. Сделал на двух циклах задержку 1000 мс и результат , как в моём коде. Уменьшается до 0 и усё. Пусть борт скажет, чсто я тупой. по ходу брак.
 
Изменено:

SlavaZagaynov

★✩✩✩✩✩✩
27 Ноя 2019
246
46
www.youtube.com
Уменьшается до 0 и усё.
а ты сопротивление мультиметром измеряешь?
а еще ... (с аналоговыми пинами я давно развлекался, не помню как там и что) ... не надо там pinMode input назначать?
 
Изменено:

VictorArx

★★★✩✩✩✩
22 Мар 2021
656
104
Как и в моём коде. По ходу брак.

а ты сопротивление мультиметром измеряешь?
а еще ... (с аналоговыми пинами я давно развлекался, не помню как там и что) ... не надо там pinMode input назначать?
Не меряю мультиметром, только монитор порта.
 

Вложения

r4wabr

★✩✩✩✩✩✩
21 Май 2019
73
18
42
Ижевск
@VictorArx,

Странно. А где результат второго цикла? И как выход потенциометра подключен а плате? +5v, A0, GND?
 

VictorArx

★★★✩✩✩✩
22 Мар 2021
656
104
@VictorArx,

Странно. А где результат второго цикла? И как выход потенциометра подключен а плате? +5v, A0, GND?
Всё подключено. Результат второго цикла много нулей, затем снова 1023 уменьшается. Ладно ребята, спасибо всем, далее сам.
 

r4wabr

★✩✩✩✩✩✩
21 Май 2019
73
18
42
Ижевск
выходы потенциометра 3 шт. надо все подключить VL, VH к gnd и 5v, а VW к A0

И если поменять местами порядок увеличения и уменьшения.
 

Вложения

Изменено:

VictorArx

★★★✩✩✩✩
22 Мар 2021
656
104
@r4wabr, дружище так и делал я ведь схемотехник .Что интересно, вот идёт отсчёт от 1023 до нуля первый цикл(примерно 30 отсчётов), доходит до 0, потом 30 отсчётов во втором цикле нуля и после сразу снова 1023.Другими словами вместо 30 отсчётов на повышение просто нули.
 

Вложения

bort707

★★★★★★✩
21 Сен 2020
3,419
984
скопировал ваш код, но там настолько быстро в мониторе порта ничего не могу разобрать. Сделал на двух циклах задержку 1000 мс
Покажите тот код, который получился. Только именно тот код, который дал вам картинку в мониторе порта, которую вы приводили в #68, НИЧЕГО НЕ МЕНЯЯ.

Потенциометр у вас какой, в виде такого модуля?
Screenshot from 2025-11-25 22-50-38.png
 

VictorArx

★★★✩✩✩✩
22 Мар 2021
656
104
@bort707, потенциометр именно такой, по схеме приведённой в инете подключен правильно. Сейчас скину код

C++:
#define CS 4
#define INC 3
#define UD 2
#define POT A0




void wiperUp(void);
void wiperDown(void);


void setup() {
    pinMode(CS,OUTPUT);
    pinMode(INC,OUTPUT);
    pinMode(UD,OUTPUT);
 
 
    Serial.begin(9600);
 
 
}

void loop(){
 
    for(int i=0;i<100;i++){
        wiperUp();
        Serial.println(analogRead(POT));
    
    }
 
    for(int i=0;i<100;i++){
        wiperDown();
        Serial.println(analogRead(POT));
    
    }
 
    delay(3000);
}


void wiperUp(void) {
  digitalWrite(CS,HIGH);
  digitalWrite(UD,HIGH);
  delay(1);
  digitalWrite(INC,HIGH);
  delay(1);
  digitalWrite(CS,LOW);
  delay(1);
  digitalWrite(INC,LOW);
  delay(1);
  digitalWrite(INC,HIGH);
  delay(1);
  digitalWrite(CS,HIGH);

}


void wiperDown(void) {
  digitalWrite(CS,HIGH);
  digitalWrite(UD,LOW);
  delay(1);
  digitalWrite(INC,HIGH);
  delay(1);
  digitalWrite(CS,LOW);
  delay(1);
  digitalWrite(INC,LOW);
  delay(1);
  digitalWrite(INC,HIGH);
  delay(1);
  digitalWrite(CS,HIGH);

}
 
Изменено:

poty

★★★★★★★
19 Фев 2020
3,612
1,027
@VictorArx, покажите переход от 0 к 1023. Скорее всего его не будет, а полученный выше вывод связан с тем, что не подключен вывод U/D (вернее, он подключен к земле). Иначе с чего бы это микросхеме установиться в 1023 в какой-то момент, если инкремент не работает?