Bemerkung

Hallo und willkommen in der SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasten-Gemeinschaft auf Facebook! Tauchen Sie tiefer ein in die Welt von Raspberry Pi, Arduino und ESP32 mit anderen Enthusiasten.

Warum beitreten?

  • Expertenunterstützung: Lösen Sie Nachverkaufsprobleme und technische Herausforderungen mit Hilfe unserer Gemeinschaft und unseres Teams.

  • Lernen & Teilen: Tauschen Sie Tipps und Anleitungen aus, um Ihre Fähigkeiten zu verbessern.

  • Exklusive Vorschauen: Erhalten Sie frühzeitigen Zugang zu neuen Produktankündigungen und exklusiven Einblicken.

  • Spezialrabatte: Genießen Sie exklusive Rabatte auf unsere neuesten Produkte.

  • Festliche Aktionen und Gewinnspiele: Nehmen Sie an Gewinnspielen und Feiertagsaktionen teil.

👉 Sind Sie bereit, mit uns zu erkunden und zu erschaffen? Klicken Sie auf [hier] und treten Sie heute bei!

2.1.7 Potentiometer

Bemerkung

../_images/mcp3008_and_adc0834.jpg

Abhängig von Ihrer Kit-Version identifizieren Sie bitte, ob Sie ADC0834 oder MCP3008 haben, und fahren Sie mit dem entsprechenden Abschnitt fort.

Einführung

Die ADC-Funktion kann verwendet werden, um analoge Signale in digitale Signale umzuwandeln. In diesem Experiment wird ADC0834 verwendet, um die Funktion involvierend ADC zu erhalten. Hier setzen wir diesen Prozess mit einem Potentiometer um. Das Potentiometer ändert die physikalische Größe – die Spannung, die durch die ADC-Funktion umgewandelt wird.

Benötigte Komponenten

Für dieses Projekt benötigen wir die folgenden Komponenten.

../_images/list_2.1.4_potentiometer.png

Es ist definitiv praktisch, ein ganzes Set zu kaufen, hier ist der Link:

Name

ARTIKEL IN DIESEM KIT

LINK

Raphael Kit

337

Raphael Kit

Sie können sie auch einzeln über die untenstehenden Links kaufen.

KOMPONENTENBESCHREIBUNG

KAUF-LINK

GPIO Extension Board

KAUFEN

Steckbrett

KAUFEN

Jumper-Kabel

KAUFEN

Widerstand

KAUFEN

LED

KAUFEN

Potentiometer

KAUFEN

ADC0834

-

Schaltplan

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

Experimentelle Verfahren

Schritt 1: Bauen Sie die Schaltung auf.

../_images/image180.png

Bemerkung

Bitte platzieren Sie den Chip entsprechend der Abbildung. Beachten Sie, dass die Rillen des Chips links sein sollten, wenn er platziert wird.

Schritt 2: Öffnen Sie die Code-Datei.

cd ~/raphael-kit/c/2.1.7/

Schritt 3: Kompilieren Sie den Code.

gcc 2.1.7_Potentiometer.c -lwiringPi

Schritt 4: Ausführen.

sudo ./a.out

Nach dem Start des Codes drehen Sie den Knopf am Potentiometer. Die Intensität der LED wird entsprechend ändern.

Bemerkung

Wenn es nach dem Start nicht funktioniert oder eine Fehlermeldung erscheint: "wiringPi.h: No such file or directory", bitte beziehen Sie sich auf Installieren und Überprüfen von WiringPi.

Code

#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;
}

Code-Erklärung

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

Definieren Sie CS, CLK, DIO von ADC0834 und verbinden Sie sie mit GPIO0, GPIO1 und GPIO2 bzw. Schließen Sie dann die LED an GPIO3 an.

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);

    digitalWrite(ADC_DIO,1);    delayMicroseconds(2);
    digitalWrite(ADC_CLK,0);
    digitalWrite(ADC_DIO,1);    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;
}

Es gibt eine Funktion von ADC0834, um die Analog-Digital-Umwandlung durchzuführen. Der spezifische Ablauf ist wie folgt:

digitalWrite(ADC_CS, 0);

Setzen Sie CS auf ein niedriges Niveau und starten Sie die AD-Umwandlung.

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

Wenn der Übergang von niedrig zu hoch des Clock-Inputs das erste Mal auftritt, setzen Sie DIO auf 1 als Start-Bit. In den folgenden drei Schritten gibt es 3 Zuweisungswörter.

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

Sobald der Übergang von niedrig zu hoch des Clock-Inputs das zweite Mal auftritt, setzen Sie DIO auf 1 und wählen Sie den SGL-Modus.

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

Beim dritten Mal wird der Wert von DIO durch die Variable odd gesteuert.

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

Beim vierten Mal wird der Wert von DIO durch die Variable sel gesteuert.

Unter der Bedingung, dass channel=0, sel=0, odd=0, lauten die betrieblichen Formeln für sel und odd wie folgt:

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

Wenn die Bedingung channel=1, sel=0, odd=1 erfüllt ist, beziehen Sie sich bitte auf die folgende Adresssteuerungslogiktabelle. Hier wird CH1 gewählt, und das Start-Bit wird in die Startposition des Multiplexer-Registers verschoben und die Umwandlung beginnt.

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

Hier wird DIO zweimal auf 1 gesetzt, bitte ignorieren Sie es.

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);
    }

Im ersten for() Statement wird, sobald der fünfte Impuls von CLK von einem hohen auf ein niedriges Niveau gewechselt wird, DIO auf den Eingabemodus gesetzt. Dann beginnt die Umwandlung, und der umgewandelte Wert wird in der Variable dat1 gespeichert. Nach acht Taktperioden ist die Umwandlung abgeschlossen.

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);
    }

Im zweiten for() Statement werden die umgewandelten Werte nach weiteren acht Taktperioden über DO ausgegeben und in der Variable dat2 gespeichert.

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

return(dat1==dat2) ? dat1 : 0 wird verwendet, um den während der Umwandlung erhaltenen Wert und den Ausgabewert zu vergleichen. Wenn sie gleich sind, geben Sie den umgewandelten Wert dat1 aus; andernfalls geben Sie 0 aus. Hier ist der Ablauf von ADC0834 abgeschlossen.

softPwmCreate(LedPin,  0, 100);

Die Funktion dient dazu, mit Software einen PWM-Pin, LedPin, zu erstellen. Dann wird die anfängliche Pulsbreite auf 0 gesetzt und die Periode des PWM beträgt 100 x 100us.

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

Im Hauptprogramm lesen Sie den Wert des Kanals 0, der mit einem Potentiometer verbunden ist. Speichern Sie den Wert in der Variable analogVal und schreiben Sie ihn in LedPin. Jetzt können Sie die Helligkeit der LED sehen, die sich mit dem Wert des Potentiometers ändert.

Phänomen-Bild

../_images/image181.jpeg