Wątek przeniesiony 2018-11-07 16:04 z Newbie przez Marooned.

Stm32 discovery - przyciemnianie diody techniką PWM

0

Witam, próbóję zrobić przyciemnianie diody techniką PWM, na kontrolerze STM32 discovery, ale i tak niezależnie jaką wartość ustawię dioda świeci tak samo, mógłby mi ktoś powiedzieć jak ten temat ugryźć w środowisku Keil?
tutaj mój kod: http://pastebin.com/x9EUkCiU
dziękuję za pomoc.

0

Po co Ci ten RTOS? Tam nigdzie nie ma potrzeby stosować wielu wątków - wszystko (poza inicjalizacją) i tak jest robione w while(1).

0

Witam, przerabiałem trochę przykład z paczki keil'a, i na podstawie funkcji z OpenStm32 próbowałem jakoś skonfigurować ten timer, gdyby ktoś mi mógł wytłumaczyć jak to zrobić w keilu, i jeszcze jakieś konkretne odnośniki do poczytania na ten temat (raczej próbuje ogarnąć sam tą konfiguracje rejestrów, ale w sumie z pomocą HAL też by mogło być). Więc w skrócie byłbym wdzięczny gdyby ktoś mi wytłumaczył jak tego PWM'a skonfigurować tutaj, tak, żeby działał, bo jak dotąd to kombinuję i bez efektów ;/.

0

Na początek wywal obie funkcje zaczynające się u Ciebie od prefiksu "os": osKernelInitialize() oraz osKernelStart(). Mam wrażenie (niepotwierdzone jednak testami), że to drugie powoduje aktywację pętli schedulera w tym RTOS i ta funkcja nigdy nie wraca do main(). Sprawdź, bo to mało poprawek, a powinno pomóc.

0

Wykombinowałem coś takiego ~~

 
void PWM_GPIO_INIT()
{
	 GPIO_InitTypeDef GPIO_InitStruct;
	  /* GPIO Ports Clock Enable */
	  __GPIOB_CLK_ENABLE();
	  /* Configure GPIO pins: PD12 PD13 PD14 PD15 */
	  GPIO_InitStruct.Pin   = GPIO_PIN_9 | GPIO_PIN_11 | GPIO_PIN_13 | GPIO_PIN_15;
	  GPIO_InitStruct.Mode=GPIO_MODE_AF_PP;
	  GPIO_InitStruct.Pull  = GPIO_NOPULL;
	  GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
	  GPIO_InitStruct.Alternate=GPIO_AF2_TIM4;
	  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}

void TIM4_Init(void)
{
	TIM_HandleTypeDef hTim4;
    // Configure TIM4 for PWM
	__TIM4_CLK_ENABLE();
    hTim4.Instance = TIM4;
    hTim4.Init.Prescaler= 0; // (84MHz / 42000 = 2KHz)
    hTim4.Init.CounterMode = TIM_COUNTERMODE_UP;
    hTim4.Init.Period = 8399; // Period = 2000 -> 1 second
    hTim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    HAL_TIM_PWM_Init(&hTim4);

    // Configure channels 1-4 for TIM4,
    // each channel is mapped to a GPIO pin
    TIM_OC_InitTypeDef oc_config;
    oc_config.OCMode = TIM_OCMODE_PWM2;
    oc_config.Pulse = 1000;
    oc_config.OCNIdleState = TIM_OCNIDLESTATE_RESET;
    oc_config.OCIdleState = TIM_OCIDLESTATE_RESET;
    oc_config.OCFastMode = TIM_OCFAST_DISABLE;
    oc_config.OCPolarity = TIM_OCPOLARITY_HIGH;

    oc_config.Pulse = 2099;
    HAL_TIM_PWM_ConfigChannel(&hTim4, &oc_config, TIM_CHANNEL_1);
    oc_config.Pulse = 4199;
    HAL_TIM_PWM_ConfigChannel(&hTim4, &oc_config, TIM_CHANNEL_3);

    // Flip the OC polarity for channels 2 and 4
    oc_config.OCPolarity = TIM_OCPOLARITY_LOW;
    oc_config.Pulse = 6299;
    HAL_TIM_PWM_ConfigChannel(&hTim4, &oc_config, TIM_CHANNEL_2);
    oc_config.Pulse = 8399;
    HAL_TIM_PWM_ConfigChannel(&hTim4, &oc_config, TIM_CHANNEL_4);

   // HAL_TIM_Base_Init(&hTim4);
   // HAL_TIM_Base_Start(&hTim4);

    HAL_TIM_PWM_Start(&hTim4, TIM_CHANNEL_1);
    HAL_TIM_PWM_Start(&hTim4, TIM_CHANNEL_2);
    HAL_TIM_PWM_Start(&hTim4, TIM_CHANNEL_3);
    HAL_TIM_PWM_Start(&hTim4, TIM_CHANNEL_4);
}


Powiedzmy, że coś zaczyna działać, jeszcze trochę to muszę po poprawiać, ale może komuś się przydać (Stm32F4 HAL)

1 użytkowników online, w tym zalogowanych: 0, gości: 1