Get the Flash Player to see this player.

time2online Joomla Extensions: Simple Video Flash Player Module
Moduł przetwornika cyfrowo analogowego pcf8591 na I2C dla RPI

W tym artykule pokaże jak obsłużyć przetwornik analogowocyfrowy za pomocą bibliotek wiringPi. Przetworniki analogowocyfrowe są najważniejszymi urządzeniami ponieważ używane są praktycznie wszędzie. Dzięki takiemu urządzeniu będziemy mogli sczytać wartości z czujników lub sprawdzić napięcia na kluczowych miejscach w płytkach PCB. Docelowo chcę stworzyć urządzenie które automatycznie będzie testowało płytki PCB.

Aby tego dokonać należy załączyć magistrale I2C oraz zainstalować wiringPi opisałem to w poprzednim artykule:

http://avrkwiat.nstrefa.pl/omnie/index.php?option=com_content&view=article&id=245&Itemid=273

oraz załatwić moduł pcf8591. Ja kupiłem go tu:

http://botland.com.pl/moduly-rozszerzajace-raspberry-pi-2/2632-pcf8591-przetwornik-ac-i-ca-8-bitowy-i2c.html

Teraz wystarczy skorzystać z noty katalogowej układu i wysyłać za pomocą I2C odpowiednie liczby w rejestry urządzenia PCF8591. Urządzenie jest bardzo proste ponieważ posiada tylko 1 rejestr konfiguracyjny, więc wystarczy wysłać liczbę do tego rejestru i poczekać na odpowiedź urządzenia. Rejestr konfiguracyjny jest opisany tu:

http://www.nxp.com/documents/data_sheet/PCF8591.pdf

To co nas interesuje zaprezentowałem poniżej:

Aby obsłużyć najprostszy przypadek, czyli odczytanie dane z AIN3 (potencjometr zworka P6) wystarczy do urządzenia wysłać 0x03. Można to zrobić za pomocą konsoli i odczytać dane:

Najpierw użyliśmy polecenia i2cdetect aby zidentyfikować adres urządzenia (był to 0x48). Następnie wysłaliśmy do urządzenia komendę 0x03, czyli uruchomienie przetwornika AIN3 (tam gdzie jest potencjometr). Następnie potencjometr skręciłem tak, aby dawa 0V i odczytałem z urządzenia dane 0xbe (zaznaczone na czerwono). Są to dane trzymane przez urządzenie w rejestrze z poprzedniego pomiaru, dlatego trzeba pobrać dane jeszcze raz. Jest to dosyć istotne, bo pisząc program w C, będziemy mieli dane przesunięte. Następnie podkręciłem potencjometr do 3,3V i uzyskałem 0xff.

To samo możemy zrobić za pomocą bibliotek WiringPi:

/*
* i2c.c:
* Simple test I2C. Device pcf8591
***********************************************************************
*/
 
#include <wiringPi.h>
#include <wiringPiI2C.h>
 
 
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
 
 
int main (void)
{
int fd, dane, idDev=0x48;
FILE *fp;
 
 
if(wiringPiSetup() == -1)
 exit(1);
 
if((fd=wiringPiI2CSetup(idDev)) == -1){
 printf("error initialize I2C");
 exit(1);
}
printf(" I2C modul pcf8591 A/C i D/C");
 //empty run
 dane = wiringPiI2CRead(fd);
 wiringPiI2CWrite (fd, 0x00);
 
 /////AIN0
 delay (400) ;
 wiringPiI2CWrite (fd, 0x01);
 delay (400) ;
 dane = wiringPiI2CRead(fd);
 delay (400) ;
 printf("\nAIN0: %d",dane);
 
 ////AIN1
 
 wiringPiI2CWrite (fd, 0x02);
 delay (400) ;
 dane = wiringPiI2CRead(fd);
 delay (400) ;
 printf("\nAIN1: %d",dane);
 
 ///AIN2
 
 wiringPiI2CWrite (fd, 0x03);
 delay (400) ;
 dane = wiringPiI2CRead(fd);
 delay (400) ;
 printf("\nAIN2: %d ",dane);
 delay (400) ;
 
 
 ///// AIN3
 
 wiringPiI2CWrite (fd, 0x00);
 delay (400) ;
 dane = wiringPiI2CRead(fd);
 delay (400) ;
 printf("\nAIN3: %d\n",dane); 
 
 
return 0 ;
}