Skocz do zawartości

Problem z wyświetleniem napięcia z przetwornika PCF8591(I2C)


Pomocna odpowiedź

  • 6 miesiące później...

Cóż, kostka poszła na pół roku do szafki i dziś trochę grzebania i olśnienie.

Nie wiem dlaczego ale wszystko spowodowane było tym, że prawdopodobnie bascomowa biblioteka do obsługi sprzętowego i2c (twi) ma jakiś błąd (ogólnie ta biblioteka dziwnie się zachowuje na dłuższą metę, jak i wiele innych rzeczy w bascomie, ale to inna sprawa).

Ostatecznie uruchomienie na zwykłym, programowym i2c z rezystorami 4k7, wszystko pięknie ruszyło i jest pełna 8bitowa rozdzielczość 😃

poniżej kody dla potomnych (oba działają)

$regfile = "m644pdef.dat"
$crystal = 16000000
Config Sda = Portc.1
Config Scl = Portc.0
$baud = 9600
'(
Dim Trf(8) As Byte , Ot As Byte , Incs As Bit , Tmp As Byte

Ot = 0
Incs = 1
Tmp = &B01000000
'Tmp = &B00000000
Do
Trf(1) = Tmp
Trf(2) = Ot
Trf(3) = Ot
I2csend &B10010000 , Trf(1) , 3
Trf(1) = Tmp + 0
Trf(3) = Tmp + 1
Trf(5) = Tmp + 2
Trf(7) = Tmp + 3
I2cstart
I2creceive &B10010000 , Trf(1) , 1 , 2
I2creceive &B10010000 , Trf(3) , 1 , 2
I2creceive &B10010000 , Trf(5) , 1 , 2
I2creceive &B10010000 , Trf(7) , 1 , 2
I2cstop
Print "I0: " ; Trf(2) ; "   "
'Print "I1: " ; Trf(4) ; "   "
'Print "I2: " ; Trf(6) ; "   "
'Print "I3: " ; Trf(8) ; "   "
'Print "O0: " ; Ot ; "   "
Waitms 250
If Incs = 1 Then
Incr Ot
If Ot = 255 Then Incs = 0
Else
Decr Ot
If Ot = 0 Then Incs = 1
End If

Loop
')

Const Pcf8591w = &B10010000
Const Pcf8591r = &B10010001

Dim Pom As Byte

I2cinit

Do

I2cstart
I2cwbyte Pcf8591w
I2cwbyte &B00000000
'I2cwbyte &B00000000
I2cstop
'konfiguracja, wybór kanału 1

I2cstart
I2cwbyte Pcf8591r
I2crbyte Pom , Ack
I2crbyte Pom , Nack
I2cstop
'odczyt pomiaru

Print "I0: " ; Pom
Waitms 250

Loop

End

Witam

Jestem początkującym programistom w języku Baskom. Uczę się z książki prof. Góreckiego. Do wykonywania ćwiczeń korzystam z płytki ZL11AVR z procesorem attiny2313. Jedno z ćwiczeń dotyczy programowania woltomierza przy użyciu kostki pcf8591. Niestety układ działa niewłaściwie (program z książki). Przetwornik D/A działa poprawnie natomiast zastrzeżenia mam do precyzji przetwornika A/D. By przetestować kostkę pcf napisałem program (kod poniżej) w którym stałe stabilne napięcie jest odczytywane z wejście I0 (A/D), a następnie wysyłane do wyjścia OUT (D/A). Przy ustawieniu napięcia referencyjnego 2,56V rozdzielczość przetwornika powinna wynosić 0,01V. Po zadaniu napięcia np 0,3V z portu OUT odczytuję zmieniające się losowo napięcia z zakresu 0,3V+-0,1. Podwyższając napięcie np do 1V układ zachowuje się tak samo odczyt: 1V +-0,1. Wykluczyłem uszkodzenie przetwornika, ponieważ sprawdziłem dwie kostki pcf i wyniki były takie same. Sprawdziłem także różne proponowane na forum warianty komunikacji I2C jednak bez pozytywnych rezultatów. Ostatnia rzecz jaka przychodzi mi do głowy tj. wpływ na precyzję działania przetwornika mają momenty wykonywania podprogramów wywoływanych przez timer'y?

Proszę o pomoc jak poprawnie skonfiurować przetwornik pcf..

Pozdrawiam

$regfile = "attiny2313.dat"
Config Sda = Portd.6
Config Scl = Portd.5
Dim Odczyt As Byte
Config Timer0 = Timer , Prescale = 64
Config Timer1 = Timer , Prescale = 64
Enable Interrupts
Enable Timer0
Enable Timer1
On Timer0 Nadaj
On Timer1 Odczytaj


Do : Loop : End


Odczytaj:
I2cinit
I2cstart
I2cwbyte 145
I2crbyte Odczyt , Nack
I2cstop
Return


Nadaj:
I2cinit
I2cstart
I2cwbyte 144
I2cwbyte 64
I2cwbyte Odczyt
I2cstop
Return

Napięcia mierzę multimetrem (velleman DVM205AM) zarówno I0-GND jak i OUT-GND. W przykładzie z książki wynik pomiaru napięcia miał być wyświetlany na wyświetlaczach diodowych (cytując autora miał być precyzyjny) niestety na wyświetlaczach działa się ta sama sytuacja opisana wcześniej.

Za mną kolejne próby zdiagnozowania problemu. Napięcie mierzyłem milivoltomierzem analogowym i bez zmian wartość napięcia z przetwornika D/A cały czas waha się w szerokim zakresie. Natomiast po uproszczeniu kodu do postaci

$regfile = "attiny2313.dat"
Config Sda = Portd.6
Config Scl = Portd.5
Dim Odczyt As Byte

Do
I2cinit
I2cstart
I2cwbyte 145
I2crbyte Odczyt , Nack
I2cstop
I2cstart
I2cwbyte 144
I2cwbyte 64
I2cwbyte Odczyt
I2cstop
Loop
End

wartość napięcia pod względem stabilność jest zadowalająca w granicach rozdzielczości przetwornika, natomiast występuje błąd offsetu ok. 50mV (tyle też wynosi max błąd offsetu bodany w instrukcji). Jak wyjaśnić takie zachowanie układu porównując różnice w kodach. Proszę o pomoc doświadczonych forumowiczów.

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...