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

msz
-
-
Posty: 6
Rejestracja: 15 cze 2014, o 00:37

Iteaduino Plus A20 - część 5

Postautor: msz » 5 lis 2014, o 23:42

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:
image02.jpg
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:
image03.jpg
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.
image04.jpg
Po wywołaniu menu rozwijanego można wybrać numer kanału pomiarowego.
image05.jpg
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).
image06.jpg
Miernik cyfrowy
W aplikacji Miernika cyfrowego wyświetlany jest wynik pomiarów we wszystkich ośmiu kanałach pomiarowych.
image07.jpg
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:
image08.jpg
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:
image09.jpg
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:
image10.jpg

Wróć do „Opisy i oceny aplikacji”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 28 gości