Próbuję zbudować termostat z Arduino. Chcę zasilać go za pomocą baterii / ładowarki telefonu komórkowego, co sprawia, że napięcie systemowe jest dość zmienne. W tej chwili używam Arduino Uno, ale kiedy będzie gotowy, przeniosę go na Lilypad.
Najpierw próbowałem użyć czujnika temperatury TMP36 . Jak dotąd była to kompletna porażka. Chociaż sam czujnik wydaje się bardzo stabilny, nie mogę znaleźć sposobu, aby dokładnie zmierzyć jego napięcie.
Korzystanie z wbudowanego odniesienia 5 V dla czujników analogowych w ogóle nie działa - nawet zasilanie z USB arduino + 5 V w rzeczywistości wynosi + 4,8 V (co przesuwa zmierzoną temperaturę o kilka stopni). Gdy płyta jest zasilana z akumulatora, napięcie spada do około 4 V i mierzy temperaturę rakiet. Próbowałem również użyć + 3.3V z płyty jako odniesienia. Wydaje się być bardziej stabilny, gdy płytka jest zasilana z USB, ale jego napięcie spada po uruchomieniu z akumulatora.
Czy istnieje inny sposób niezawodnego pomiaru napięcia wyjściowego czujnika?
W drugim etapie planuję użyć termistorów. Właśnie zamówiłem kilka termistorów 20K .
Z tego, co rozumiem, powinny być łatwiejsze do dokładnego zmierzenia, jeśli zbuduję dzielnik napięcia i użyję V_in jako napięcia odniesienia dla ADC.
Kilka pytań na ich temat:
- Czy sensowne jest stosowanie kilku dzielników napięcia z innym stałym rezystorem w celu zwiększenia dokładności?
- Mogę użyć programowalnego pinu jako V_in i mierzyć temperaturę za pomocą kilku różnych poziomów napięcia. Chociaż nie jest dla mnie jasne, czy rzeczywiście zwiększy to dokładność.
źródło
Odpowiedzi:
Wygląda na to, że zdajesz sobie sprawę z problemu ze zmianą napięcia odniesienia, a jeśli używasz urządzenia takiego jak TMP36 (stałe 10mV / degC), nic nie możesz zrobić poza użyciem napięcia odniesienia z układu w celu ustabilizowania rzeczy.
Jednak jeśli używasz RTD lub termistora, problem nie powstanie. Ty ADC dokonuje pomiaru ratiometrycznego - porównuje wejście ADC z napięciem odniesienia ALE, jeśli zasilasz RTD lub termistor (za pomocą odpowiedniego rezystora) z tego samego napięcia odniesienia, nie wpłynie to na odczyty. Jeżeli wartość referencyjna wzrośnie o 10%, to również napięcie w ADC.
źródło
Myślę, że powinieneś rozważyć użycie cyfrowego czujnika temperatury, takiego jak DS18B20 / DS18S20, ponieważ nie zależy on od dokładności ATmega ADC do pomiaru sygnału anaolg, używa 1-przewodowego protokołu cyfrowego do raportowania temperatury.
Zapoznaj się z następującymi samouczkami
http://playground.arduino.cc/Learning/OneWire
http://www.hobbytronics.co.uk/ds18b20-arduino
źródło
Twój pomiar będzie tak dobry, jak dobre napięcie odniesienia dla ADC. Arduino domyślnie używa napięcia zasilania jako napięcia odniesienia, ale w twoim przypadku właściwym sposobem byłoby użycie pinu Aref arduino. Musisz zdobyć specjalny układ zwany „napięciem odniesienia” i podłączyć go do pinu Aref, a następnie ustawić ADC, aby używał zewnętrznego odniesienia w kodzie Arduino (
analogReference(EXTERNAL)
)Napięcie odniesienia należy wybrać tak, aby pełne odchylenie czujnika temperatury mieściło się w napięciu referencyjnym. TMP36 będzie wytwarzał napięcie ~ 1,5 V @ 100 ° C, więc do pomiaru temperatury do 100 ° C należy użyć wartości odniesienia powyżej 1,5 V. Chcesz, aby odniesienie było jak najbliżej maksymalnego napięcia mierzonego, jak to możliwe, aby uzyskać jak największą rozdzielczość.
Atmega328p ma dwa wewnętrzne odniesienia, których można używać bez żadnych zewnętrznych komponentów. Jeden ma 1,1 V, drugi 2,56 V. Zazwyczaj mają nieco gorszą dokładność niż w przypadku zewnętrznego komponentu dedykowanego. Sprawdź dokumentację Arduino pod kątem analogReference i arkusza danych Atmega328p w celu uzyskania wewnętrznej dokładności odniesienia.
Jeśli naprawdę chcesz uzyskać orzechy o różnych zakresach, możesz użyć kilku zewnętrznych odniesień i przełączać je za pomocą przełącznika analogowego, takiego jak 74hc4051. Lub możesz przełączać się między dwoma wewnętrznymi odniesieniami.
Z termistorami uzyskasz lepsze wyniki, jeśli zamiast stałego opornika zastosujesz źródło prądu stałego. Z drugiej strony - głupi opornik zasilany ze stabilnego napięcia odniesienia działałby dobrze.
Wybierając odniesienie zewnętrzne, upewnij się, że masz wystarczające napięcie, aby pomieścić jego napięcie spadające podczas zasilania z akumulatorów, a akumulatory są rozładowane. Vref + Vdropout <Vbat-min.
źródło
Brak stabilnego odniesienia ADC jest w rzeczywistości objawem innego problemu w twoim obwodzie: nie dostarczasz wystarczająco wysokiego napięcia do płytki. Wskazuje na to spadek napięcia 5 V do 4 V oraz spadek napięcia 3,3 V.
Regulator napięcia (MC33269D-5.0 IIRC) na płycie Arduino ma zanikające napięcie ~ 1,0 V, dlatego należy zapewnić mu napięcie co najmniej 6 V, aby uzyskać stabilne napięcie wyjściowe 5 V. Baterie AA zaczynają się przy 1,5-1,6 V i są prawie rozładowane przy 1,1 V, więc musisz zasilić płytę co najmniej 6 bateriami AA, aby uzyskać stabilną moc przez cały okres eksploatacji baterii.
Przy prawidłowym zasilaniu można użyć wewnętrznego odniesienia ADC lub linii 5 V lub 3,3 V. Ponieważ czujnik temperatury zmienia się o około 10 mV na stopień Celsjusza, można użyć dzielnika napięcia, aby ustawić napięcie odniesienia równoważne maksymalnemu oczekiwanemu napięciu wyjściowemu czujnika (np. Dla 50 stopni C). To da dokładniejszy pomiar.
Jeśli chcesz użyć mniej niż 6 baterii AA, wypróbuj przetwornicę podwyższającą napięcie DC-DC, np. Https://www.sparkfun.com/products/10968 . . Połączony przykład pobiera 1 V - 4 V i wytwarza 5 V. Wyjście będzie podawane bezpośrednio na styk 5 V Arduino, omijając jego regulator.
Aby karta działała dłużej na bateriach, przełącz MCU w tryb uśpienia między odczytami czujnika. Biblioteka Rocketscream o niskiej mocy jest świetna do tego celu. Ale jest to naprawdę przydatne, gdy używa się wydajnego regulatora / przetwornicy DC-DC, ponieważ standardowy regulator Arduino zużywa 10 mA sam w sobie!
źródło
Odpowiedź na pytanie Czy istnieje inny sposób niezawodnego pomiaru napięcia wyjściowego czujnika?
ADC wykorzystuje napięcie odniesienia do konwersji z analogowej na cyfrową. Jeśli więc nastąpi zmiana napięcia odniesienia, zmienią się wartości przeliczone (tj. Wartość cyfrowa). Wartość cyfrowa będzie inna dla tego samego wejścia analogowego, jeśli zmieni się napięcie odniesienia.
Jedną łatwą opcją jest użycie wewnętrznego napięcia odniesienia wewnątrz Arduino (tj. Kontrolera Atmega).
Zobacz poniższy link, w którym podano przykładowy kod do użycia wewnętrznego ADC (nazwa funkcji Arduino - analogReference (DEFAULT))
http://tronixstuff.com/2013/12/12/arduino-tutorials-chapter-22-aref-pin/
Myślę, że to rozwiąże twój problem i nie ma potrzeby przestawiania się na termistory.
źródło