Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 29 mar 2026, o 18:47


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 7 ] 
Autor Wiadomość
 Tytuł: PWM programowy
PostNapisane: 6 lis 2016, o 12:14 
Offline
Użytkownik

Dołączył(a): 11 kwi 2012
Posty: 118
Pomógł: 0

Powoli już chyba głupieję dlatego chcę zapytać, jaka będzie częstotliwość PWM w trybie CTC dla
kwarc - 16MHz
preskaler - 8
OCR - 100
licznik w przerwaniu - od 0 do 255

16000000 / 8 / 100 = 20kHz?
czy
16000000 / 8 / 100 / 256 = ~78Hz?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 lis 2016, o 13:04 
Offline
Użytkownik

Dołączył(a): 11 kwi 2012
Posty: 118
Pomógł: 0

Dzięki wielkie



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 lis 2016, o 16:38 
Offline
Użytkownik

Dołączył(a): 25 lip 2013
Posty: 2605
Pomógł: 129

Chyba Hz a nie kHz?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 lis 2016, o 17:31 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 lis 2015
Posty: 1448
Lokalizacja: okolice Warszawa
Pomógł: 149

to może precyzyjniej. :)
16 000 000 / 8 = 2 000 000
2 000 000 / 101 (od 0-100 'OCR') = ~19 802
19 802 / 256 (od 0-255 'liczniczek') = ~77,35 Hz
:)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 lis 2016, o 16:11 
Offline
Użytkownik

Dołączył(a): 11 kwi 2012
Posty: 118
Pomógł: 0

Mam dziwny problem z tym pwm i chciałbym się dowiedzieć dlaczego tak się dzieje

uC to Atmega 32 z kwarcem 16MHz

Otóż, jest sobie timer ustawiony na:
TCCR2 |= (1<<WGM21); //CTC
TCCR2 |= (1<<CS21); //8
OCR2 = 47;
TIMSK |= (1<<OCIE2);

i przerwanie:
Kod:
ISR(TIMER2_COMP_vect) {
   static uint8_t cnt;

   if(cnt > 99) {
      cnt = 0;
   }

   for(uint8_t i = 0; i < 6; i++) {
      if(cnt >= 16 + (16 * i)) {
         driver_status(i, 0);
      } else {
         driver_status(i, 1);
      }
   }

   cnt++;
}

void driver_status(uint8_t i, uint8_t status) {
   switch(i) {
      case 0:
         status ? (DRV1_ON) : (DRV1_OFF);
         break;
      case 1:
         ...
   }
}


Do tego jest sterowanie przez BT z wykorzystaniem biblioteki mkuart.c.

Przy OCR2:
>= 47 (~425Hz i mniej) wszystko działa poprawnie
= 46 (~435Hz), biblioteka uarta gubi znaki, przez co polecenia nie są rozpoznawane
<= 45 (~444Hz) nie dostaję już odpowiedzi zwrotnej z uart

Dlaczego tak się dzieje?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 lis 2016, o 16:48 
Offline
Użytkownik

Dołączył(a): 11 kwi 2012
Posty: 118
Pomógł: 0

Włączenie/wyłączenie diody jakoś mocno obciąża?
To tej sytuacji cnt wyciągnąć gdzieś wyżej i dodać volatile a samego pwma obrabiać w głównej pętli programu?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 lis 2016, o 16:58 
Offline
Użytkownik

Dołączył(a): 11 kwi 2012
Posty: 118
Pomógł: 0

Nie chciało mi się kodu powtarzać, zaraz to przepiszę bez wywołania funkcji i pętli, i zobaczę co z tego będzie.

Przy:
Kod:
ISR(TIMER2_COMP_vect) {
   static uint8_t cnt;

   if(cnt > 99) {
      cnt = 0;
   }

   cnt >= 16 ? (DRV1_ON) : (DRV1_OFF);
   cnt >= 32 ? (DRV2_ON) : (DRV2_OFF);
   cnt >= 48 ? (DRV3_ON) : (DRV3_OFF);
   cnt >= 64 ? (DRV4_ON) : (DRV4_OFF);
   cnt >= 80 ? (DRV5_ON) : (DRV5_OFF);
   cnt >= 96 ? (DRV6_ON) : (DRV6_OFF);

   cnt++;
}


udało mi się zejść z OCR2 do 10, więc różnica jest spora. Dzięki dambo.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 7 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 6 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO