Skocz do zawartości
Komentator

Kurs STM32 - #7 - Liczniki (timery) w praktyce, PWM

Pomocna odpowiedź

dziekuje zatem za odpowiedz 🙂

Wszystko nabralo przyjemniejszych barw.

Jednak pozostaje jeszcze kwestia pomiaru czasu z zegarkiem - dioda miga za szybko. Dlaczego?

Mam ku temu pewne poszlaki - korzystam z innego IDE - CoIDE 1.7.8. W nim za pomoca prostego kreatora dodaje komponenty - miedzy innymi system_stm32f10x.c. Nie znalazlem w tym pliku wskazanych linijek kodu - zamiast nich jest to:

    /*  PLL configuration: PLLCLK = HSE * 9 = 72 MHz */
   RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |
                                       RCC_CFGR_PLLMULL));
   RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);

Patrzac na komentarz - wykorzystany jest tutaj zegar HSE (w tym przypadku 8MHz) zamiast HSI. Jednak chyba potrzebuje wiecej czasu na przejrzenie dokumentacji do STM zanim bede w stanie cos wiecej o nich powiedziec - obecnie nie mam pojecia czym sie roznia;)

Mozliwe zatem ze timer na mojej plytce jest taktowany zegarem 72Mhz? Wydaje sie to raczej dziwne jezeli 64Mhz jest ograniczeniem sprzetowym.

Plik system_stm32f10x.c jest w wersji:

* @file system_stm32f10x.c

* @author MCD Application Team

* @version V3.5.0

* @date 11-March-2011

* @brief CMSIS Cortex-M3 Device Peripheral Access Layer System Source File.

dziekuje i pozdrawiam

Udostępnij ten post


Link to post
Share on other sites

Jeśli używasz HSE to pewnie masz inną płytkę niż polecana w kursie - na niej nie powinien działać zewnętrzny rezonator skoro nie jest montowany. Używając innego środowiska, masz też inne pliki startowe, potencjalnie inną wersję biblioteki. Na przyszłość załóż proszę nowy temat, tak żeby uwagi i odpowiedzi nie mieszały użytkownikom kursu w głowach.

A co do pracy na 72MHz - to nie jest "twarde" ograniczenie, pewnie dałoby się przetaktować procesor i na więcej. To trochę jak z overclocking-iem - zwykłych komputerów, da się, ale można coś popsuć. 72MHz, ew. 64 dla HSI to parametry gwarantowane przez producenta. Ale z chłodzeniem ciekłym azotem, podwyższaniem napięcia i innymi sztuczkami pewnie dałoby się uzyskać więcej.

Udostępnij ten post


Link to post
Share on other sites

plytke zamowilem w zestawie z Forbota 🙂 zatem jest to dokladnie ten model o ktorym mowa w kursie. Nie przypuszczalem ze wybor IDE bedzie mial tu jakies znaczenie. Zatem to musi byc kwestia samych bibliotek - ale nie moglem wiedziec ze z kazdym IDE beda one inne 🙂. Dziekuje w kazdym razie za pomoc.

Pozdrawiam

Udostępnij ten post


Link to post
Share on other sites

To bardzo ciekawe, czy mógłbyś sprawdzić obecność rezonatora X3 na płytce? W momencie pisania kursu Nucleo nie były w niego wyposażone. Jeśli producent to zmienił, byłaby to cenna informacja. Rezonator, albo raczej miejsce na jego montaż zaznaczyłem na czerwono, żeby nie było niejasności o którym elemencie mówimy:

Udostępnij ten post


Link to post
Share on other sites

w mojej plytce rowniez brakuje tego elementu. Pozostaje zatem sciagnac CoIDE 1.7.8 i sprawdzic implementacje bibliotek. moge wyslac swoj projekt na priv chociaz przypuszczam ze moze to byc zbedne 🙂

Udostępnij ten post


Link to post
Share on other sites

Mam takie pytanie czy STM32F100 swoimi Timerami może sprzetowo obsluiwać enkoder inkrementowalny ? Jeżeli TAK to jakie są ograniczenia, możliwości konfiguracji.

Udostępnij ten post


Link to post
Share on other sites

Proszę poprawcie mnie jeśli moje założenia są błędne.

Potrzebuję liczyć na liczniku mikrosekundy.

Mamy zegar 64mhz. Jedna 1s to 1 000 000 us. Tak więc 64 000 000 / 1 000 000 = 64;

I taki prescaler 64 ustawiam na timerze.

tim.TIM_Prescaler = 64 - 1;

Jako wartość period ustawiam max wartość dla 12 bitów czyli 65535.

tim.TIM_Period = 65535;

Zakładam, że po takiej konfiguracji z rejestru licznika powinienem otrzymać liczbę mikrosekund. Czy mam rację? Potrzebuję tego do komunikacji po 1-wire.

uint16_t time = TIM_GetCounter(TIM2); 

Udostępnij ten post


Link to post
Share on other sites
Jako wartość period ustawiam max wartość dla 12 bitów czyli 65535.

tim.TIM_Period = 65535;

65535 to jest maksymalna wartość dla 16 bitów. Dla 12 jest to 4095.

Udostępnij ten post


Link to post
Share on other sites

Witam,

Czy ma ktoś jakiś przykładowy kod do obsługi enkodera na nucleo , chciałem to przetestować.

Udostępnij ten post


Link to post
Share on other sites

Cześć.

Nie mam pomysłu jak zrobić zadanie 7.5 (Przygotuj program, który będzie płynnie zapalał i gasił kolejne diody.). Mam użyć innego timera, jakiejś sprytnej funkcji?  Nie wiem jak za to się zabrać, a rozwiązanie pewnie jest dość proste. ;D

Będę wdzięczny za pomoc!

Udostępnij ten post


Link to post
Share on other sites
4 godziny temu, MaciejZyskowski napisał:

Mam użyć innego timera, jakiejś sprytnej funkcji?

Tu się chyba najlepiej wypowie autor kursu (@Elvis), ale wydaje mi się, że to zadanie jest prostsze... 😉 Możesz po prostu wykorzystać opisany tam przykład do tego, aby za pomocą "zwykłych" pętli odpowiednio zmieniać wypełnienie kolejnych diod. Chyba ten przykład można zrozumieć na wiele sposobów i każdy może zrobić swoja interpretację tego zadania. Grunt, aby trenować wykorzystywanie PWM w praktyce 😉 

Udostępnij ten post


Link to post
Share on other sites

To zadanie można zrealizować na wiele sposobów - nawet bez PWM i liczników. Ale skoro było jako ćwiczenie do tej części kursu, chodziło o wykorzystanie PWM.

Wydaje mi się, że rozwiązanie zaproponowane przez @Treker jest bardzo dobre - czyli z poziomu pętli zmieniać jasność świecenia diodami. Natomiast całość w przerwaniach to zadanie dodatkowe, powiedzmy 7.5b 😉

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Cześć! Mam pytanie.

wspierałem się tym kursem lecz napotkałem mały problem moja dioda RGB straaasznie powoli zmienia kolory oraz brakuje jej plynnosci... kod poniżej (probowalem bawic sie parametrami i zauwazylem, ze jak zmniejszam 300.0f na np 100 to ciemniej swieci a jak zawiekszam x0 ten sam efekt)

float calc_pwm(float val)
{
    const float k = 0.1f;
    const float x0 = 50.0f;
    return 300.0f / (1.0f + exp(-k * (val - x0)));//moc swiecenia
}	

void tecza(void)
{

  float r = 50 * (1.0f + sin(counter / 100.0f));
  float g = 50 * (1.0f + sin(1.5f * counter / 100.0f));
  float b = 50 * (1.0f + sin(2.0f * counter / 100.0f));
	set_red(calc_pwm(r));
	set_blue(calc_pwm(b));
	set_green(calc_pwm(g));
	delay(1);
	counter++;

}

dodatkowo funkcje sterujace np set_red

void set_red(uint16_t value)
{
	TIM4->CCR2=value;	
}

konfiguracja PWM

	
	TIM4->CCMR1 &=~	TIM_CCMR1_CC1S | TIM_CCMR1_CC2S;
	TIM4->CCER	|=	TIM_CCER_CC1E | TIM_CCER_CC2E;
	TIM4->CCMR1 |=	TIM_CCMR1_OC1PE | TIM_CCMR1_OC2PE;
	TIM4->DIER	|=	TIM_DIER_CC1IE	|	TIM_DIER_CC2IE;
	TIM4->CCMR1	|= 	TIM_CCMR1_OC1M	|	TIM_CCMR1_OC2M;
	TIM4->CR1 |= TIM_CR1_CEN;
	TIM4->CR1 |= TIM_CR1_DIR;
	TIM4->CR1 |= TIM_CR1_ARPE;
	TIM4->ARR=licznik; //  zdefiniowany wczesniej na 1000

funkcja opozniajaca jest na Systicku

 

 void SysTick_Initialize (uint32_t ticks)		
 {
	SysTick->CTRL = 0; 												
	SysTick->LOAD = ticks;										
    SysTick->VAL = 0;													
	SysTick->CTRL |= SysTick_CTRL_CLKSOURCE;	
    SysTick->CTRL |= SysTick_CTRL_TICKINT;		
	SysTick->CTRL |= SysTick_CTRL_ENABLE;		 
 
 }
 
 void SysTick_Handler(void)
{
 if (TimeDelay>0)
	 TimeDelay--;		
}
 void delay(uint32_t nTime)  //milisekundy
{
	TimeDelay = nTime;    
	while(TimeDelay != 0);
}

dziękuję za pomoc oczywiście sam też będę walczyć bo sprawia mi to przyjemność ale małą podpowiedzią nie pogardzę 🙂

PS korzystam z nucleo f103 

 

Pozdrawiam 🙂

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...