Analog Read/Write

Tento příklad znázorňuje, jak vyčíst analogovou hodnotu napětí pomocí zařízení IODAG3E. Jako příklad budeme pomocí této hodnoty pozorovat pozici otočení potenciometru. Toto natočení budeme monitorovat pomocí sériové linky v PC. Taktéž budeme měnit hodnotu napětí na LED a tím ji stmívat.

Použitý hardware

  • IODAG3E

  • 10kΩ potenciometr

  • LED

  • 220Ω rezistor

Schéma zapojení

Potenciometr zapojíme tak abychom vytvořili jednoduchý dělič napětí. Potenciometr zapojíme mezi pin 3V3 a GND. Jezdec potenciometru poté zapojíme na pin Y23, který dokáže pracovat jako analogový vstup. LED poté připojíme k pinu Y25, který naopak dokáže pracovat jako analogový výstup viz Analogové vstupy a Analogové výstupy.

Funkce

Zařízení IODA je vybavené ADC převodníky a na některých svých vstupech konektoru XY je schopné snímat analogovou hodnotu napětí a interpretovat tuto hodnotu číslem v programu. Hodnota tohoto vstupního napětí musí být v rozsahu 0-3.3V a lze ji interpretovat několika způsoby. Buď jí lze interpretovat hodnotou float, která reprezentuje rozsah vstupního napětí desetiným číslem 0-1, nebo jí lze interpretovat celočíselným 16ti-bitovým číslem (uint16_t). Více o Analogovém vstupu se lze dozvědět v sekci Vstupy a výstupy. Následující kód převede vstupní hodnotu napětí, která je závislá na otočení potenciometru, do digitální podoby a nastaví pomocí ní výstupní hodnotu napětí na LED diodě. Otáčením tedy můžeme LED diodu stmívat a rozsvěcet.

Code

  /**AnalogOutInSerial
    * Reads an analog input pin, maps the result to a range from 0 to 1 and uses
    * the result to set the pulse width modulation (PWM) of an output pin.
    * Also prints the results to the Serial Monitor.
    */
#include "byzance.h"   // Include libraries for IODA.
Serial pc(SERIAL_TX, SERIAL_RX);   // Defines the comunication interface if the serial line , SPI, CAN is needen in the program.

AnalogOut aout(Y25);   
AnalogIn ain(Y23);
// the init routine runs only once when you press reset:
void init(){
  pc.baud(115200);   // set baud rate.
}
// the loop routine runs over and over agin forever:
void loop(){ 
  pc.printf("ain value =%3.3f%%\n",ain.read());
  aout=ain; 

  Thread::wait(100);   // Wait for 100ms.

}

V hlavičce programu je nutné importovat knihovny Byzance Hardware API a Mbed API. pomocí

 #include "byzance.h"

Poté nasleduje konstruktor definující objekt sériové linky.

 Serial pc(SERIAL_TX, SERIAL_RX);

Analogový vstup (AnalogIn)

Převede napětí na pinu analogového vstupu v rozmezí 0 - 3.3V do digitální podoby a interpretuje ho číslem na škále 0-1.

 AnalogIn ain(pin_name);  // Analog input definition
printf(”ain value = %3.3f%%\n”, ain.read());

Analogový výstup (AnalogOut)

Funkce AnalogOut umožňuje definovat analogový výstup, který pomocí digitáně analogového převodníku dokáže na základě vstupní hodnoty této funkce měnit hodnotu napětí na výstupním pinu v rozsahu 0 - 3.3V . Procesor umožňuje definovat dva analogové výstupy, a to na pinech Y23 a Y25. Velikost napětí na výstupu je škálováno zápisem v rozsahu 0 - 1, kdy 1 je maximální napětí 3.3V.

AnalogOut aout(Y25);  // Analog output definition 

aout = 1.0f;   // Set maximum voltage to output (3,3V)
aout = 0.5f;   // Set half of maximum voltage to output (1,65V)

aout.read();   // Read voltage value set to output

Funkce init() se vyvolá při spuštění. Používa se pro inicializaci proměnných, pinových režimů apod. Funkce se spustí pouze jednou při spuštění nebo resetování desky. V tomto případě pouze inicializuje rychlost komunikace sériové linky.

// the init routine runs only once when you press reset:
void init(){
  pc.baud(115200);   // set baud rate.
}

Funkce loop() je nekonečná smyčka, ve které se přečte hodnota napětí na jezdci potenciometru do proměnné ain. Tato hodnota se vypíše do sériové linky a nastaví se pomocí ní výstupní hodnota napětí na LED diodě (aout).

// the loop routine runs over and over agin forever:
void loop(){ 
  pc.printf("ain value =%3.3f%%\n",ain.read());
  aout=ain; 
  
 Thread::wait(100);
}

V poslední části kódu je vlákno programu uspáno na 100 milisekund.

 Thread::wait(100);

Last updated