logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[atmega8535][asembler/avrstudio] błędy przy sterowaniu PWM

domija 25 Lut 2011 12:50 1835 11
  • #1 9201724
    domija
    Poziom 11  
    Witam szanownych forumowiczów.
    Wykonywany przeze mnie projekt to prosty sterownik lampek LED RGBW. Lampki sterowane są poprzez 4 kanały PWM, których współczynnik wypełnienia regulowany jest potencjometrami podłączonymi do 4 wejść ADC mikrokontrolera. Wyjścia PWM ustawione są w trybie fast PWM o częstotliwości 490Hz. No i poprawnie wykonana operacja powodowałaby, że jeden kanał adc steruje jednym kanałem pwm, ale tak nie jest. Kręcąc potencjometrem odpowiedzialnego za dany kanał PWM wygląda, że wszystko działa, ale potem kręcę innym(też jednym konkretnym) potencjometrem no i on też wpływa na ten kanał. Co prawda nie w takim stopniu jak ten przypisany, ale współczynnik wypełnienia zmienia sie nawet do 10 %. efekt tego jest taki, że jak ustawie jeden kanał PWM i potem kolejny to ten pierwszy zmieni swoją wartość. Nie wiem co robię nie tak, czy program nie taki jest napisany, czy może już zdążyłem uszkodzić uC? Może ktoś już się zetknął z takim problemem?. Poniżej kod może tam jest cos źle?
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #2 9201752
    LordBlick
    VIP Zasłużony dla elektroda
    1. Schemat ? Pobór mocy ? Napięcia ?
    2. Tak dla dobrego nawyku - definicje rejestrów na początek...
    3. Dlaczego w każdym przerwaniu masz cli/sei ? Procesor samodzielnie obsługuje te flagi wchodząc i wychodząc z przerwania...
    4. Gdzie przechowywanie SREG w trakcie obsługi przerwania ?
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #3 9202156
    domija
    Poziom 11  
    Wszystkie wspomniane przez Light-I punkty zostały poprawione, ale nie pomogło. Jeżeli chodzi o cli/sei to jestem samoukiem, a wyczytałem gdzieś, że nie zaszkodzi ich użyć tyle tylko, że czas procesora umyka. Dziękuje za tą uwagę, którą też już poprawiłem. Co do punktu 1 zamieszczam dwa printscreen'y ze schematami. Pierwszy to sposób podłączenia procesora, a drugi to układ zasilania diod.

    krótki opis:
    1. uC zasilany z 7805
    2. potencjometry 100k podłączone między masę a 5V no i do wejścia ADC
    3. wyjścia pwm biegną do bc849 poprzez 8,2k
    4. układ sterujący diodami to oczywiście nie INA, ale Zetex 1360(nie było w bibliotekach eagla to dałem taki z podobnymi wyjściami)

    [atmega8535][asembler/avrstudio] błędy przy sterowaniu PWM [atmega8535][asembler/avrstudio] błędy przy sterowaniu PWM
  • #4 9202174
    LordBlick
    VIP Zasłużony dla elektroda
    Poprawiony kod poproszę... (można użyć "Zmień" w pierwszym poście...)
    Zmierzony pobór prądu przez µC i LED ?
  • #5 9202193
    domija
    Poziom 11  
    Prąd uC 19mA przy całkowitym odłączeniu zasilania przetwornic(zetex1360), które włączone mają stabilizować prąd 700mA.
  • #6 9204026
    LordBlick
    VIP Zasłużony dla elektroda
    1. Proponuje zdefiniować nazwy pozostałych rejestrów zgodnie z ich rolami...
    2. W przypadku tak dużego poboru prądu w układzie duże znaczenie ma prowadzenie ścieżek od masy (odpowiednia szerokość, łączenie tylko w jednym punkcie.
    3. Czy Vdd z jednego schematu to ten sam potencjał Vdd z drugiego ?
  • #7 9215404
    domija
    Poziom 11  
    Pozostałe rejestry też zostały zdefiniowane, lecz to tylko kosmetyka i nie spodziewam się, żeby to rozwiązało ten problem, ale dla większej przejrzystości kodu i dla potomnych zostało to poprawione. Potencjał VDD to ten sam potencjał na jednym i na drugim schemacie.
    No i teraz krótkie podsumowanie:
    Po twoim doświadczeniu I-light, i po braku większych uwag do programu wnioskuje, że jest on w miarę dobry i powinien działać bez zarzutu.
    Jeżeli winowajcą nie jest program, to pozostają tylko dwa wyjścia,wymienić procek, a jak nie pomoże to zrobić nową płytkę według wskazówki I-light'a pkt.2. Będę wcześniej musiał jeszcze o tym poczytać, ale wiedzy nigdy nie za mało. Jakby ktoś miał jeszcze jakieś pomysły z chęcią wysłucham.
  • #8 9215777
    LordBlick
    VIP Zasłużony dla elektroda
    domija napisał:
    Po twoim doświadczeniu I-light, i po braku większych uwag do programu wnioskuje, że jest on w miarę dobry i powinien działać bez zarzutu.
    Nie jest tak do końca... Nie mam jak i kiedy tego kodu przetestować... ;) Po prostu wychwyciłem tylko to, co mi się rzuciło w oczy. Mam swój ulubiony styl kodowania (zawsze używam opcji "-c" <case sensitive> dla asemblera - więc piszę opkody małymi literami, używam preprocesora C tak, aby jak najrzadziej zaglądać do noty katalogowej przy próbie odgadnięcia, co miałem na myśli 3 dni temu itd.), każdy inny "zakłóca" debugowanie... ;) Nie używam np. zaimplementowanego tu myślenia - "rejestr to funkcja". W to miejsce używam RAM-u...
    P. S. Nie wszystkie AKU/r17 ogarnięte...
  • #9 9219951
    domija
    Poziom 11  
    W takim razie chciałbym się jeszcze zapytać ciebie I-light o jedną sprawę, bo z noty katalogowej nie mogę doczytać. Mianowicie wszystkie pwm'y ustawione są w 8-bitowym trybie fast pwm, inverted mode. Oznacza to że licznik liczy od zera do wartości 0xFF, resetuje się i liczy od nowa. Z każdym krokiem porównywana jest wartość licznika z wartością rejestru OCR i jeżeli są takie same następuje przerwanie. Ja w tym przerwaniu wpisuje do rejestru OCR nowe wartości pochodzące z ADC i jednocześnie (już bez mojej ingerencji) pin OC jest ustawiany(ten inverted mode). Gdy licznik doliczy do top następuje update rejestru OCR i wyzerowanie pinu OC. Zatem moment przepisania do rejestru OCR nie następuje od razu lecz wtedy gdy licznik doliczy do wartości top.
    Mam nadzieję że się wszystko zgadza jeżeli nie proszę o poprawkę i wytłumaczenie.
    I teraz jeszcze moje pytanie. Jak to jest z licznikiem timer/counter 1, ponieważ na tym jednym liczniku są dwa wyjścia, więc jak licznik liczy w górę to porównuje oba rejestry OCR1A i OCR1B i ewentualnie wystąpią oba przerwania? czy jak ?
  • Pomocny post
    #10 9221456
    LordBlick
    VIP Zasłużony dla elektroda
    Nową wartość dla OCR wpisuj w przerwaniu Overflow, a nie CTC. W przypadku Timer1 dla obu OCR1A i OCR1B jednocześnie (prawie ;) )...
  • #11 9273532
    domija
    Poziom 11  
    Trochę mnie nie było, ale nie rozwiązałem mojego problemu. Idąc tropem, że coś jeszcze jest nie tak z programem, poprawiłem go, aby reagował na przepełnienie licznika (według wskazówki I-light), ale to jeszcze nie to. Zacząłem bardziej analizować program no i zamiast znaleźć odpowiedzi więcej pytań się pojawiło. Pierwszy pomysł przyszedł mi z przetwornikiem ADC. Zmieniając kanały ADC w nieodpowiednim momencie można czasami ostro namieszać, no więc całą instrukcje z przerwania ADC wrzuciłem do obsługi przerwań overflow i za każdym razem włączam i wyłączam ADC poprzez bit ADEN w ADCSRA. Mam nadziej, że sposób włączania i wyłączania jest dobry?? Odkryłem też że timer 1 nie ustawia flagi overflow jak dojedzie do top (mimo że jest ustawiony na fast PWM 8bit czyli do 0x00FF) tylko zaczyna później liczyć w dół i dopiero jak dojdzie do bottom (0x0000) ostawia flagę. Nie rozumiem tego. Coś jest źle ustawione czy jak ?? Może kolega I-Light jeszcze raz mnie poratuje swoją wiedzą.
  • #12 9281156
    domija
    Poziom 11  
    Witam szanownych forumowiczów, otóż udało się w końcu. Lekarstwem okazała się wymiana uC. Po włączeniu nowo zainstalowanego układu od razu rzucił się w oczy mniejszy prąd pobierany przez uC i już po niewielkich poprawkach programu można było się cieszyć działającym układem. Co do flagi overflow powyżej to doczytałem, że symulator często nie zachowuje się tak jak byśmy tego oczekiwali, a program mimo wszystko działa poprawnie. Temat uważam za zamknięty.
REKLAMA