Potenciómetro digital


          Potenciómetros digitales son resistores cuyos valores pueden cambiarse mediante una entrada externa, normalmente controlada por un microprocesador. En el caso mostrado con un integrado MCP41010 el control es por bus SPI.  A diferencia de su equivalente mecánico, los potenciómetros digitales no son continuamente variables, sino que cambian de valor en "escalones". Tienen resistencias internas que son activadas por transistores. En nuestro caso son 256 etapas para una resistencia total de 10k.
          Hay que tener en cuenta que la cantidad de corriente que pueden manejar es muy pequeña, del orden de miliamperios, por lo que con mayor frecuencia se usan en el control de amplificadores operacionales o transistores para controlar su ganancia.
          En este montaje he usado como SPI un ESP32, mas que nada por usar sus posibilidades de control táctil.
          El MCP41010 tiene tres pin 5,6 y 7 que corresponderían a las tres de un potenciómetro mecánico. En ellas podemos lee la resistencia que se genera.
          En este caso, he conectado los extremos (5 y 7) a 3,3v y masa, lo que hace que en pin 6 tengamos las variaciones que corresponderían a un divisor resistivo y que leeremos con un voltímetro.
          Al pulsar en las placas de "Touch" se envían datos de 0 a 255 o viceversa que modifican la resistencia interna del chip (En el código envío de 8 en 8 pasos para mayor rapidez del cambio).
#include <SPI.h>
const int CS = 5;
int PotWiperVoltaje = 1;
int RawVoltaje = 0;
float voltaje = 0;
int valor =125;
byte up1, up2, dw1, dw2;
void setup() {
   pinMode (CS, OUTPUT);
   Serial.begin(9600);
   SPI.begin(); // initialize SPI
}
void loop() {
   // mueve el pin central del potenciometro en una dirección
   up1=touchRead(12); delay(20); up2=touchRead(12);  //Evita inestabilidad del touch
   if ((up1 < 25) && (up2 < 25)){
      valor=valor+8;
      if (valor > 254){valor=255;}
      MCP41010Write(valor);
      delay(100);
      RawVoltaje = analogRead(4);
      voltaje = (RawVoltaje * 3.3 )/ 4095.0;
      Serial.print("Valor = " );
      Serial.print(valor);
      Serial.print("\t Voltaje = ");
      Serial.println(voltaje,3);
   }
   delay(100);
   // mueve el pin central del potenciometro en la otra dirección
   dw1=touchRead(13); delay(20); dw2=touchRead(13);  //Evita inestabilidad del touch
   if ((dw1 < 25) && (dw2 < 25)){
      valor=valor-8;
      if (valor < 1){valor=0;}
      MCP41010Write(valor);
      delay(100);
      RawVoltaje = analogRead(4);
      voltaje = (RawVoltaje * 3.3 )/ 4095.0;
      Serial.print("Valor = " );
      Serial.print(valor);
      Serial.print("\t Voltaje = ");
      Serial.println(voltaje,3);
   }
}
void MCP41010Write(byte value){
   digitalWrite(CS,LOW); // selecciona el chip
   SPI.transfer(B00010001); // comando byte
   SPI.transfer(value); // dato byte
   digitalWrite(CS,HIGH); // deselecciona el chip
}
        He observado que la función Touch del ESP32 tiene muchas activaciones esporádicas. Lo he solucionado haciendo dos lecturas separadas 20ms y comparando que son iguales.


Menu