Pentru a citi diferite valori analogice si a le transforma in valori digitale vom vedea cum putem face acest lucru cu ajutorul placii de dezvoltare STM32 BluePill.
Convertoarele analog/digitale (ADC) din aceasta placa de dezvoltare functioneaza cu o rezolutie de 12 biti. De aceea se pot obtine valori in plaja 0-4095 (rezultatul lui 2 la puterea a 12-a).
Pentru a citi tensiunea vom folosi urmatoarea formula de calcul: Tensiune/Pas = Tensiune_referinta/212. Cum tensiune de referinta va fi de 3.3V rezulta ca cea mai mica valoare a tensunii citite este de 3.3V / 4096 = 0.8056mV. Tensiune poate fi calculata cu aceasta formula: Tensiune = (Valoare ADC / rezolutie ADC) * Tensiune_referinta.
Pentru a testa convertorul Analog/Digital vom folosi un rezistor semireglabil conectat cu terminalele la +3.3V si GND iar cursorul conectat la pinul PA06. Placuta de dezvoltare STM32 BluePill are 10 intrari analogice (ADC): pinii PA0 - PA7 si pinii PB0-PB1.
In acest exemplu pentru afisarea informatiilor analogice si conversia lor in format digital vom folosi displayul led 160*128 ST7735, acest se va conecta la placa de dezvoltare conforma acestui articol.
Sketchul folosit este urmatorul:
#include <Adafruit_GFX.h>
#include <Adafruit_ST7735.h>
#include <SPI.h>
#define TFT_CS PA3
#define TFT_DC PA4
#define TFT_RST PA2
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);
const int SR = PA6; //declaram pinul PA6 ca intrare analogica
void setup() {
tft.initR(INITR_BLACKTAB);
tft.setRotation(2);
tft.fillScreen(ST77XX_BLACK);
tft.setCursor(0, 30);
tft.setTextColor(ST77XX_WHITE);
tft.setTextSize(2);
tft.setTextWrap(true);
tft.println("Vizitati site-ul www.electronicstore.ro!");
delay(2000);
tft.fillScreen(ST77XX_BLACK);
tft.setCursor(0, 30);
tft.setTextColor(ST77XX_WHITE);
tft.setTextSize(2);
tft.setTextWrap(true);
tft.println("STM32 BluePill convertor analog digital");
delay(2000);
}
void loop() {
tft.fillScreen(ST77XX_BLACK);
int valoare = analogRead(SR); //citim valoare analogica a tensiunii aflate la cursorul semireglabilului
float tensiune = (float(valoare)/4096 * 3.3); //calculam tensiunea existenta la cursorul semireglabilului
tft.setCursor(5, 10);
tft.setTextColor(ST77XX_WHITE);
tft.setTextSize(2);
tft.setTextWrap(true);
tft.println("Valoare:");
tft.setCursor(0, 30);
tft.setTextColor(ST77XX_RED);
tft.println(valoare);
tft.setCursor(5, 60);
tft.setTextColor(ST77XX_WHITE);
tft.println("Tensiune:");
tft.setCursor(0, 90);
tft.setTextColor(ST77XX_RED);
tft.println(tensiune);
delay(500);
}