W kolejnej częsci zostaną przedstawione dwa moduły wykorzystujące przetworniki analogowo-cyfrowe i cyfrowo-analogowe.
Pierwszy z modułów umożliwia pomiar napięć stałych w kilku kanałach z wykorzystaniem Iteaduino oraz tanich i łatwo dostępnych elementów.
Moduł woltomierza posiada 8-kanałów o dopuszczalnym napięciu wejściowym z zakresu 0..24 V i rezystancji wejściowej wynoszącej 10 MOhm. Pomiary dokonywane są z rozdzielczością 10-bitów.
Głównym elementem modułu jest 8-kanałowy, 10-bitowy przetwornik analogowo-cyfrowy MCP3008 produkowany przez firmę Microchip. Zasilany może być napięciem z zakresu 2,7 - 5 V. Szybkość próbkowania jest zależna od napięcia zasilającego przetwornik i
waha się od 75 kpróbek/s przy Vcc = 2,7 V do 200 kpróbek/s przy Vcc = 5V. Schemat blokowy układu zaczerpnięty z noty wygląda następująco:
W projekcie zastosowano przetwornik w obudowie PDIP.
Wartość napięcia odniesienia Vref przetwornika wynosi 2,5 V. Jest to też maksymalna wartość napięcia mierzonego na wejściach CH0..CH7 przetwornika A/C, której odpowiada odczytana wartość 1023. Napięcie Vref doprowadzono z układu MCP1524. Aby mierzyć napięcia o wiekszej wartości konieczne jest poszerzenie zakresu pomiarowego przez zastosowanie dzielnika rezystancyjnego.
Napięcie wejściowe doprowadzone jest do złącza śrubowego Z1 i podawane na dzielnik napięciowy o stopniu podziału równym 1/10.
Rezystancja widziana od strony źródła sygnału jest równa 10MOhm. W każdym kanale pomiarowym znajdują się dwie diody zabezpieczające przed podaniem napięcia o odwrotnej polaryzacji (D2) lub o wartości większej niż napięcie zasilające moduł (D1).
Wzmacniacz operacyjny pracuje jako wtórnik emiterowy zapewniając dużą rezystancję wejściową i małą wyjściową separując źródło od odbiornika. Napięcie wyjściowe wtórnika jest równe napięciu wejściowemu (wzmocnienie napięciowe Ku równe 1).
Moduł zasilany jest napięciem 3,3 V. Komunikacja z modułem możliwa jest przez cztero przewodową magistralę SPI.
Jeśli wymagana jest większa rozdzielczość można zastosować 12-bitowy przetwornik MCP3208, którego obudowa i wyprowadzenia są identyczne.
Przykładowy program do obsługi przetwornika MCP3008 można znaleźć na stronie https://github.com/nodesign/MCP3008.
Szkic Arduino wymaga niewielkich modyfikacji, aby można było go uruchomić na Iteaduino.
#include "itead.h"
// Brak dzielnika napięć oraz Vref = 3,3 V, zatem maksymalne napięcie wejściowe to 3,3 V
#define cspin 107
#define clockpin 114
#define mosipin 115
#define misopin 116
void setup()
{
pinMode(cspin, OUTPUT);
pinMode(clockpin, OUTPUT);
pinMode(mosipin, OUTPUT);
pinMode(misopin, INPUT);
}
int readADC(int adcnum)
{
if ((adcnum > 7) || (adcnum < 0)) return -1;
digitalWrite(cspin, HIGH);
digitalWrite(clockpin, LOW);
digitalWrite(cspin, LOW);
int commandout = adcnum;
commandout |= 0x18;
commandout <<= 3;
for (int i=0; i<5; i++)
{
if (commandout & 0x80)
digitalWrite(mosipin, HIGH);
else
digitalWrite(mosipin, LOW);
commandout <<= 1;
digitalWrite(clockpin, HIGH);
digitalWrite(clockpin, LOW);
}
int adcout = 0;
for (int i=0; i<12; i++)
{
digitalWrite(clockpin, HIGH);
digitalWrite(clockpin, LOW);
adcout <<= 1;
if (digitalRead(misopin))
adcout |= 0x1;
}
digitalWrite(cspin, HIGH);
adcout >>= 1;
return adcout;
}
void loop()
{
int data1 = readADC(0);
int data3 = readADC(2);
int data6 = readADC(5);
float V1 = data1 * (3.3 / 1024);
float V3 = data3 * (3.3 / 1024);
float V6 = data6 * (3.3 / 1024);
printf("V1=%f | V3=%f | V6=%f \r\n", V1, V3, V6);
}
Efekt:
Miernik analogowy
Do obsługi wirtualnego woltomierza napisałem oprogramowanie pozwalające na wizualizację wartości mierzonego napięcia w wybranym kanale. Zakres pokazywany na mierniku ustalany jest automatycznie.
Po wywołaniu menu rozwijanego można wybrać numer kanału pomiarowego.
Program został tak zaprojektowany, iż pozwala na jednoczesne uruchomienie wielu procesów odwołujących sie do przetwornika A/C (w danej chwili możliwy jest odczyt napięcia tylko w jednym kanale).
Miernik cyfrowy
W aplikacji Miernika cyfrowego wyświetlany jest wynik pomiarów we wszystkich ośmiu kanałach pomiarowych.
Przetwornik cyfrowo-analogowy
W drugim module zastosowano 12-bitowy podwójny przetwornik cyfrowo-analogowy z wewnętrznym źródłem napięcia odniesienia MCP4822 umieszczony w obudowie PDIP8.
Schemat modułu jest następujący:
Układ posiada wewnętrzne źródło napięcia odniesienia 2,048 V. Napięcie zasilania mieści się w zakresie 2,7 - 5,5 V.
Schemat blokowy układu przedstawia rysunek:
Moduł powinien być zasilany napięciem 3,3 V.
Szkic Arduino powstał na bazie materiałów, który można znaleźć na stronie http://hacking.majenko.co.uk/MCPDAC.
#include <itead_spi.h>
#define CHANNEL_A false
#define CHANNEL_B true
#define GAIN_LOW false
#define GAIN_HIGH true
#define cspin 102
#define ldacpin 108
boolean ldac;
boolean gainA;
boolean gainB;
boolean shutdownA;
boolean shutdownB;
void setGain(bool chan, bool gain)
{
if(chan == CHANNEL_A)
{
gainA = gain;
}
else
{
gainB = gain;
}
}
void shutdown(bool chan, bool sd)
{
if(chan == CHANNEL_A)
{
shutdownA = sd;
}
else
{
shutdownB = sd;
}
}
void setVoltage(bool channel, unsigned int mv)
{
unsigned int command;
if(channel == CHANNEL_A)
{
command = 0x0000;
command |= shutdownA ? 0x0000 : 0x1000;
command |= gainA ? 0x0000 : 0x2000;
command |= (mv & 0x0FFF);
SPI.setDataMode(SPI_MODE0);
digitalWrite(cspin,LOW);
SPI.transfer(command>>8);
SPI.transfer(command&0xFF);
digitalWrite(cspin,HIGH);
}
else
{
command = 0x8000;
command |= shutdownB ? 0x0000 : 0x1000;
command |= gainB ? 0x0000 : 0x2000;
command |= (mv & 0x0FFF);
SPI.setDataMode(SPI_MODE0);
digitalWrite(cspin,LOW);
SPI.transfer(command>>8);
SPI.transfer(command&0xFF);
digitalWrite(cspin,HIGH);
}
}
void update()
{
if(ldac==false)
return;
digitalWrite(ldacpin,LOW);
digitalWrite(ldacpin,HIGH);
}
void setup()
{
ldac = true;
shutdownA = false;
shutdownB = false;
gainA = false;
gainB = false;
pinMode(ldacpin,OUTPUT);
digitalWrite(ldacpin,HIGH);
pinMode(cspin,OUTPUT);
digitalWrite(cspin,HIGH);
SPI.begin();
setGain(CHANNEL_A,GAIN_HIGH);
shutdown(CHANNEL_A,false);
shutdown(CHANNEL_B,false);
}
void loop()
{
setVoltage(CHANNEL_A, 630);
setVoltage(CHANNEL_B, 430);
delay(1000);
}
Źródło napięć odniesienia
Aplikacja sterowania źródłem napięć odniesienia bazująca na dwóch układach MCP4822 (4 wyjścia) pokazana jest na rysunku:
Aktyw Forum
Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.
Sprawdź punkty Zarejestruj sięIteaduino Plus A20 - część 5
Moderatorzy:Jacek Bogusz, Grzegorz Becker, Moderatorzy
Kto jest online
Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 11 gości