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

LPC1769 - Jak ustawić timer, aby LED mrugał co 1s?

tobiasz54 13 Gru 2014 12:12 1365 9
  • #1 14218226
    tobiasz54
    Poziom 13  
    Posty: 89
    Pomógł: 2
    Ocena: 4
    Witam
    Próbuję ustawić różny interwał dla timera i nie mogę ustawić tak, aby dioda mrugała np. co 1s. Który parametr jest za to odpowiedzialny lub czego brakuje?
    Docelowo chcę wysterować silnik krokowy z liczeniem kroków i dodatkowo ustawić drugi pin na zmianę kierunku.
    Przerwanie działa(ustawiłem breakpoint w funkcji zmiany stanu diody i jest ok), ale za szybko.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Inicjalizacja timera
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    włączenie timera
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    obsługa przerwania
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    zmiana stanu diody
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Czy za to odpowiedzialny jest MR0 czy Timer interval ?
    Pozdrawiam[/code]
  • #2 14218456
    michalko12
    Specjalista - Mikrokontrolery
    Posty: 3394
    Pomógł: 462
    Ocena: 321
    Czy procesor jest taktowany z IRC(4MHz)? I czego się spodziewasz, a co uzyskujesz?
  • #3 14218654
    tobiasz54
    Poziom 13  
    Posty: 89
    Pomógł: 2
    Ocena: 4
    Jest to płytka LPC1769 LPCXpresso Board.
    Procesor 120MHz.
    Chcę aby przerwanie(w którym zapalam/gaszę diode) następowało w czasie widocznym dla oka, oraz zmieniać w programie parametr nie wiem który(Timer_Interval czy MR0) żeby ustawiać czas między przerwaniami.
    W tej chwili przerwanie działa, ale dioda tak szybko miga jakby cały czas była zapalona.
  • Pomocny post
    #4 14218780
    michalko12
    Specjalista - Mikrokontrolery
    Posty: 3394
    Pomógł: 462
    Ocena: 321
    tobiasz54 napisał:
    Timer_Interval czy MR0

    A jak to różnica w tym przypadku jak zawartość Timer_Interval jest wpisywana MR0?

    Jak chcesz uzyskać przerwanie co 1s to do MR0 powinna trafić wartość 30'000'000, ale jest to zależne od tego jak ustawione są bity PCLKSEL0.
  • #5 14220967
    tobiasz54
    Poziom 13  
    Posty: 89
    Pomógł: 2
    Ocena: 4
    Dałeś mi(początkującemu) dużo do myślenia i szukania w manualu. Bardzo dobrze. Sądziłem, że TimerInterval to częstotliwość TIMER0. I skąd te30000000.
    Dzięki temu dowiedziałem się co to PCLKSEL0 i jak go odczytać.
    PCLKSEL0 ma wartość Binary:11000000000000000000 i stąd TIMER0 ma CCLK/4.
    Przy okazji, mój 1769 w dokumentacji ma 120MHz,a praktycznie wynika że chodzi na 100MHz. Czy to wynika z inicjacji systemu w LPC17xx.h, który jest także dla LPC1768?
    Jak pisałem wyżej, wykorzystuję to do sterowania silnika krokowego. Mam możliwość ustalenia ilości kroków/s(szybkość) oraz licząc przerwania - ile kroków ma wykonać silnik. Czy jest jakiś rejestr liczący przerwania timera lub na pinie wyjściowym? W tej chwili liczę tylko przerwania timera0 - timer0_counter++ , ale sprawdzanie wartości timer0_counter w funkcji obsługi przerwania to chyba niezbyt dobry pomysł.
    Czy jest jakieś wskazanie, żeby do tego stosować tylko wyjścia PWM? Sterowanie chodzi na każdym wyjściu. Do sterowania silnikiem DC to rozumiem.
  • #6 14221901
    Badmaneq
    Poziom 23  
    Posty: 567
    Pomógł: 76
    Ocena: 23
    tobiasz54 napisał:
    Dałeś mi(początkującemu) dużo do myślenia i szukania w manualu. Bardzo dobrze. Sądziłem, że TimerInterval to częstotliwość TIMER0. I skąd te30000000.
    Dzięki temu dowiedziałem się co to PCLKSEL0 i jak go odczytać.
    PCLKSEL0 ma wartość Binary:11000000000000000000 i stąd TIMER0 ma CCLK/4.
    Przy okazji, mój 1769 w dokumentacji ma 120MHz,a praktycznie wynika że chodzi na 100MHz. Czy to wynika z inicjacji systemu w LPC17xx.h, który jest także dla LPC1768?

    Podobny temat związany z podziałem zegara jest tutaj https://www.elektroda.pl/rtvforum/topic2825818.html#13650797 co prawda dla LPC1768 lecz poza max. szybkością niczym się nie różni z LPC1769.
    Co do źródła taktowania, korzystania z PLL i itp. zależy jakiego środowiska programistycznego używasz. Różne środowiska robią to różnie.
    tobiasz54 napisał:

    Jak pisałem wyżej, wykorzystuję to do sterowania silnika krokowego. Mam możliwość ustalenia ilości kroków/s(szybkość) oraz licząc przerwania - ile kroków ma wykonać silnik. Czy jest jakiś rejestr liczący przerwania timera lub na pinie wyjściowym? W tej chwili liczę tylko przerwania timera0 - timer0_counter++ , ale sprawdzanie wartości timer0_counter w funkcji obsługi przerwania to chyba niezbyt dobry pomysł.
    Czy jest jakieś wskazanie, żeby do tego stosować tylko wyjścia PWM? Sterowanie chodzi na każdym wyjściu. Do sterowania silnikiem DC to rozumiem.

    1. Z tego co ja wiem, to brak rejestru, który liczy ilość przerwań.
    2. Obsługa przerwania powinna być jak najkrótsza.
    3. Możesz stosować inne wyjścia, z tym że w przypadku bardzo szybkich czasów załączania/wyłączania pinów procesora nie zadziała, do tego właśnie jest blok PWM.
    4. W tym mikrokontrolerze jest specjalny blok Motor Control PWM specjalnie stworzony do sterowania silnikami.
  • #7 14222914
    tobiasz54
    Poziom 13  
    Posty: 89
    Pomógł: 2
    Ocena: 4
    Reasumując:
    P0-22 wykorzystałem jako STEP do sterownika silnika(zmiana stanu w przerwaniu timera0)
    P0-21 wykorzystałem jako DIR w sterowniku(zapala też mi zewnetrzną diodę jak 1)
    W przerwaniu liczę ilość przerwań.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    zmiana kierunku obrotów silnika(dodam żeby była całość)
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Ustawiłem ilość przerwań z timera(impulsy na STEP sterownika silnika) na 1000/s.
    Przy tym ustawieniu silniki najlepiej pracują(cicho, pewnie i szybko)
    Timer chodzi z częstotliwością 25MHz.

    Wszystko to dlatego, że zbudowałem już konstrukcję drukarki 3d i bawię się w sterowanie osiami.
    I po prostu jestem cały w obłokach. Dwie diody mrugają, silnik zmienia kierunek.

    Czeka mnie jeszcze obsługa przerwań z wejść(krańcówki) itd.
  • #8 14223175
    michalko12
    Specjalista - Mikrokontrolery
    Posty: 3394
    Pomógł: 462
    Ocena: 321
    Badmaneq napisał:
    2. Obsługa przerwania powinna być jak najkrótsza.

    Tego punktu nie powinno być. Obsługa przerwania powinna trwać tyle ile powinna. Zadanie ma być wykonane w dowolny sposób tak żeby nie kolidowało z innymi. Jeśli jest taka możliwość, przerwanie może trwać i 100% czasu procesora. Największą bzdurą jest powielany na tym forum mit flagi ustawianej w przerwaniu, zapewne rozsiewany przez fanów AVRów.
  • #9 14224180
    Badmaneq
    Poziom 23  
    Posty: 567
    Pomógł: 76
    Ocena: 23
    michalko12: akurat poparte doświadzczeniem. Kiedyś tworząc miernik częstotliwości na 8051 w przerwaniu wykonywane było wiele rzeczy, przez kolejny tydzień walczyłem ze znalezieniem przyczyny bo raz działał ok, innym razem świrował. Od tego czasu staram się, żeby przerwanie byłoby jak najkrótsze...
  • #10 14224260
    michalko12
    Specjalista - Mikrokontrolery
    Posty: 3394
    Pomógł: 462
    Ocena: 321
    Badmaneq napisał:
    michalko12: akurat poparte doświadzczeniem.

    Miałeś złe założenia przed przystąpieniem do tworzenia programu. Tak jak napisałem wcześniej, przerwanie powinno wykonywać się tyle ile powinno, a nie dowolny okres. Nie ma znaczenia gdzie wykona się zadanie, czy w przerwaniu czy w pętli głównej. Ma się wykonać tak, żeby cały program spełniał swoje zadanie. W dobie Cortexów gdzie mamy do dyspozycji znaczne ilości priorytetów stosowanie flag jest tym bardziej bezsensowne.
    Badmaneq napisał:
    Kiedyś tworząc miernik częstotliwości na 8051 w przerwaniu wykonywane było wiele rzeczy
    Domniemam, że w tym przypadku prawdopodobnie przerwanie nie powinno wykonywać się dłużej niż okres mierzonego sygnału. W przypadku 51 nie trudno było o gubienie przerwań, teraz na AVR też nie jest o to trudno stosując np Bascom lub jakieś delaye. W micie flagi, doszło do takiej bzdury gdzie w przerwaniu sprawdza się czy np. został odebrany znak na UART i ustawia flagę. W pętli głównej sprawdza się tą flagę i pobiera znak do bufora, jakby nie można było od razu w main() sprawdzić flagi bezpośrednio w UART.

Podsumowanie tematu

LABEL_AI_GENERATED
Użytkownik próbuje skonfigurować timer w mikrokontrolerze LPC1769, aby dioda LED mrugała co 1 sekundę. W odpowiedziach poruszono kwestie dotyczące ustawienia wartości rejestru MR0 oraz PCLKSEL0, które wpływają na częstotliwość timera. Ustalono, że dla uzyskania przerwania co 1s wartość MR0 powinna wynosić 30,000,000, co jest uzależnione od ustawień zegara. Użytkownik zrealizował również sterowanie silnikiem krokowym, wykorzystując przerwania do zmiany stanu pinów. Podkreślono znaczenie krótkiej obsługi przerwań oraz możliwość użycia PWM do precyzyjnego sterowania.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA