Nota

¡Hola! Bienvenido a la comunidad de entusiastas de SunFounder Raspberry Pi & Arduino & ESP32 en Facebook. Sumérgete más en Raspberry Pi, Arduino y ESP32 con otros entusiastas.

¿Por qué unirte?

  • Soporte Experto: Resuelve problemas postventa y desafíos técnicos con la ayuda de nuestra comunidad y equipo.

  • Aprender y Compartir: Intercambia consejos y tutoriales para mejorar tus habilidades.

  • Avances Exclusivos: Obtén acceso temprano a nuevos anuncios de productos y adelantos exclusivos.

  • Descuentos Especiales: Disfruta de descuentos exclusivos en nuestros productos más recientes.

  • Promociones Festivas y Sorteos: Participa en sorteos y promociones festivas.

👉 ¿Listo para explorar y crear con nosotros? Haz clic en [Aquí] y únete hoy.

2.1.7 Potenciómetro

Nota

../_images/mcp3008_and_adc0834.jpg

Dependiendo de la versión de su kit, identifique si tiene ADC0834 o MCP3008 y continúe con la sección correspondiente.

Introducción

La función ADC se puede utilizar para convertir señales analógicas en señales digitales, y en este experimento, se usa el ADC0834 para obtener la función involucrando ADC. Aquí, implementamos este proceso utilizando un potenciómetro. El potenciómetro cambia la cantidad física – voltaje, que es convertido por la función ADC.

Componentes Necesarios

En este proyecto, necesitamos los siguientes componentes.

../_images/list_2.1.4_potentiometer.png

Es definitivamente conveniente comprar un kit completo, aquí está el enlace:

Nombre

ARTÍCULOS EN ESTE KIT

ENLACE

Kit Raphael

337

Raphael Kit

También puedes comprarlos por separado en los enlaces a continuación.

INTRODUCCIÓN DE COMPONENTES

ENLACE DE COMPRA

Placa de Extensión GPIO

COMPRAR

Protoboard

COMPRAR

Cables de Puente

COMPRAR

Resistor

COMPRAR

LED

COMPRAR

Potenciómetro

COMPRAR

ADC0834

-

Diagrama Esquemático

../_images/image311.png ../_images/image312.png

Procedimientos Experimentales

Paso 1: Construye el circuito.

../_images/image180.png

Nota

Coloca el chip refiriéndote a la posición correspondiente representada en la imagen. Nota que las ranuras en el chip deben estar a la izquierda cuando se coloque.

Paso 2: Abre el archivo de código.

cd ~/raphael-kit/c/2.1.7/

Paso 3: Compila el código.

gcc 2.1.7_Potentiometer.c -lwiringPi

Paso 4: Ejecuta.

sudo ./a.out

Después de ejecutar el código, gira la perilla del potenciómetro y la intensidad del LED cambiará en consecuencia.

Nota

Si no funciona después de ejecutar el código, o aparece un mensaje de error: "wiringPi.h: No such file or directory", por favor refiérase a Instalar y verificar WiringPi.

Código

#include <wiringPi.h>
#include <stdio.h>
#include <softPwm.h>

typedef unsigned char uchar;
typedef unsigned int uint;

#define     ADC_CS    0
#define     ADC_CLK   1
#define     ADC_DIO   2
#define     LedPin    3

uchar get_ADC_Result(uint channel)
{
    uchar i;
    uchar dat1=0, dat2=0;
    int sel = channel > 1 & 1;
    int odd = channel & 1;

    digitalWrite(ADC_CLK, 1);
    delayMicroseconds(2);
    digitalWrite(ADC_CLK, 0);
    delayMicroseconds(2);

    pinMode(ADC_DIO, OUTPUT);
    digitalWrite(ADC_CS, 0);
    // Start bit
    digitalWrite(ADC_CLK,0);
    digitalWrite(ADC_DIO,1);    delayMicroseconds(2);
    digitalWrite(ADC_CLK,1);    delayMicroseconds(2);
    // Single End mode
    digitalWrite(ADC_CLK,0);
    digitalWrite(ADC_DIO,1);    delayMicroseconds(2);
    digitalWrite(ADC_CLK,1);    delayMicroseconds(2);
    // ODD
    digitalWrite(ADC_CLK,0);
    digitalWrite(ADC_DIO,odd);  delayMicroseconds(2);
    digitalWrite(ADC_CLK,1);    delayMicroseconds(2);
    // Select
    digitalWrite(ADC_CLK,0);
    digitalWrite(ADC_DIO,sel);    delayMicroseconds(2);
    digitalWrite(ADC_CLK,1);

    delayMicroseconds(2);
    digitalWrite(ADC_CLK,0);
    delayMicroseconds(2);

    for(i=0;i<8;i++)
    {
        digitalWrite(ADC_CLK,1);    delayMicroseconds(2);
        digitalWrite(ADC_CLK,0);    delayMicroseconds(2);

        pinMode(ADC_DIO, INPUT);
        dat1=dat1<<1 | digitalRead(ADC_DIO);
    }

    for(i=0;i<8;i++)
    {
        dat2 = dat2 | ((uchar)(digitalRead(ADC_DIO))<<i);
        digitalWrite(ADC_CLK,1);    delayMicroseconds(2);
        digitalWrite(ADC_CLK,0);    delayMicroseconds(2);
    }

    digitalWrite(ADC_CS,1);
    pinMode(ADC_DIO, OUTPUT);
    return(dat1==dat2) ? dat1 : 0;
}

int main(void)
{
    uchar analogVal;
    if(wiringPiSetup() == -1){ //when initialize wiring failed,print messageto screen
        printf("setup wiringPi failed !");
        return 1;
    }
    softPwmCreate(LedPin,  0, 100);
    pinMode(ADC_CS,  OUTPUT);
    pinMode(ADC_CLK, OUTPUT);

    while(1){
        analogVal = get_ADC_Result(0);
        printf("Current analogVal : %d\n", analogVal);
        softPwmWrite(LedPin, analogVal);
        delay(100);
    }
    return 0;
}

Explicación del Código

#define     ADC_CS    0
#define     ADC_CLK   1
#define     ADC_DIO   2
#define     LedPin    3

Define los pines CS, CLK, DIO del ADC0834 y conéctalos a GPIO0, GPIO1 y GPIO2 respectivamente. Luego conecta el LED al GPIO3.

uchar get_ADC_Result(uint channel)
{
    uchar i;
    uchar dat1=0, dat2=0;
    int sel = channel > 1 & 1;
    int odd = channel & 1;

    digitalWrite(ADC_CLK, 1);
    delayMicroseconds(2);
    digitalWrite(ADC_CLK, 0);
    delayMicroseconds(2);

    pinMode(ADC_DIO, OUTPUT);
    digitalWrite(ADC_CS, 0);
    // Start bit
    digitalWrite(ADC_CLK,0);
    digitalWrite(ADC_DIO,1);    delayMicroseconds(2);
    digitalWrite(ADC_CLK,1);    delayMicroseconds(2);
    // Single End mode
    digitalWrite(ADC_CLK,0);
    digitalWrite(ADC_DIO,1);    delayMicroseconds(2);
    digitalWrite(ADC_CLK,1);    delayMicroseconds(2);
    // ODD
    digitalWrite(ADC_CLK,0);
    digitalWrite(ADC_DIO,odd);  delayMicroseconds(2);
    digitalWrite(ADC_CLK,1);    delayMicroseconds(2);
    // Select
    digitalWrite(ADC_CLK,0);
    digitalWrite(ADC_DIO,sel);    delayMicroseconds(2);
    digitalWrite(ADC_CLK,1);

    delayMicroseconds(2);
    digitalWrite(ADC_CLK,0);
    delayMicroseconds(2);

    for(i=0;i<8;i++)
    {
        digitalWrite(ADC_CLK,1);    delayMicroseconds(2);
        digitalWrite(ADC_CLK,0);    delayMicroseconds(2);

        pinMode(ADC_DIO, INPUT);
        dat1=dat1<<1 | digitalRead(ADC_DIO);
    }

    for(i=0;i<8;i++)
    {
        dat2 = dat2 | ((uchar)(digitalRead(ADC_DIO))<<i);
        digitalWrite(ADC_CLK,1);    delayMicroseconds(2);
        digitalWrite(ADC_CLK,0);    delayMicroseconds(2);
    }

    digitalWrite(ADC_CS,1);
    pinMode(ADC_DIO, OUTPUT);
    return(dat1==dat2) ? dat1 : 0;
}

Esta es una función del ADC0834 para obtener la conversión de Analógico a Digital. El flujo de trabajo específico es el siguiente:

digitalWrite(ADC_CS, 0);

Establece CS a nivel bajo y comienza a habilitar la conversión AD.

// Start bit
digitalWrite(ADC_CLK,0);
digitalWrite(ADC_DIO,1);    delayMicroseconds(2);
digitalWrite(ADC_CLK,1);    delayMicroseconds(2);

Cuando la transición de bajo a alto de la entrada del reloj ocurre por primera vez, establece DIO en 1 como bit de inicio. En los siguientes tres pasos, hay 3 palabras de asignación.

//Single End mode
digitalWrite(ADC_CLK,0);
digitalWrite(ADC_DIO,1);    delayMicroseconds(2);
digitalWrite(ADC_CLK,1);    delayMicroseconds(2);

Tan pronto como la transición de bajo a alto de la entrada del reloj ocurre por segunda vez, establece DIO en 1 y elige el modo SGL.

// ODD
digitalWrite(ADC_CLK,0);
digitalWrite(ADC_DIO,odd);  delayMicroseconds(2);
digitalWrite(ADC_CLK,1);    delayMicroseconds(2);

Una vez que ocurre por tercera vez, el valor de DIO es controlado por la variable odd.

//Select
digitalWrite(ADC_CLK,0);
digitalWrite(ADC_DIO,sel);    delayMicroseconds(2);
digitalWrite(ADC_CLK,1);

El pulso de CLK convertido de nivel bajo a alto por cuarta vez, el valor de DIO es controlado por la variable sel.

Bajo la condición de que channel=0, sel=0, odd=0, las fórmulas operacionales relativas a sel y odd son las siguientes:

int sel = channel > 1 & 1;
int odd = channel & 1;

Cuando se cumple la condición de que channel=1, sel=0, odd=1, por favor consulta la siguiente tabla de lógica de control de dirección. Aquí se elige CH1, y el bit de inicio se desplaza a la ubicación inicial del registro del multiplexor y comienza la conversión.

../_images/image313.png
digitalWrite(ADC_DIO,1);    delayMicroseconds(2);
digitalWrite(ADC_CLK,0);
digitalWrite(ADC_DIO,1);    delayMicroseconds(2);

Aquí, establece DIO en 1 dos veces, ignóralo.

for(i=0;i<8;i++)
    {
        digitalWrite(ADC_CLK,1);    delayMicroseconds(2);
        digitalWrite(ADC_CLK,0);    delayMicroseconds(2);

        pinMode(ADC_DIO, INPUT);
        dat1=dat1<<1 | digitalRead(ADC_DIO);
    }

En la primera declaración for(), tan pronto como el quinto pulso de CLK se convierte de nivel alto a nivel bajo, establece DIO en modo de entrada. Luego, la conversión comienza y el valor convertido se almacena en la variable dat1. Después de ocho períodos de reloj, la conversión se completa.

for(i=0;i<8;i++)
    {
        dat2 = dat2 | ((uchar)(digitalRead(ADC_DIO))<<i);
        digitalWrite(ADC_CLK,1);    delayMicroseconds(2);
        digitalWrite(ADC_CLK,0);    delayMicroseconds(2);
    }

En la segunda declaración for(), se emiten los valores convertidos a través de DO después de otros ocho períodos de reloj y se almacenan en la variable dat2.

digitalWrite(ADC_CS,1);
pinMode(ADC_DIO, OUTPUT);
return(dat1==dat2) ? dat1 : 0;

return(dat1==dat2) ? dat1 : 0 se usa para comparar el valor obtenido durante la conversión y el valor de salida. Si son iguales entre sí, se emite el valor de conversión dat1; de lo contrario, se emite 0. Aquí se completa el flujo de trabajo del ADC0834.

softPwmCreate(LedPin,  0, 100);

La función es usar software para crear un pin PWM, LedPin, luego el ancho de pulso inicial se establece en 0 y el período de PWM es 100 x 100us.

while(1){
        analogVal = get_ADC_Result(0);
        printf("Valor analógico actual: %d\n", analogVal);
        softPwmWrite(LedPin, analogVal);
        delay(100);
    }

En el programa principal, lee el valor del canal 0 que ha sido conectado con un potenciómetro. Y almacena el valor en la variable analogVal, luego escríbelo en LedPin. Ahora puedes ver el brillo del LED cambiar con el valor del potenciómetro.

Foto del Fenómeno

../_images/image181.jpeg