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
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.
Es definitivamente conveniente comprar un kit completo, aquí está el enlace:
Nombre |
ARTÍCULOS EN ESTE KIT |
ENLACE |
|---|---|---|
Kit Raphael |
337 |
También puedes comprarlos por separado en los enlaces a continuación.
INTRODUCCIÓN DE COMPONENTES |
ENLACE DE COMPRA |
|---|---|
- |
Diagrama Esquemático
Procedimientos Experimentales
Paso 1: Construye el circuito.
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.
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