Skocz do zawartości

andrews

Użytkownicy
  • Zawartość

    18
  • Rejestracja

  • Ostatnio

Reputacja

6 Neutralna

O andrews

  • Ranga
    2/10
  1. Nie tylko "low level interrupt on INT0" może wybudzić z trybu Power-down. Zgodnie z tabelką 7-1 dokumentacji jak i informacją w punkcie 7.1.2 na stronie 35 do wybudzenia można też użyć Pin Change Interrupt. Przerwanie to, odpowiednio skonfigurowane, może wybudzić mikrokontroler przy pomocy zmiany stanu na dowolnych pinach PCINT bez konieczności używania jakichkolwiek dodatkowych elementów zewnętrznych.
  2. Chyba źle to analizujesz. Dorysuj sobie może do powyższego schematu kondensator, który jest zwykle w zasilaczu i spróbuj ponownie to przeanalizować. Może wtedy zauważysz, w jaki sposób energia samoindukcji będzie zwracana do zasilania (prąd zamyka się poprzez ten właśnie kondensator, doładowując go). Weź też pod uwagę, które pary tranzystorów biorą udział w kluczowaniu PWM (T3 i T6 dla jednego kierunku obrotów oraz T5 i T4 dla drugiego) i że nie musisz wyłączać obydwu tranzystorów, aby przerwać przepływ prądu w silniku. Jeśli jeden z nich pozostanie włączony, to obwód rozładowania energii rdzenia znacznie się skróci (nie do zasilania, tylko przez tranzystor i diodę).
  3. Tranzystory , których użyłeś, mają wbudowane diody, i to najprawdopodobniej przez diodę dolnego tranzystora płynie prąd, a nie przez sam tranzystor (ze względu na polaryzację prądu). Spróbuj użyć samej diody (o odpowiednim prądzie przewodzenia oczywiście) a efekt zapewne będzie bardzo podobny. Ogólnie sposób sterowania jednym tranzystorem, bez tej diody podłączonej równolegle do silnika, jest mało bezpieczny ze względu na indukowanie się sporych impulsów napięcia po wyłączeniu prądu płynącego przez silnik. Energia zgromadzona w rdzeniu elementu indukcyjnego, po odłączeniu prądu płynącego przez taki element powinna być zwierana (np. przez diodę) lub odprowadzana w inny sposób (np. do zasilania).
  4. Może źle to ująłem. Miałem na myśli, że tyle maksymalnie może pobierać silnik, ale nie zawsze tak będzie. Właściwie to nawet przy pracy pełnokrokowej prąd płynie przez obydwie cewki, ale tylko ok. 70% maksymalnego. Sterownik sam sobie to reguluje na podstawie napięcia ustawionego potencjometrem na pinie REF sterownika A4988 w zależności od trybu pracy i kolejnego kroku. Napisz dokładnie, jak mierzysz prąd. Obawiam się, że przy pomiarze prądu podłączasz przewody pomiarowe tak samo jak podczas pomiaru napięcia, czyli do VMOT i GND. Jeśli chcesz zmierzyć prąd pobierany przez układ, musisz np. odłączyć od płytki sterownika przewód dodatni (VMOT), podłączyć do niego jeden z przewodów pomiarowych, a drugi przewód pomiarowy podłączyć wtedy do pola lutowniczego VMOT na płytce sterownika, z którego przewód dodatni wylutowałeś. Oczywiście przyrząd musi być przełączony na pomiar prądu. Inaczej mówiąc musisz podłączyć przyrząd szeregowo.
  5. 12 V, 0,8A (wcześniej było 0,4A), natężenie może być minimalnie niższe (0,78A) Co się zmieniło, że teraz jest większy prąd? Zwróć uwagę, co napisałem w poprzednim poście. Napięcie na wejściu REF układu A4988 (czyli na suwaku potencjometru) powinno być równe 160mV, a przynajmniej nie powinno być większe, żebyś nie przegrzał silnika. Coś tu zdecydowanie nie pasuje. Może jednak coś źle mierzysz. Jeśli bezpośrednio na płytce sterownika pomiędzy VMOT i GND jest napięcie 12V i płynie prąd 0,8A, to na czym jest spadek napięcia, jeśli nie na cewkach? Gdyby z kolei przez cewki płynął prąd, to powinien być na nich spadek napięcia, więc coś tam powinieneś zmierzyć. Skoro na cewkach nie ma napięcia, to może masz tam jakieś zwarcie, albo coś źle podłączyłeś. Zrób może jakieś zdjęcia, jak to masz podłączone fizycznie (nie rysunek), pokaż jak i gdzie mierzysz napięcia i może przede wszystkim w jaki sposób mierzysz prąd. Poza tym nie odpowiedziałeś na wszystkie pytania, np. czy pomiędzy 1A-1B masz (przy wyłączonym zasilaniu) rezystancję 30 Ohm (taka sama powinna być pomiędzy 2A-2B). 36A Na wyjściu stabilizatora masz 36A? Chyba miałeś na myśli 36V, ale to też raczej niemożliwe. Może mierzyłeś na wejściu stabilizatora? Nie wiem jaki to stabilizator, ale zwykle takie stabilizatory mają maksymalne napięcie wejściowe rzędu 35V, więc to też trochę na granicy bezpieczeństwa. Wybacz, ale ja nie widzę co i jak robisz. Niemniej informacje, które podajesz są raczej mało prawdopodobne, więc coś musisz robić nie tak. w jaki sposób bezpośrednio na płytce? Nie wiem, jak to ująć inaczej. Bezpośrednio na płytce sterownika, czyli dotykając przewodami pomiarowymi pola lutownicze na płytce sterownika, gdzie przylutowane są przewody zasilające logikę (a nie np. na wyjściu tego napięcia z Raspberry Pi).
  6. Na początek: gdzie masz definicję zmiennej im5? Kompilator się nie buntował? Zakładając, że to pomyłka i w miejscu im5 miało być im10. Jeśli zostanie naciśnięty 3 razy np. IMPULS_1 to zmienna im1 nadal będzie równa 1, bo za każdym razem przypisujesz jej wartość 1. Jeśli chcesz sumować punkty, to spróbuj może tak: if (impuls(IMPULS_1)) { LED3_TOG; _delay_ms(500); LED3_TOG; im1 += 1; } Oczywiście dla IMPULS_2 powinno być im2 += 2; Nie wiem też, czy to zamierzone działanie, ale przy takim kodzie wciśnięcie przycisku na dłużej niż 500ms spowoduje ponowne naliczenie punktów. Poza tym nie rozumiem, skoro suma punktów ma być większa równa 10, to dlaczego piszesz: Istnieje też duże prawdopodobieństwo, że wynik tego działania będzie ujemny: a zmienną reszta masz zadeklarowaną jako unsigned. Ogólnie niezbyt rozumiem z Twojego opisu, jaki dokładnie ma być algorytm działania programu, więc trudno mi tu coś konkretnego doradzić. Może tymczasem przemyśl to, o czym napisałem.
  7. Teoretycznie coś powinno być. Trudno jednak pomagać na odległość, kiedy Ty podajesz tak mało danych. W tej sytuacji istotne jest także: jakie jest napięcie pomiędzy 2A i 2B, jakie jest w ogóle napięcie zasilania silnika mierzone bezpośrednio na płytce (pomiędzy VMOT i GND), jakie napięcie jest na wyjściu stabilizatora napięcia. Dodatkowo należałoby sprawdzić dla pewności stabilność wszystkich połączeń, zmierzyć napięcia wejściowe na poszczególnych pinach sterujących oraz napięcie zasilające logikę (pomiędzy VDD i GND) bezpośrednio na płytce. Problemem może też być ustawienie potencjometru na płytce sterownika. Zgodnie z dokumentacją dla prądu cewki 0,4A i wartości rezystora RS=0,05 Ohm, na pinie REF układu A4988 należy potencjometrem ustawić napięcie 0,16V (160mV). Prawidłowe i dokładne ustawienie tego napięcia jest szczególnie istotne podczas pracy mikrokrokowej, ale nawet przy pełnokrokowej ustawienie tego napięcia na 0V może skutkować wyłączeniem lub znacznym ograniczeniem prądu cewek. Przy okazji nie zaszkodzi też sprawdzić, czy rezystory R7 i R8 na płytce sterownika przewodzą. Dobrze byłoby też zmierzyć (przy wyłączonym zasilaniu), czy pomiędzy pinami 1A-1B oraz pomiędzy pinami 2A-2B jest prawidłowa rezystancja cewek (powinno być 30 Ohm). Ogólnie należy się upewnić, czy między przewodami łączącymi sterownik z silnikiem nie ma jakichś zwarć. Trochę tego jest do sprawdzenia, ale nie widziałem Twojego układu ani nie wiem dokładnie co i w jaki sposób już sprawdziłeś. Lepiej i szybciej jest diagnozować problem metodą wykluczeń, czyli zmierzyć lub sprawdzić coś, a dalsze działania podjąć na podstawie wyciągniętych wniosków, tylko że przy tym tempie wymiany informacji mogłoby nam to trochę czasu zająć
  8. Witam. Jak już mierzysz napięcie, to na cewkach, czyli pomiędzy 1A-1B lub 2A-2B. Kiedy silnik stoi, należy mierzyć napięcie stałe, kiedy się kręci - przemienne. Taka różnica nie ma krytycznego znaczenia. Ja bym tu widział inny problem. Jak tak patrzę na schemat, który przedstawiłeś, to widzę, że w zasilaniu silnika masz włączony stabilizator napięcia. Ten stabilizator właściwie jest zbędny. Oprócz tego pomiędzy wyjściem stabilizatora a sterownikiem masz wstawione szeregowo dwa rezystory o łącznej rezystancji (jeśli dobrze widzę) 30 Ohm. Te rezystory też są zbędne, a właściwie mogą przeszkadzać. W trybie pełnokrokowym (piny MS1-3 podłączone do masy) sterownik zasila dwie cewki jednocześnie, więc łączny prąd dostarczony do silnika powinien wynosić 0,8A. Biorąc pod uwagę, że równolegle połączone cewki będą miały rezystancję wypadkową 15 Ohm + dodane przez Ciebie dwa rezystory łącznie 30 Ohm, to razem 45 Ohm, razy 0,8A to daje potrzebne napięcie zasilające 36V. Nie wiem, jakie masz napięcie na wyjściu stabilizatora, ale podejrzewam, że mniejsze. Poza tym w różnych trybach w różnych pozycjach silnika zapotrzebowanie na prąd zasilający może się zmieniać, a to spowoduje różne spadki napięcia na rezystorach szeregowych. Dlatego ja proponowałbym (biorąc pod uwagę rezystancję cewki i wymagany prąd) zwykły zasilacz 12V napięcia stałego (wystarczy niestabilizowany) o wydajności prądowej minimum 1A, bez rezystorów w szereg z zasilaniem silnika. Do prób powinno wystarczyć. Gdybyś chciał bardziej precyzyjnie dobrać zasilanie silników, zerknij tutaj. Jak już wspomniał wcześniej kolega @FlyingDutch , jednego kroku możesz nie zauważyć, więc dobrze byłoby zrobić pętlę nieskończoną. Ja chciałbym tylko zwrócić uwagę, że kiedy tworzysz pętlę, to trzeba dodać w pętli jeszcze jedno opóźnienie. No i dałbym krótsze te opóźnienia. Podczas pracy pełnokrokowej, przy opóźnieniu 0,1s i 200 krokach na obrót, jeden obrót będzie trwał 40 sekund (podczas pracy mikrokrokowej jeszcze więcej) więc to i tak bardzo wolne obroty. while True: GPIO.output(16, GPIO.HIGH) #stan_wysoki time.sleep(0.1) GPIO.output(16, GPIO.LOW) #stan_niski time.sleep(0.1)
  9. Jeśli chodzi o częstotliwość multipleksowania, to chyba trzeba będzie dobrać eksperymentalnie. Być może trzeba będzie nieco zwiększyć, ale nie przesadzałbym. Myślę, że maksymalnie około 600Hz powinno wystarczyć. Istnieje jednak jeszcze inna możliwość. W przypadku multipleksowania wyświetlaczy LED wystarczy zgaszenie jednej cyfry i zapalenie w trakcie jednej procedury obsługi przerwania. W przypadku nixie jednak taki czas wygaszania cyfry może być niewystarczający. Rozwiązanie, które przedstawiłem powoduje, że ten czas wygaszenia jest wystarczająco długi, ale może niekoniecznie musi być aż tak długi. Właściwie powinien być tylko tak długi, na ile to konieczne, by uniknąć prześwitywania, oraz wystarczająco krótki, aby uniknąć ewentualnego efektu migotania. Dlatego dobrym rozwiązaniem byłoby skrócenie czasu wygaszenia, a wydłużenie czasu, kiedy cyfra świeci. Można to osiągnąć, zmieniając odpowiednio wartość rejestru OCR0 w trakcie obsługi przerwania, np.: // wewnątrz procedury obsługi przerwnia można dodać linijki if (licznik) { // ustalenie czasu wygaszenia OCR0 = 2; // wygaszenie wszystkich wyświetlaczy; ANODY_PORT = (ANODY_PORT | MASKA_ANODY); NIXIE_DATA = 0xFF; } else { // ustalenie czasu świecenia OCR0 = 10; // cykliczne przełączanie kolejnej anody ANODY_PORT = (ANODY_PORT & ~MASKA_ANODY) | (anoda & MASKA_ANODY); // ... reszta kodu } Wartości rejestru OCR0 są przykładowe, należy je dobrać eksperymentalnie, ale dzięki takiemu rozwiązaniu można uzyskać lepsze proporcje czasu świecenia do czasu wygaszenia.
  10. Moim zdaniem w przypadku multipleksowania nixie lepszym sposobem jest naprzemienne gaszenie i zapalanie kolejnych cyfr. Inaczej to ujmując, w nieparzystych przerwaniach gasisz wszystko (wyłączasz wszystkie anody i katody), a w parzystych zapalasz kolejne cyfry. Przykładowa procedura obsługi przerwania (starałem się zbyt wiele nie zmieniać, więc może nie być optymalnie, ale powinno działać): ISR(TIMER0_COMP_vect) { static uint8_t anoda = 1, licznik; licznik ^= 1; if (licznik) { // wygaszenie wszystkich wyświetlaczy; ANODY_PORT = (ANODY_PORT | MASKA_ANODY); NIXIE_DATA = 0xFF; } else { // cykliczne przełączanie kolejnej anody ANODY_PORT = (ANODY_PORT & ~MASKA_ANODY) | (anoda & MASKA_ANODY); switch (anoda) { case 1: NIXIE_DATA = pgm_read_byte( &cyfry[godzina1] ); break; case 2: NIXIE_DATA = pgm_read_byte( &cyfry[godzina2] ); break; case 4: NIXIE_DATA = pgm_read_byte( &cyfry[minuta1] ); break; case 8: NIXIE_DATA = pgm_read_byte( &cyfry[minuta2] ); break; case 16: NIXIE_DATA = pgm_read_byte( &cyfry[sekunda1] ); break; case 32: NIXIE_DATA = pgm_read_byte( &cyfry[sekunda2] ); break; default: NIXIE_DATA = 0xFF; break; } anoda <<= 1; } if (anoda > 32) { anoda = 1; } }
  11. A sprawdzałeś może używając większych współczynników wypełnienia PWM? ...lub nawet podając na pin PWMA na stałe logiczną jedynkę (czyli PWM=100%)? Jeszcze uwaga dotycząca zmiany kierunku obrotów. Wprawdzie to mały silniczek i ma zapewne małą bezwładność, niemniej nie polecałbym takiej gwałtownej zmiany kierunku wirowania. Po odczekaniu tych 20s najpierw wyłącz obroty (np. wolny wybieg poprzez AIN1=0, AIN2=0 lub hamowanie poprzez PWMA=0), odczekaj chwilę i dopiero włącz obroty w drugą stronę.
  12. Schemat to jedno, istotny jest również algorytm multipleksowania. Lampy NIXIE mają dużo większą bezwładność (czas gaśnięcia cyfry po odłączeniu napięcia sterującego) w porównaniu z LED, dlatego należałoby to uwzględnić w kodzie. Kodu nie przedstawiłeś, więc trudno się wypowiedzieć, czy Twój algorytm multipleksujący jest odpowiedni. Zwykle multipleksowanie odbywa się cyklicznie w procedurze obsługi przerwania jakiegoś timera, więc gdybyś mógł przedstawić chociaż ten fragment kodu, może udałoby się coś podpowiedzieć. Myślę, że przy prawidłowym algorytmie multipleksowania kombinowanie z diodami może okazać się zbędne.
  13. Problemem mogą być źle skonfigurowane ścieżki do plików nagłówkowych. Poczytaj może ten wątek.
  14. Nie sądzę, że to powoduje problemy. Przed zaprogramowaniem nowego wsadu zawsze wykonywana jest komenda Chjp Erase, która kasuje zawartość FLASH, EEPROM oraz lock bity, więc jeśli tam miałeś jakiś bootloader, to już powinien zostać wykasowany po wgraniu programu przez avrdude. Chip Erase nie kasuje tylko fuse bitów, więc trzeba je zmienić samodzielnie. Stąd zapewne ta "pozostałość" w postaci ustawionego fuse bitu BOOTRST. Napisałeś, że przekompilowałeś program. Zakładam, że wgrałeś go do mikrokontrolera przed sprawdzeniem, czy dioda działa? Przy takich ustawieniach fuse bitów z prawidłowo podłączonym rezonatorem kwarcowym program musi działać. Jesteś pewny, że fuse bity zostają faktycznie prawidłowo zmienione w mikrokontrolerze? Odczytywałeś je z mikrokontrolera po ich ustawieniu? Czy na pewno program jest prawidłowo wgrany i zweryfikowany? avrdude nie wyświetla żadnych błędów w konsoli? Zasilanie masz stabilne i dobrze odfiltrowane? Operujesz na płytce stykowej? Połączenia dobrze kontaktują? Z Twoich postów wynika, że raz coś działa, raz nie, więc może problem nie jest w fuse bitach tylko po stronie sprzętowej (np. niestabilne połączenia). Jeśli w programie nic nie zmieniasz, tylko ponownie go kompilujesz przed wgraniem z odpowiednio zmienioną wartością F_CPU, to raczej nie jest to wina kodu, skoro działa przy wewnętrznym oscylatorze. Trudno tak zdalnie doradzić co jeszcze może być nie tak. Podałeś trochę mało informacji, więc trudno się domyślać. Mógłbyś ewentualnie pokazać jednak mimo wszystko kod programu i może jakieś zdjęcie, jak to masz połączone.
  15. Stopień komplikacji programu nie ma związku ze stabilnością pracy oscylatora. Proponuję jednak podłączyć te kondensatory (z zakresu12-22pF). Jeśli chodzi o wartość bajtu low, powinno być OK. Jeśli chodzi o wartość bajtu high, to obydwie użyte przez Ciebie wartości włączają fuse bit BOOTRST, który powinien być zaprogramowany w przypadku używania w mikrokontrolerze tzw. bootloadera. Z Twojej wypowiedzi wynika, że nie używasz bootloadera, więc ten bit powinien być wyłączony. Dodatkowo wartość high równa DA oznacza wyłączenie fuse bitu CKOPT, który w przypadku użycia kwarcu 16MHz powinien być włączony. Podsumowując, w Twoim przypadku (po zastosowaniu kwarcu 16MHz prawidłową wartością bajtu high będzie C9. Oczywiście program również wymaga ponownego skompilowania z odpowiednio ustawioną wartością -DF_CPU=16000000UL oraz wgrania do mikrokontrolera. No i pamiętaj o dołożeniu kondensatorów.
×
×
  • Utwórz nowe...