4 kanałowy przetwornik analogowo cyfrowy PCF8591T
Posted: 25 October 2016, 20:32 - Tue
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$.
no to lecimy...
... zaczynamy od wykrycia układu:
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ć...
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):
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#
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