Pomiar napięcia Atmega8


Witam w internecie znalazłem programik do pomiaru napięci do 4,9 [V] z 3 punktów programik wygląda tak.

'Program obsługi wbudowanego w mikrokontroler
'10-bitowego przetwornika A/C
 
$regfile = "m8def.dat"                                      'informuje kompilator o pliku
'dyrektyw mikrokontrolera
$crystal = 8000000                                          'informuje kompilator
'o częstotliwości oscylatora
'taktującego mikrokontroler
Config Lcd = 16 * 2                                         'konfiguracja typu wyświetlacza
'LCD
Config Lcdpin = Pin , Db4 = Portd.5 , Db5 = Portd.6 , Db6 = Portd.7 , Db7 = Portd.4 , E = Portd.3 , Rs = Portd.2       'konfiguracja linii
'mikrokontrolera, do których dołączono wyświetlacz LCD
Config Adc = Single , Prescaler = Auto , Reference = Avcc   'konfiguracja wewnętrznego przetwornika A/C
 
Dim Wart_ac1 As Word                                        'zmienna na wartość odczytaną z przetwornika
Dim Wart_ac2 As Word
Dim Wart_ac3 As Word
 
 
Dim V1 As Single                                            'zmienna przechowująca obliczon
Dim V2 As Single                                            'wartość zmierzonego napięcia
Dim V3 As Single
 
Dim Wart_nap1 As String * 3                                 'zmienna, do której wpisywana
Dim Wart_nap2 As String * 3                                 'zostaje przetworzona wartość zmiennej V na tekst
Dim Wart_nap3 As String * 3
 
Start Adc                                                   'uruchamia wbudowany przetwornik
 
Do
                                                         'początek pętli programu
Wart_ac1 = Getadc(0)                                        'odczytanie wartości z wejści ADC0 mikrokontrolera
V1 = Wart_ac1 * 0.0049                                      'zamiana odczytanej wartości z A/C na napięcie
                                                            'Wart_ac * ok. 4,8 mV
Wart_nap1 = Fusing(v1 , "#.&&" )                            'formatowanie wartości zmiennej
                                                               'V do do formatu x.xx i zamiana
                                                               'tej wartości na postać tekstu
Wart_ac2 = Getadc(0)
V2 = Wart_ac2 * 0.0049
Wart_nap2 = Fusing(v2 , "#.&&" )
 
Wart_ac3 = Getadc(0)
V3 = Wart_ac3 * 0.0049
Wart_nap3 = Fusing(v3 , "#.&&" )
 
Cls                                                         'czyszczenie wyświetlacza
                                                            'wyświetlenie obliczonej wartości Wart_nap
Lcd "V1=" ; Wart_nap1
Waitms 1500
 
Cls
 
Lcd "V1=" ; Wart_nap2
Waitms 1500
 
Cls
 
Lcd "V1=" ; Wart_nap3
Waitms 1500
 
Loop                                                        'koniec pętli Do...Loop
End                                                         'koniec programu

Chciał bym go troszkę zmodernizować, mianowicie zamiast tego że wyniki same kolejno wyskakują po 1500ms chciał bym sam decydować kiedy który chce odczytywać. Wyświetlenie wyniku miało by się zmieniać wraz z przyciśnięciem przycisku podłączonego do Pinb.3 np. przyciskam raz wyskakuje V1, przyciskam drugi raz wyskakuje V2, przyciskam trzeci raz wyskakuje V3, przyciskam czwarty raz wyskakuje V1 itd.
Oraz zamiast pomiaru napięcia chciał bym mierzyć fotorezystorem natężenie oświetlenia.
Część programu która wyświetla wyniki powinna chyba mniej więcej wyglądać tak.

Config Pinb.3 = Input                                       'linia PB1 jako wejściowa
 
P Alias Pinb.3                                              'przypisanie nazwie Pinb.2 nazwy P
 
Set Portb.3
 
Do
 
Lcd "pomiar nap"
   If ..... Then
 
      Cls                                                   'czyszczenie wyświetlacza
                                                            'wyświetlenie obliczonej wartości Wart_nap
      Lcd "V1=" ; Wart_nap1
 
      Elseif ..... Then
 
      Cls
      Lcd "V2=" ; Wart_nap2
 
      Elseif ..... Then
 
      Cls
      Lcd "V3=" ; Wart_nap3
   End If
 
Loop
 
End

1. Jak powinna wyglądać instrukcja warunkowa IF i jaką dodatkową zmienną musiał bym wprowadzić?
2. Wejścia wbudowanego przetwornika analogowo cyfrowego - ADC w Atmega 8 to 6 pinów oznaczonych od ADC0 do ADC5?
Fotorezystor którego bym chciał użyć to A906012 16-33kOHM 90mW. Rezystancja dla
0[lx]=180[k?],dla 10[lx]=33[k?],dla 100[lx]=5[k?] dokładne dane katalogowe są pod adresem A906012
3. Jak zrobić pomiar takim fotorezystorem aby wyświetlony został wynik natężenia oświetlenia w [lx].?




Portret użytkownika matrix

Re: Pomiar napięcia Atmega8

dopisz sobie w dim'ach coś takiego:

dim ktore_napiecie as byte

następnie wyzeruj jego wartość
ktore_napiecie = 0

zadeklaruj jakiś pin procka jako wejście, żeby móc zmieniać sobie wyświetlany wynik

a tą część softu:

Cls                                                         'czyszczenie wyświetlacza
                                                            'wyświetlenie obliczonej wartości Wart_nap
Lcd "V1=" ; Wart_nap1
Waitms 1500
 
Cls
 
Lcd "V1=" ; Wart_nap2
Waitms 1500
 
Cls
 
Lcd "V1=" ; Wart_nap3
Waitms 1500
 
Loop                                                        'koniec pętli Do...Loop
End 

zmień na:

Cls
home
if (zadeklarowane wejscie przelaczania wyniku) = 0 then
  waitms 250 
  incr ktore_napiecie
end if
if ktore_napiecie = 3 then
  ktore_napiecie = 0
end if
home 
if ktore_napiecie = 0 then                                                            
  Lcd "V1=" ; Wart_nap1
end if
home 
if ktore_napiecie = 1 then
  Lcd "V1=" ; Wart_nap2
end if
home 
if ktore_napiecie = 2 then 
  Lcd "V1=" ; Wart_nap3
end if
Loop                                                        'koniec pętli Do...Loop
End 

Portret użytkownika gosc

odp pomiar

Dzięki, jakie to proste że też sam na to nie wpadłem.
A jak odczytać pomiar z tego fotorezystora?
Rezystancja dla 0[lx]=180[kOm],dla 10[lx]=33[kOm],dla 100[lx]=5[kOm]
To trzeba jakąś tablice utworzyć, że np dla 33kOm jest10 lx, dla 32kOm jest11 lx,itd. Czy to się robi jakimś innym sposobem?

Portret użytkownika matrix

Re: pomiar

z tym fotorezystorem też podepnij się pod ADC i ściągnij napięcie jakie będzie panowało na danym wejściu.

Portret użytkownika michal512

Re: fotorezystor

Czyli zależność zmiany napięcia od natężenia światła ustawić liniowo?
Napięcie można sczytywać np. tak?

Config Adc = Single , Prescaler = Auto
Start Adc
 
Dim N0 As Word
N0 = Getadc(0)

W N0 jest wtedy wartość napięcia gdzie 1023 to 5V a 0 to 0V.
Fotorezystor podłącza się normalnie, to znaczy jeden koniec pod pin ADC0 i drugi pod GND? Czy jakoś inaczej i trzeba jeszcze dodać jakiś rezystor lub kondensator?
Jeśli tak to jaką wartość ma mieć ewentualny kondensator lub rezystor?

Portret użytkownika rafliczek22

Rezystor np. do 5v foto do

Rezystor np. do 5v foto do gnd połąćzyć razem i z sordka brać napiecie do adc nie wiem tylko czy foto jest liniowy jesli tak to pestka z programem inaczej funkcja do linearizacji i załatwic to programowo smile

Portret użytkownika mirley

Re: Fotorezystor

Fotorezystor jest strasznie nieliniowy i tablica przeliczeniowa jest konieczna na 100% albo zebranie i sparametryzowanie charakterystyki fotorezystora

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika rafliczek22

A jest jakiś element foto-

A jest jakiś element foto- liniowy może fototranzystor tablica pewnie mało nie zajmie a i na kompie cza jakis progs znalezc do generowania danych do tablicy.

Portret użytkownika michal512

fotorezystor

Quote:
Rezystor np. do 5v foto do gnd połączyć razem i z środka brać napięcie do adc

A z jakiego wzoru się liczy wartość rezystora? Fotodioda ma rezystancje 16-33kOHM i 90mW.
Jak takie dane do tablicy się zbiera? Skoro ja mam tylko 3 punkty odniesienia 0[lx]=180[kOHM],dla 10[lx]=33[kOHM],dla 100[lx]=5[kOHM].
Quote:
a i na kompie cza jakis progs znalezc do generowania danych do tablicy.

Taki program po prostu sczytuje napięcie i zapisuje do tablicy, tylko skąd brać natężenie oświetlenia w luksach przy sczytanym napięciu?

Portret użytkownika matrix

Re: pomiar

ja zrobił bym to tak:
1 - zmierzył bym rezystancję fotorezystora kiedy jest najmniej oświetlony
2 - dał dzielnik między +5V a masę, składający się od strony masy z fotorezystora a od plusa z potencjometru montażowego i rezystora. łączna rezystancja = trochę więcej niż najmniej oświetlony fotorezystor
3 - skonfigorował GETADC na INTERNAL, co da napięcie odniesienia 2.56V ?

dzięki temu uzyskałbym:
- przy najmniej oświetlonym fotorezystorze połowę napięcia czyli blisko napięcia odniesienia
- przy najbardziej oświetlonym fotorezystorze prawie 0V na wejściu GETADC

dalej trzeba sobie radzić programowo.

Portret użytkownika gosc

fotorezystor

Tylko ze prawie to samo uzyskam przy zastosowaniu

Quote:

Config Adc = Single , Prescaler = Auto
Start Adc

Dim N0 As Word
N0 = Getadc(0)

W N0 jest wtedy wartość napięcia gdzie 1023 to 5V a 0 to 0V.


A jaką wartość w tym przypadku musiał by być rezystor?

Portret użytkownika matrix

Re: pomiar

ale mi chodziło o coś innego, mianowicie o to że dając tylko fotorezystor nie uzyskasz napięcia na wejściu GETADC, a dając dzielnik będziesz miał połowę napięcia a do tego dobrze było by wykorzystać wewnętrzne źródło napięcia odniesienia.

Portret użytkownika mirley

Re: Pomiar na foto

Raczej lepiej w tym przypadku dać referencję z AREF 5V albo poprostu z zasilania AVCC. Na internal 2.56 przetwornik i tak będzie mierzył 0-5V o ile zasilanie avcc będzie 5V.

Co do fotorezystora to należy to wykonać z dzielnikiem, tylko że R należy dobrać większy niz max fotorezystora, napięcie wtedy będzie zbliżało się do 5V jak rezystor będzie duzo większy niz fotorezystor.

Co do tabelki to poprostu należy wyskalować to za pomocą światłomierza, i zrobić sobie tabelkę rezystancji od natężenia światła. Potem albo interpolować resztę punktów albo lepiej narysowac na wykresie, dopasować jakąś krzywą w gnuplocie i wpisać do programu wzór

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika gosc

fotorezystor

Jaka jest różnica między pinami AREF i AVCC?
AREF służy do podłączenia napięcia odniesienia gdy chcemy mieć inne niż 2,56, jednak nie może być większe od 5.5V.

Quote:
R należy dobrać większy niz max fotorezystora, napięcie wtedy będzie zbliżało się do 5V jak rezystor będzie duzo większy niz fotorezystor

Dużo większy to znaczy ile?
Czyli bez wyskalowania się nie obędzie:(

Portret użytkownika mirley

Re: Pomiar

Daj 2-3 razy większy rezystor do gnd (fotorezystor do +5V, rezystor do masy, wyjście między nimi) i miernikiem oceń jaki jest zakres napięcia na fotorezystorze. potm daj 5x wiekszy rezystor i znowu sprawdź.... nie da się zrobić nic dobrego bez pomiarów i kalibracji.

drugim rozwiązaniem jest zastosowanie mniejszego niż fotorezystor rezystora do +5V, w podobnej proporcji. Nie da się tu tego jednoznacznie powiedzieć, ja przeważnie daje potencjometr montażowy njp 220k i reguluje sobie mierząc zakresy napięć

Aref -> referencja
avcc -> zasilanie ADC

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika michal512

fotorezystor

Czyli muszę zrobić tak.
Montuje potencjometr od strony GND od +5V daje fotorezystor, między nimi wyciągam sobie końcówkę. Zaczynając od R= 2 x fotorezystor kręcąc potencjometrem tak aby napięcie między wyciągniętą końcówką i GND przy najbardziej oświetlonym fotorezystorze było bliskie napięciu odniesienia, czyli w moim przypadku +5V.

 Config Adc = Single , Prescaler = Auto , Reference = Avcc
 
      'napięciem odniesienia jest napięcie zasilające część analogową
      'między AREF a AGND należy dołączyć kondensator 10mikroF.
      'lub Reference=OFF napięcie podaje się z zewnątrz (końcówka AREF),
      'Avcc=5V
      'Aref=5V
 
Start Adc
 
Dim N0 As Word
 
N0 = Getadc(0)
 
      'W N0 jest wartość napięcia gdzie 1023 to 5V a 0 to 0V.

Czytałem że mi między Aref a +5V lub Avcc a +5V dobrze dać kondensator aby zniwelować szumy, niestety nie napisano tam jakiej wartości by on miał być?
A fototranzystory są elementami liniowymi?
Czy w programie do pomiaru napięcia nie powinno być wpisane
Wart_ac1 = Getadc(0)
pźniej
Wart_ac2 = Getadc(1)
później
Wart_ac3 = Getadc(2)
bo jest tak?
Do
                                                         'początek pętli programu
Wart_ac1 = Getadc(0)                                        'odczytanie wartości z wejści ADC0 mikrokontrolera
V1 = Wart_ac1 * 0.0049                                      'zamiana odczytanej wartości z A/C na napięcie
                                                            'Wart_ac * ok. 4,8 mV
Wart_nap1 = Fusing(v1 , "#.&&" )                            'formatowanie wartości zmiennej
                                                               'V do do formatu x.xx i zamiana
                                                               'tej wartości na postać tekstu
Wart_ac2 = Getadc(0)
V2 = Wart_ac2 * 0.0049
Wart_nap2 = Fusing(v2 , "#.&&" )
 
Wart_ac3 = Getadc(0)
V3 = Wart_ac3 * 0.0049
Wart_nap3 = Fusing(v3 , "#.&&" )
w tym przypadku mierzy 3 napięcia z jednego pinu.

Portret użytkownika matrix

michal512 wrote:Czytałem że

michal512 wrote:
Czytałem że mi między Aref a +5V lub Avcc a +5V dobrze dać kondensator aby zniwelować szumy, niestety nie napisano tam jakiej wartości by on miał być?

z tego co pamiętam to ma być kondensator 10uF.

Portret użytkownika gosc

tablica

A jeśli dokonam już niezbędnych pomiarów to tablicę trzeba wypełniać w następujący sposób

Dim Tablica(1023) AS Word
 
tablica(1)=0
tablica(2)=0,5
.
.
.
tablica(1023)=552

Czy istnieje jakiś inny sposób np przedzielając kolejne wartości ";" a program sam po kolei każdemu elementowi przypisze indeks?
Jak zdefiniować instrukcje warunkową aby np przy wartości zmiennej N0=327 wyświetlił się 327 element tablicy?
Dim N0 As Word
 
N0 = Getadc(0)

Portret użytkownika mirley

Re; Przeliczenie

po pierwsze to do worda napewno nie wpiszesz:

tablica(2)=0,5

bo word ma wartości 0-65535

po drugie to jak już tablica to w pamięci programu, w ramie na pewno się nie zmieści.

Po trzecie najlepiej zrobić to wzorem, wyznaczyć charakterystykę i zapisać wzorem. Trzeba mieć jakis miernik żeby zrobić odniesienie. Zrobić sobie tabelkę na karce gdzie w jednej kolumnie będzie liczba z ADC a w drugiej natężenie światła lub inna wielkość która potem będziesz chciał wyznaczać. Potem mając punkty narysujesz wykres i zobaczysz na oko jaki to typ zależności. Wyznaczysz parametry tej zależności i dostaniesz funkcję: Wynik = f(ADC)

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika michal512

fototranzystor

A fototranzystory są elementami liniowymi?

Portret użytkownika rafliczek22

Gdyby tak było to po co ta

Gdyby tak było to po co ta dyskusja, nie dość że nieliniowe to każdego producenta inne( inna rezystancja przy tym samym oswietleniu)

Portret użytkownika gosc

Gnuplot

Może ktoś wie jak wyznaczyć wzór na funkcje za pomocą gnuplot?

Portret użytkownika mirley

Re: Fitowanie

Rozumiem że chodzi ci o dopasowanie linii prostej do danych pomiarowych:

1. Robisz sobie plik tekstowy z danymi który zawiera dwie kolumny: x y i zapisujesz np pod nazwą; "data.txt"
2. rysujesz żeby zobaczyc czy działa: plot "data.txt" using 1:2
3. deklarujesz funkcję liniową: f(x) = a*x +b
4. fitujesz paramtry(najlepiej wywołać to co najmniej 2 razy): fit f(x) "data.txt" using 1:2 via a, b
5. rysujesz całość: plot "data.txt" using 1:2 with points ,f1(x) with lines

Najlepiej napisac skrypt w postaci pliku tekstowego w którym są po kolei wszystkie te komendy a nastepnie wywołać: gnuplot "skrypt.txt" lub jak juz gnuplot jest odpalony to chyba jest polecenie "load"

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika gosc

gnuplot

Witaj Mirley
Chodzi mi o to że zrobiłem charakterystyke fotorezystora ale nie mam pojęcia jak to dalej wykorzystać.Myślałem że gnuplot z danych punktów stworzy jakiś wzór który podstawie
w programmie :).
Pozdrawiam

Portret użytkownika mirley

Re: funkcja

Nigdy tak nie ma aby program wymyślał za ciebie wzór funkcji. Prześlij tą tabelkę z danymi, lub wrzuć te dane tutaj na stronie

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika Dividi

chcarakterystyka fotorezystora

Wrzucam charakterystyke fotorezystora

Portret użytkownika mirley

Re: Fotorezystor

Quote:
Prześlij tą tabelkę z danymi, lub wrzuć te dane tutaj na stronie

To dla ciebie jest tabelka z danymi? ... wykres z calca do niczego się nie nadaje. Wklej tabelkę i napisz co jest w każdej z kolumn. Co to jest to 0-16, bo to 0-1800 to chyba rezystancja?

Do czego ma służyć ten wzór? co chcesz potem z niego wyliczać względem czego?

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika gosc

Tabelka

Quote:
Po trzecie najlepiej zrobić to wzorem, wyznaczyć charakterystykę i zapisać wzorem. Trzeba mieć jakis miernik żeby zrobić odniesienie. Zrobić sobie tabelkę na karce gdzie w jednej kolumnie będzie liczba z ADC a w drugiej natężenie światła lub inna wielkość która potem będziesz chciał wyznaczać. Potem mając punkty narysujesz wykres i zobaczysz na oko jaki to typ zależności. Wyznaczysz parametry tej zależności i dostaniesz funkcję: Wynik = f(ADC)

Nie chcę żebyś wyliczał wzór za mnie .Potrzebuję jakiś przykład jak to się robi.Ten wzór potrzebuje do podstawienia w programie przy pomiarze światła zamiana napięcie-lux , ale fotorezystor jest nie liniowy.Może jest jakaś strona gdzie dobrze jest to opisane.
pzdr

Portret użytkownika mirley

Re: Wzory

1. Wykonujesz serię pomiarów parametrów które cię interesują. Robisz tabelkę tak jak mówiłem wcześniej: w jednej kolumnie znajduje się natężenie oświetlenia a w drugiej odpowiadające mu napięcie.

2. Chcesz wyznaczyć natężenie światła a zatem w kolumnie y musi być natężenie a w x napięcie na fotorezystorze. Wtedy wzór który wyznaczysz y = f(x) po wstawieniu napięcia za x da od razu wartość natężenia. Osobiście to dopasował bym od razu funkcję gdzie x nie będzie napięciem a liczbą z przetwornika w mikrokontrolerze ale to potem można zrobić drugi raz

3. Rysujesz sobie wykres punktowy natężenia światła= f(napięcie na fotorezystorze)

4. Teraz należy wymyślić wzór ogólny jakim może być narysowana zależność. Przeważnie można wstawić zalezność kwadratową w postaci: y = aX^2+bX +C , albo pierwiastek: y = a*sqrt(x) +b itp może być też coś z e^x

5. potem gnuplot dopasuje ci już parametry funkcji (stałe współczynniki) ktore wstawisz do wzoru.

6. Wyrysujesz na koniec krzywą i dane pomiarowe aby zobaczyć czy krzywa leży na danych.

W twoim przypadku spróbował bym z funkcją y=a*ln(b*x) +c

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika Dividi

Dzięki.Teraz załapałem że

Dzięki.Teraz załapałem że muszę dopasować sam krzywą podstawiając wzory.
pzdr

---------------------------------------------------------------------------
Wyznaczyć wzór na funkcje można programem Graph.
Importuje się serie punktów następnie "ctrl+T"i program sam znajduje najlepiej pasującą krzywą i oczywiście pokazuje wzór.

Portret użytkownika mirley

Re: Dopasowanie Krzywych

Każdy używa takiego programu jaki mu odpowiada...

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika gosc

Jak najbardziej zgadzam się z

Jak najbardziej zgadzam się z tym ,dlatego pokazałem innym że można inaczej.

Portret użytkownika michal512

Gnuplot

Ja niestety nie jestem w posiadaniu przyrządu do pomiaru lux, więc na razie zrobię sobie termometr na termistorze NTC. Myślę że zasada jest ta sama, tylko zależność będzie temp do napięcia lub od razu x nie będzie napięciem a liczbą z przetwornika w mikrokontrolerze. Jak będę wiedział co i jak to później tylko sobie zmienię przyrządy. Tylko że

Quote:
1. Robisz sobie plik tekstowy z danymi który zawiera dwie kolumny: x y

1. Czyli po prostu piszę w pliku tekstowym x tabulator y i pod spodem moje wartości w dwóch kolumnach pod x i pod y? np x-liczba z przetwornika w mikrokontrolerze; y-temperatura
x y
0 125
. .
. .
. .
1023 -40
Czy to się robi w innej formie? np zamiast tabulatora musi być spacja? Nigdy jeszcze nie korzystałem z programu Gnuplot więc zapewne jeszcze czeka mnie sporo pracy z zapoznaniem się z programem.
Oczywiście termistor w całym swoim zakresie pomiarowym nie będzie pracować i tu moje drugie pytanie.
2. Wystarczy jak zrobię pomiary tylko w przedziale temperatury która mnie interesuje np od 0 do 100 stopni? Czy musi to być pełen zakres od -40 do 125 stopni. Skoro już jesteśmy przy wartościach ujemnych to zapisuje się je tak jak w przykładzie czyli normalnie -40 czy musi być zachowana jakaś inna forma?
3. Od ilości pomiarów zależy dokładność mojego przyrządu pomiarowego? Czyli im więcej pomiarów tym dokładniej będą dobrane współczynniki mojej funkcji. Czy pomiary należy wykonać tak aby uchwycić ogólny zarys wykresu czyli np co 5 lub 10 stopni?
4. W gnuplot wpisuje ogólną postać wzoru sprawdzam czy wykres który otrzymałem jest podobny kształtem do mojego uzyskanego z pomiarów, jeśli tak to wpisuje odpowiednią komendę i Gnuplot wyznacza mi współczynniki a,b i c. Jeśli tak to zasadnicza rolę w tym przypadku będzie odgrywało doświadczenie i wiedza jak wyglądają wykresy podstawowych funkcji.
5. W gnuplot jest jakiś zestaw funkcji z którego w razie braku wiedzy można skorzystać i np spośród 30 funkcji można znaleźć funkcje y=a*ln(b*x) +c i porównać jej kształt z szukanym? Czy to się robi w inny sposób?

Portret użytkownika mirley

Re: Gnuplot

1.Robisz sobie tabelkę, może być spacja ale lepiej tabulator. Ogólnie gnuplot może rozpoznawać inne znaki oddzielające kolumny.... mozna zdefiniować inny znak jesli dane sa juz w jakimś formacie. Ja przeważnie korzystałem z arkusza kalkulacyjnego, wpisywałem dane a potem zaznaczałem obszar komórek i wklejałem do zwykłego edytora tekstu. Pamiętaj że separatorem dziesietnym jest kropka a nie przecinek, jakbys chciał zrobić np 34.5

2. Tylko przedział który Cię interesuje... trudno by było dopasowac wykres do całego zakresu

3. Jak masz więcej punktów to wzór będzie miał mniejsze niepewności.... pamiętaj że to wszystko statystyka. Oczywiście jak pomiary będziesz miał takie że w tej samej temperaturze raz będzie 23 a raz 25stopni wskazywał miernik kalibrujący to i tak ustawi ci sie jakaś średnia

4. musisz wymyslic wzór i doswiadczenie przyda się tutaj napewno. Czym bardziej skomplikowany wzór tym wieksze problemy z dopasowaniem. Jak dasz coś bardzo złożonego to prawdopodobnie będziesz musiał tez ustawić samemu parametry startowe współczynników... chodzi o to czy program ma np spodziewać się "a" rzędu 0.01 czy morze rzędu 1000000. Przy prostych wzorach samo się to ustawi

5. gnuplot ma zdefiniowane funkcje typu sin, cos, log itp ale wzór z parametrami musisz podać samemu. Funkcje definiuje sie przypisując poprostu: "f(x) = a*ln(b*x) +c". najpierw popróbuj z linia prostą. Napisz sobie prostą tabelkę i sprawdź czy dasz radę dopasować prostą

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika michal512

Re: wykres

Czyli że Gnuplot zawsze dopasuje jakieś parametry do podanej funkcji, haczyk tkwi w dokładności z jaką on to zrobi. W formie ćwiczenia wymyśliłem sobie funkcje y=5x+6 stworzyłem odpowiedni plik txt i wynik był następujący
dla
f(x)=a*x+b tu akurat znałem funkcje z jakiej były tworzone dane do txt, a wynik i tak nie był taki jak się spodziewałem.
Final set of parameters Asymptotic Standard Error
======================= ==========================

a = 4.92857 +/- 0.07143 (1.449%)
b = 6.14286 +/- 0.3194 (5.2%)
Po skorygowaniu o wartości +/- uzyskamy 5 i 6,ale jak wygląda to w przypadku gdy nie znamy funkcji i współczynników a oraz b?
Przyjmujemy jakiś zestaw funkcji wpisujemy je kolejno i patrzymy na ich błędy procentowe, po czym wybieramy tą która ma je maj mniejsze? Następnie w arkuszu kalkulacyjnym np Excel wpisujemy nasze x ;y i naszą funkcję. Po czym korygujemy współczynniki a i b zgodnie z błędami +/- tak aby nasza funkcja dawała wynik jak najbliższy otrzymanemu z pomiarów?

Portret użytkownika mirley

Re: Dane

Jak wygenerowałeś te dane? Jeśli zrobiłeś tabelkę wyliczoną z wzoru to po dopasowaniu musisz otrzymac ten sam wzór. jesli dane sa rozstrzelone losowo wokół prostej dopasowanej to wynik który uzyskałes jest prawidłowy, ma byc tak jak dostałeś czyli 4.9... i 6.1.... bo to najlepsza możliwa prosta do tych punktów pomiarowych i koniec.... nie ma tu z czym dyskutować bo to matematyka.

Nie ma żadnych zestawów funkcji... jak cos robisz to przeważnie zależnośc jest znana z podstaw fizycznych. a jak nie to trzeba wymyslić wzór w oparciu o funkcje elementarne. Błędy powinny byc jak najmniejsze ale czasami trzeba sie pogodzić z takimi jak dają pomiary

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika michal512

re:dane

Dane wyliczałem z wzoru, ale robiłem to dosyć późno i szybko, więc może pomyliłem jakiś wynik i przez to ta różnica. Dziś zrobiłem jeszcze raz i wyszło 5 i 6.
A takie pytanie praktyczne, po wpisaniu wyników z pomiarów do excela i wygenerowaniu temperaturu dzięki otrzymanej funkcji to jaką otrzyma się mniej więcej dokładność. Np dla temperatury o zakresie od 0 do 50 stopni, to najgorszym przypadku otrzymamy jaką różnice temp otrzymanej dzięki pomiarom a wynikiem wyliczonej funkcji. Rozumiem że to wszystko zależy od wymyślonego wzoru ogólnego i nigdy nie otrzymam idealnego wyniku, ale łatwo można dojść do różnicy rzędu 0,5 stopnia czy np 2 stopnie, a żeby otrzymać 0,5 to już trzeba się napocić?

Portret użytkownika mirley

Re: Dokładność

Zależy to głównie od przetwornika ADC. Jeśli masz 10 bitowy przetwornik to ma on 1024 schodki napięcia. Zatem jeśli zrobisz charakterystykę i uzyskasz zalezność temp od liczby z adc to licząc z tego wzoru D = |Temp(x)-Temp(x+1)| uzyskasz w każdym punkcie skok temperatury i to będzie błąd jaki na pewno będziesz miał. Dodatkowe błędy wynikają z krzywej dopasowanej ale nie da sie tego przewidzieć, błąd będzie zależał tez od temperatury. 0.5 stopnia raczej napewno nie będzie bo tyle maja cyfrowe czujniki DS18B20 i podobne

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika michal512

ADC

Napisałem sobie taki programik do sczytywania napięcia i liczby z przetwornika w mikrokontrolerze.

'Program obsługi wbudowanego w mikrokontroler
'10-bitowego przetwornika A/C
 
$regfile = "m8def.dat"                                      'informuje kompilator o pliku
'dyrektyw mikrokontrolera
$crystal = 8000000                                          'informuje kompilator
'o częstotliwości oscylatora
'taktującego mikrokontroler
Config Lcd = 16 * 2                                         'konfiguracja typu wyświetlacza
'LCD
Config Lcdpin = Pin , Db4 = Portd.5 , Db5 = Portd.6 , Db6 = Portd.7 , Db7 = Portd.4 , E = Portd.3 , Rs = Portd.2       'konfiguracja linii
'mikrokontrolera, do których dołączono wyświetlacz LCD
Config Adc = Single , Prescaler = Auto , Reference = Avcc   'napięciem odniesienia jest napięcie zasilające część analogową
                                                            'między AREF a AGND należy dołączyć kondensator 10mF
 
Start Adc                                                   
 
 
Dim N0 As Word
Dim V1 As Single
Dim Wart_nap1 As String * 3
 
Do
 
N0 = Getadc(0)
                                                            'odczytanie wartości z wejści ADC0 mikrokontrolera
                                                            'W N0 jest wartość napięcia gdzie 1023 to 5V a 0 to 0V.
V1 = N0 * 0.004888                                          'zamiana odczytanej wartości z A/C na napięcie
 
Wart_nap1 = Fusing(v1 , "#.&&" )                            'formatowanie wartości zmiennej
                                                               'V do do formatu x.xx i zamian
 
 
 
Cls
Lcd "wart.z AC:" ; N0
Lowerline
Lcd "wart.nap:" ; Wart_nap1 ; "[V]"
Wait 1
Loop

Podczas symulacji było wszystko dobrze, lecz po wgraniu programu na mikrokontroler bez podłączania czegokolwiek do końcówki PC0 (ADC0) nap na ADC skacze do 1[V] do około1,9[V] (odczyt z LCD "wart.nap:" ; Wart_nap1 ; "[V]")
Przy tak skonfigurowanym ADC należy pod końcówkę AVCC podłączyć napięcie zasilania czyli w moim przypadku +5[V]?
Gdzie należy dać kondensator 10uF bo w pomocy bascoma pisze że między AREF a AGND czy lepiej miedzy AREF a +5V?
AGND to jest po prostu GND?

Portret użytkownika mirley

Re: M8

Jak już mówiłem wiele razy. Procesor podczas działania ma mieć podłączone wszystkie nóżki zasilania do +5V(VCC, AVCC itp) Nieważne czy uzywasz przetwornika czy nie. Wszystkie masy(GND, AGND itp) mają byc tez zwarte do głównej masy.

AVCC to zasilanie ADC jak chcesz żeby on działał bez zasilania.
Kondensator od AREF do masy
Wisząca końcówka wejściowa = może gonić wskazanie

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika gosc

RE ADC

Quote:
Wisząca końcówka wejściowa = może gonić wskazanie

Faktyczne gdy zwarłem PC0 (ADC0 z GND i podłączyłem AVCC do +5V to wyskoczyło 0. A gdy zasilanie zamiast 5[V]jest 4.6[V] to wtedy jest tylko taka różnica dla wyświetlanego napięcia, że liczba 1023 nie oznacza 5[V] tylko 4,6[V] tak?
Czyli wtedy gdy byśmy chcieli zmierzyć dobrze napięcie to trzeba by było zmienić z
V1 = N0 * 0.004888

na
V1 = N0 * 0.004497

Aby obliczyć tą liczbę to napięcie należy podzielić przez 1023 czy przez 1024?
Bo dla podłączonego termistora to jest bez różnicy czy jest +5[V] czy +4,6[V], no może dla +5[V] będzie odrobinę dokładniejsza zależność temperatury do liczby z przetwornika w mikrokontrolerze.

Portret użytkownika mirley

RE: ADC

jesli napieciem referencyjnym będzie zasilanie AVCC to wtedy 1023 oznacza napięcie zasilania. Wydaje mi sie że powinien być podział przez 1023, czyli: wynik = odczyt/1023*AVCC , zeby dla wartości 1023 było AVCC. Ja zawsze wykonuję krzywą kalibracyjną więc i tak wstawiam to do dokładnego wzoru i nie zastanawiam się czy jest to 1024 czy 1023 itp

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika michal512

Gnuplot

Witam potrzebuje pomocy w wyznaczeniu wzoru charakterystyki fotorezystora. Poniżej dane
luksy wartość odczytana z ADC
0 0
10 22
22 52
30 70
42 98
51 118
61 132
74 155
94 179
133 229
164 257
202 300
248 325
300 361
375 405
442 429
520 462
590 485
660 506
763 535
877 560
970 577
1057 591
1179 610
1283 625
1391 636
1527 648
1670 662
1916 683
2280 710
2450 721
2680 732
2900 746
3190 759
3310 766
3600 775
3840 783
4060 787
4330 795
4760 805
5110 813
6140 830
7040 843
8210 857
10900 885
19000 918
chciał bym wykorzystać wzór do napisania programiku który zamiast wartości z ADC wyświetlał będzie mi pomiar w luksach. Najbardziej interesuje mnie zakres wartości z ADC od 506 do 857. Z jakich funkcji mógł bym skorzystać aby otrzymać najlepsze rezultaty?

Portret użytkownika mirley

Re: ADC

Zamień osie miejscami i spróbuj funkcji potęgowych lub wykładniczych. Zawęrz dane do interesującego przedziału i spróbuj dwumian kwadratowy lub funkcję tego typu.

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika michal512

funkcja

Mając znalezioną funkcje F(x)=ax^3+bx^2+cx+d jak ją wpisać do programu aby Bascom nie wyrzucał błędu.

.
.
.
Dim F1 As Word                                              'zmienna do której jest zapisywana wartość z pinu ADC0
Dim L1 As Word                                              'zmienna do której jest zapisywana wartość natężenia 'oświetlenia w luksach na podstawie F1
.
.
.
L1=0,00000251913540875684*F1^3+0,000370369718660637*F1^2+0,360326351682758*F1+1,08558368678042
.
.
.

Po próbie kompilacji wyskakuje błąd nr 35 "spodziewano się 3 parametrów". O co chodzi z tym błędem?
Bascom nie radzi sobie z takimi obliczeniami?

Portret użytkownika gosc

Trzeba wszystko w osobnych

Trzeba wszystko w osobnych liniach, takie rzeczy to tylko w C :D

Portret użytkownika michal512

L1

W osobnych liniach to znaczy jak? Jakieś dodatkowe zmienne i całość rozbita na kilka działań? Zauważyłem że błąd ten wyskakuje gdy próbuje pomnożyć zmienną F1 przez liczbę z wartością po przecinku.
Może ktoś pokazał by przykład jak to równanie zrobić w tych osobnych liniach.

Portret użytkownika rafliczek22

Czyli jak np. masz

Czyli jak np. masz zmienna=a1+a2*a3 to trzeba zapisac: zmienna=a1+a2 oraz w drugiej linijce zminna=zmienna*a3, bascom pozwala na tylko 3 argumenty w jednym działaniu, i trzeba pisać w osobnych linijkach.

Portret użytkownika michal512

osobne linie

W końcu mi ruszył. Robiłem tak jak pisałeś już wcześniej lecz nadal wyskakiwał mi ten błąd, ponieważ kopiowałem sobie liczby z Excela i zapomniałem że w BASCOM trzeba stosować "." a nie ",". No ale działa, dzięki wszystkim za pomoc.

Portret użytkownika mirley

Re: Pzeliczenia

Quote:
Czyli jak np. masz zmienna=a1+a2*a3 to trzeba zapisac: zmienna=a1+a2 oraz w drugiej linijce zminna=zmienna*a3
należy pamiętać o kolejności wykonywania działań :)

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.