Mam niestandardową kartę Arduino ATMega328, która ogólnie działa przy 5 V @ 8 MHz (przy użyciu profilu Arduino Pro 3.3 V 8 MHz i programu ładującego). Głównym powodem, dla którego korzystam z tej konfiguracji jest to, że mogę uśpić płytę, gdy główne zasilanie zostanie odłączone i zacznie się wyczerpywać moc baterii (3 V z ogniwa monety). Źródła 5 V i 3 V są połączone diodami OR, a wejście 5 V jest powiązane z INT0. W kodzie, gdy wykryje, że INT0 spadł do niskiego poziomu, inicjuje tryb uśpienia i wszystko wyłącza się, z wyjątkiem timera watchdoga, który utrzymuje cykl 1Hz, aby zachować wewnętrzne zliczanie i sprawdzić, czy chip powinien zostać obudzony z powrotem. Działa to pięknie , gdy zasilanie 5V jest stosowany, potem jest włożona bateria, następnie5 V jest odłączone. Kładzie się spać, a gdy przywrócone zostaje napięcie 5 V, budzi się i widzę, że nie stracił na wartości.
Jednak problem pojawia się, gdy jest stosowana 3V pierwszy . Nie jestem pewien, czy to w ogóle się uruchamia. Ale to, co powinien zrobić, to uruchomić, sprawdzić, czy INT0 (Digital 2) jest niski, a jeśli tak, idź od razu do snu. Obserwując bieżący pobór, widzę, że zasila do kilku mA przez kilka sekund, a następnie spada do około 0,3 mA (nadal wyższy niż powinien być w trybie uśpienia). Ale kiedy ponownie zastosuję 5 V, nic . Pobór mocy powraca, ale nie odpowiada (w porównaniu z szeregowym FTDI).
Czy jest coś, za czym tęsknię, że nie można go uruchomić na 3V ... teoretycznie powinien działać dobrze.
Aktualizacja: Upuściłem diodę LED na D13 i wypróbowałem szkic mrugnięcia. Działa dobrze, gdy zaczynasz od 3 V lub 5 V. Jednak gdy uruchamiam oprogramowanie wewnętrzne i uruchamiam je z napięcia 3 V, dioda LED zaczyna po prostu pulsować. Nie mam pojęcia, co go powoduje, ponieważ nigdy nie ustawiłem D13 jako czegokolwiek w moim kodzie. Ale to sprawia, że mam coś wspólnego z bootloaderem ...
Odpowiedzi:
Więc ... okazało się, że to, co się dzieje, było w kodzie. Okazuje się, że inicjowałem przerwanie na INT0, kiedy było niskie, na samym początku mojego kodu. Problem polegał na tym, że kiedy uruchomił się przy zasilaniu rezerwowym 3V, INT0 był zawsze niski, ponieważ INT0 jest przywiązany do linii 5V (w ten sposób wie, żeby iść spać). Ponieważ INT0 było niskie, a przerwanie wyzwalało się na niskim poziomie, powodowało to stałe przerwanie, nigdy nie dając reszcie programu czasu na uruchomienie. Przełączono na włączanie tego przerwania tylko po przejściu w tryb pełnego budzenia i teraz działa dobrze.
źródło
Dokładnie to, co się dzieje i dlaczego nie można ustalić na podstawie ilości dostarczonych informacji. Widzę jednak co najmniej jeden potencjalny problem, który przynajmniej częściowo wyjaśnia opisane objawy.
Powiedziałeś, że używasz diod do wyboru źródła napięcia, a jedno źródło to bateria 3 V. Jeśli używasz standardowych diod, które spadają ~ 0,6 V, wówczas napięcie zasilania MCU wynosi tylko ~ 2,4 V. Jeśli używasz diod Schottky'ego o spadku napięcia między 0,15-0,45, napięcie zasilania jest potencjalnie tak niskie jak 2,5 V. Napięcie BZT jest ustawione na 2,7 V, więc teoretycznie MCU nigdy nie uruchomi się z akumulatorem.
Jeśli chodzi o to, dlaczego możesz zacząć od 5v, zejdź do 3v i przywróć go z powrotem - nie jestem pewien. Możliwe, że wyłączasz BZT w kodzie ... może… Nie wiem, dlaczego to działa, ale prawdopodobnie nie będzie działać.
Ustawiam obwód przełącznika diodowego na 5 V i 3,3 V, aby zobaczyć, jak to wygląda na moim oscyloskopie po przełączeniu napięć. Przy przełączeniu do 3,3 V do 5 V napięcie początkowo oscyluje. Może to potencjalnie powodować problemy, gdy MCU próbuje wyjść ze snu. Umieszczenie limitu między VCC a GND bardzo ładnie wygładziło sygnał. Przy zmianie z 5 V na 3,3 V naprawdę nie było żadnych oscylacji, tylko czysty spadek.
Na podstawie tych informacji wydaje się, że należy obniżyć próg BZT lub wyłączyć BZT i nałożyć pułap oddzielania między VCC a GND. Prawdopodobnie powinieneś również upewnić się, że masz rezystor rozwijany na INT0 i przeczytać sekcje arkusza danych MCU wyjaśniające różne tryby snu, wszystkie rozważania dotyczące snu i budzenia - to dość zaangażowane. Twoje zdrowie
źródło
Myślę, że problem dotyczy twojego bootloadera, ale nie tak, jak myślisz.
Kiedy Arduino uruchamia się, bootloader wykonujący kilka zadań, takich jak szukanie hosta szeregowego lub ładowanie danych programu z pamięci flash, zużyje o wiele więcej energii niż śpiące Arduino.
Myślę, że powodem, dla którego twoje Arduino nie chce się uruchomić, jest to, że bootloader wymaga dokładnego źródła zegara, ale zastosowanie do niego napięcia 3v zepsuje ten zegar i może się zawiesi lub zaczeka na zastosowanie 3.3v dla stabilnego źródła.
Patrząc na arkusz danych:
Widzimy, że pobór prądu podczas budzenia (uruchomienie bootloadera) prawdopodobnie wyniesie około 2 mA, podczas gdy prąd spania wynosi około 0,8 mikroamperów . Może to z pewnością doprowadzić do zaniku zasilania podczas uruchamiania bez odpowiedniego prądu.
Być może powinieneś włączyć go tylko przy zasilaniu 5 V, a może potrzebujesz akumulatora o wyższym natężeniu i wyższym napięciu.
źródło
Spróbuj ponownie uruchomić arduino, przechodząc do Narzędzia> Nagraj Bootloader
źródło