czwartek, 28 listopada 2013

Rasberry Pi i płytka rozszeżeń Gertboard - testy przetworników ADC DAC


Ostatnio miałem możliwość zapoznać się z płytką rozszerzeń Gertboard do Raspberry Pi. Zamieszczam krótkie listingi do uruchomienia przetworników ADC, DAC za pomocą biblioteki WiringPi.

Dokumentacja płyty rozszerzeń Gertboard:

Poniższe kody służą do uruchomienia przetworników bez wykorzystania wbudowanych funkcji w bibliotekę WiringPi do obsługi płytki Gertboard (wykorzystano tylko podstawowe funkcje).

Przetwornik ADC Microchip MCP3002
Wyświetlanie wartości zmierzonej za pomocą przetwornika:

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include "../../wiringPi/wiringPi.h"
#include "../../wiringPi/wiringPiSPI.h"

uint32_t i;

union union1 {
uint16_t word;
uint8_t buf[2];
} var;

int main (){
  wiringPiSetup();
  wiringPiSPISetup (0, 500000);

 while(1){
  var.buf[0] = 0b01101000;
  var.buf[1] = 0;
  wiringPiSPIDataRW (0,var.buf,2);
  i = ((uint32_t)var.buf[0]&0x03)<<8 | var.buf[1];
  printf("%d \n",i);
  delay (500);
 }
}

Przetwornik DAC Microchip MCP4802
Wyświetlanie wartości wyjściowej przetwornika:

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include "../../wiringPi/wiringPi.h"
#include "../../wiringPi/wiringPiSPI.h"

uint32_t i;

union union1 {
uint16_t word;
uint8_t buf[2];
} var;

int main (){
  wiringPiSetup();
  wiringPiSPISetup (1, 500000);

 while(1){

  for (i = 0; i < 255; i++){ 
   var.word |= (i&0x0000000f)<<12 ;
   var.word |= (i>>4);
   wiringPiSPIDataRW (1,var.buf,2);
   var.word = (1<<4)|(1<<5)|(1<<7); //CH1, Gainx1, VOUTavailable
   printf("%d \n",i);
   delay (100);
  }
 }
}

Przetwornik DAC - ADC
Wyświetlanie wartości wyjściowej DAC oraz wartości zmierzonej za pomocą przetwornika ADC:

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include "../../wiringPi/wiringPi.h"
#include "../../wiringPi/wiringPiSPI.h"

uint32_t i,j;

union union1 {
uint16_t word;
uint8_t buf[2];
} adc, dac;

int main (){
  wiringPiSetup();
  wiringPiSPISetup (0, 500000);
  wiringPiSPISetup (1, 500000);
 while(1){
  for(i=0; i < 255; i++){
   dac.word = (1<<4)|(1<<5)|(1<<7); //DAC config, CH1, Gx1, VOUTavail.
   dac.word |= (i&0x0000000f)<<12;
   dac.word |= (i>>4);
   wiringPiSPIDataRW (1,dac.buf,2);
   printf("%d\t",i);

   adc.buf[0] = 0b01101000;  //ADC config, CH0, MSB,
   adc.buf[1] = 0;
   wiringPiSPIDataRW (0,adc.buf,2);
   j = ((uint32_t)adc.buf[0]&0x03)<<8 | adc.buf[1];
   printf("%d \n",j);

   delay (200);
  }
 }
}
W ostatnim teście wykorzystano wyjście DA1 oraz wejście AD0 - zostały bezpośrednio ze sobą zwarte.

Kody są bardzo nieprzejrzyste ;) dlatego konieczne by było zdefiniowanie wyprowadzeń, ewentualnie utworzenie osobnych plików nagłówkowych dla poszczególnych przetworników. Jednak kod powstał na szybko i wyłącznie w celach testowych - nie polecam pisania "poważnych" programów w ten sposób.

Na koniec uwaga: podczas testów okazało się że na płycie rozszerzeń występuje duży spadek napięcia zasilającego przetworniki (zamiast 3,3 V było około 2,2 V), dlatego polecam przed przystąpieniem do testów dokonanie pomiaru napięcia zasilającego bezpośrednio na wyprowadzeniach przetworników. Sytuacja ta powodowała, iż otrzymywałem wyniki mocno różniące się od oczekiwanych... Najprostszym rozwiązaniem sytuacji było zwarcie wyprowadzeń zasilających 3,3 V w okolicach przetwornika oraz złącza GPIO Raspberry Pi. Być może trafiłem na wadliwy egzemplarz... ;( 

Pozdrawiam 
Michał