Page 1 of 1

4 kanałowy przetwornik analogowo cyfrowy PCF8591T

Posted: 25 October 2016, 20:32 - Tue
by pancio
PCF8591T to tani, nieskomplikowany 4 kanałowy 8 bitowy przetwornik analogowo cyfrowy do prostych zastosowań. Niewątpliwą zaletą układu jest prostota aplikacji oraz... dodatkowy przetwornik cyfrowo - analogowy (sic!), co również bywa przydatne. Układ zasilany jest w przedziale 2,5V - 6V i taki też jest maksymalny zakres pomiarowy. Prędkość dokonywanego pomiaru zależy od szybkości magistrali I2C. Po resztę szczegółów odsyłam do instrukcji serwisowej (załączniki). Układ DVK można kupić wraz z przewodami za mniej niż 2$.
PCF8591T_AD-DA_converter.jpg
no to lecimy...
... zaczynamy od wykrycia układu:

Code: Select all

root@ctdev:~/pcf8591T# i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- 48 -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --                         
root@ctdev:~/pcf8591T# 
Nasz układ dostępny jest pod adresem 0x48 (pamiętajmy, że mamy aż trzy bity na ustalenie adresu układu - co oznacza, że na upartego możemy podłączyć 8 układów PCF8591T!).

Teraz prościutki program. Tym razem wykorzystamy gotową bibliotekę ułatwiającą korzystanie z SMbus pod Pythonem. Znajdziesz ją w załącznikach. Zaletą biblioteki test to, że mamy zunifikowane komendy do operacji na pojedynczych bajtach, słowach i rejestrach bez zastanawiania się czego w danej chwili powinniśmy użyć...

Code: Select all

from I2C import Device
import time

# PCF8591 has one control register:
#MSB 7 6 5 4 3 2 1 0 LSB
#    0 X X X 0 X X X
#      | | |   | | |
#      |  |    |  |
#      |  |    |  |--- A/D Channel Number:
#      |  |    |        00 channel 0 
#      |  |    |        01 channel 1
#      |  |    |        10 channel 2
#      |  |    |        11 channel 3
#      |  |    |
#      |  |    |--- Auto-increment flag (active if 1) 
#      |  |
#      |  |--- Analog input programing:
#      |        00 - four single-ended inputs
#      |        01 - three differential inputs  
#      |        10 - two single ended (AIN0, AIN1) and one differential 
#      |        11 - two independent differential unputs
#      |
#      |--- ANALOG OUTPUT ENABLE FLAG (D/A): output enable if 1 
#


# PCF8591 Address:
ADDRESS = 0x48

# I2C BUS:
BUS = 1

# Register details
#Analog inputs:
AIN0	=	0x40 
AIN1	=	0x41 
AIN2	=	0x42 
AIN3	=	0x43 
AOUT	=	0x40

AUTOINCREMENT	=	0x04


#Initialize	
pcf=Device(ADDRESS, BUS)

def read_AIN0 ():
	""" Function doc """
	pcf.writeRaw8(AIN0)
	ain0 = pcf.readRaw8()
	return ain0

def read_AIN1 ():
	""" Function doc """
	pcf.writeRaw8(AIN1)
	ain1 = pcf.readRaw8()
	return ain1
	
def read_AIN2 ():
	""" Function doc """
	pcf.writeRaw8(AIN2)
	ain2 = pcf.readRaw8()
	return ain2
	
def read_AIN3 ():
	""" Function doc """
	pcf.writeRaw8(AIN3)
	ain3 = pcf.readRaw8()
	return ain3

def write_AOUT (data):
	""" Function doc """
	pcf.write8(AOUT, data)
		

while 1:
	for x in range (0,255):
		write_AOUT(x)
		print read_AIN0(), read_AIN1(), read_AIN2(), read_AIN3(), "AOUT=",x



Program będzie w pętli pokazywał nam wartości zmierzone na poszczególnych wejściach analogowych jak również ustalał poziom na wyjściu AOUT (w prezentowanym module na wyjściu mamy diodę LED, która pulsuje w takt zapisywanych zmian):

Code: Select all

root@ctdev:~/pcf8591T# python pcf8591Tdemo.py 
129 165 212 100 AOUT= 0
128 168 212 94 AOUT= 1
128 164 212 98 AOUT= 2
128 165 212 96 AOUT= 3
128 168 212 98 AOUT= 4
128 164 212 100 AOUT= 5
128 164 212 99 AOUT= 6
128 167 212 99 AOUT= 7
128 165 212 101 AOUT= 8
128 167 212 106 AOUT= 9
128 165 212 106 AOUT= 10
128 164 212 104 AOUT= 11
128 167 212 104 AOUT= 12
128 166 212 106 AOUT= 13
128 164 212 107 AOUT= 14
128 166 212 111 AOUT= 15
128 167 213 110 AOUT= 16
128 164 212 113 AOUT= 17
128 165 212 109 AOUT= 18

Działający PCF8591T
Działający PCF8591T