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

[AVR] - dwa przebiegi kwadratowe o niezależnych częstotliwościach

siwy2411 03 Sty 2015 20:45 819 10
REKLAMA
  • #1 14287885
    siwy2411
    Poziom 11  
    Witam.

    Składam właśnie pewien układ w którym potrzebuję generować dwa przebiegi kwadratowe o zadanej częstotliwości (oczywiście przebiegi niezależne od siebie).
    Najprostszym i oczywistym rozwiązaniem jest użycie timer'a w trybie CTC, jednak tutaj pojawia się pewien problem - AVR ma zegar 16MHz, a zakresy w jakich potrzebuję kontrolować obie częstotliwości to (mniej więcej) 10-400Hz.
    Dla timera 16 bitowego to nie problem, ale w atmedze328, którą pierwotnie chciałem wykorzystać taki timer jest tylko jeden, a jak wynika z prostej matematyki timer 8-bitowy nawet przy maksymalnym preskalerze dla takiego zegara układu nie zejdzie mi poniżej ~30Hz.
    I tutaj moje pytanie - jak obejść ten problem?
    Zastosować jakiś zewnętrzny układ (I2C/SPI) służący do generowania przebiegów?
    Wykorzystać jakąś większą AVRkę, która ma conajmniej 2 timery 16-bitowe? Jeżeli tak, to jaką (idealnie byłoby w DIP, ale pewnie jest to nierealne)?
    Wrzucić na płytkę jakiś dodatkowy procek (ATTiny?) z timerem 16-bit i podawać mu wartość po SPI/I2C z mastera?
    Czy może jest jakieś oczywiste rozwiązanie, które zrobi to czego oczekuję na atmedze328, tylko go nie dostrzegam?

    Z góry dzięki za pomoc.
  • REKLAMA
  • #2 14288025
    Steryd3
    Poziom 33  
    Zawsze pozostaje programowa realizacja lub taka pół programowa.
    Możesz np. (choć pomysłów na to może być kilka) wykorzystać dwa liczniki 8-bitowe w trybie CTC i w przerwaniach od nich zastosować zmienną(oczywiście osobną dla każdego przerwania) w której będziesz zliczał do jakiejś wartości i po jej osiągnięciu zmieniał stan portu(bo o to rozumiem chodzi w całej zabawie).
    Częstotliwość możesz więc regulować i wartością rejestru skracającego licznik (np. OCRx) a także wartością do jakiej ma zliczyć zmienna. Sprytne operowanie jedną lub drugą wartością a w razie potrzeby obydwoma powinno zapewnić sukces.
  • #3 14288078
    jarek_lnx
    Poziom 43  
    Cytat:
    Czy może jest jakieś oczywiste rozwiązanie, które zrobi to czego oczekuję na atmedze328, tylko go nie dostrzegam?
    Tak, zwiekszyc długość timera software'owym licznikiem, przy takich częstotliwościach możesz zmieniać stany na portach programowo, w przerwaniu timera, jeśli nie przeszkadza ci związany z tym jitter.

    Prawdopodobnie że dało by się użyć hardware'owego sterowania portami przez timer, tylko trzeba by bardzo często zmieniać konfigurację timera - przed każdą zmianą stanu.
  • REKLAMA
  • #4 14288093
    BlueDraco
    Specjalista - Mikrokontrolery
    Dlaczego więc nie wybierzesz mikrokontrolera, który ma dwa niezależne 16-bitowe timery, tylko uparcie próbujesz zrobić to na układzie, który, jak widać, średnio się do tego nadaje?
  • REKLAMA
  • #5 14288107
    siwy2411
    Poziom 11  
    no właśnie zastanawiam się aktualnie nad takim rozwiązaniem, aby timer mi generował impulsy co jakiś stały okres czasu (np. 1 ms) i po prostu w przerwaniu inkrementować i sprawdzać dwa liczniki i przełączać stan odpowiedniego wyjścia.

    edit:
    BlueDraco napisał:
    Dlaczego więc nie wybierzesz mikrokontrolera, który ma dwa niezależne 16-bitowe timery, tylko uparcie próbujesz zrobić to na układzie, który, jak widać, średnio się do tego nadaje?

    nie upieram się na tym mikrokontrolerze - napisałem przecież, że może lepszym pomysłem jest zastosowanie czegoś innego...
  • #6 14288159
    BlueDraco
    Specjalista - Mikrokontrolery
    No to weź np. STM32F030. Za < 5zł masz min. 5 niezależnych timerów.
  • #7 14288194
    tmf
    VIP Zasłużony dla elektroda
    @siwy2411 Z głównej strony Atmela masz Atmel MCU Selector - zaznaczasz jakie zasoby potrzebujesz i wychodzi ci jakie procki masz do dyspozycji. Sprecyzuj też z jaką rozdzielczością musisz kontrolować częstotliwość - bo może się okazać, że to wcale nie jest takie proste do zrobienia na timerach sprzętowych.
  • #8 14288366
    siwy2411
    Poziom 11  
    właśnie kurcze nie wiem jeszcze jak dokładnie będę musiał sterować tą częstotliwością, ale nie spodziewam się, aby potrzebna była precyzja większa niż 1Hz.
    a jeżeli chodzi o wyszukiwarkę na stronie atmela - patrzyłem na nią, ale nie znalazłem tam możliwości ustawienia wyszukiwania wg. ilości timerów 16-bitowych...
  • REKLAMA
  • #10 14289153
    Konto nie istnieje
    Poziom 1  
  • #11 14296291
    siwy2411
    Poziom 11  
    Dzięki za pomoc, ostatecznie z różnych względów (czas, finanse) projekt prawdopodobnie wyląduje na chińskim klonie Arduino Leonardo (atmega32u4, który ma tyle timerów ile potrzebuję), oprogramowanym w C.
REKLAMA