Hur svårt kan PWM vara?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Rick81
Inlägg: 746
Blev medlem: 30 december 2005, 13:07:09

Hur svårt kan PWM vara?

Inlägg av Rick81 »

Försöker få igång nåt så enkelt som PWM på STM32l431 men den bara vägrar. PA8 blir hög istället för att bli en PWM på 4 kHz. Har säkert missat nåt enkelt....vad kan det vara?

Kod: Markera allt

HW_TIM_PWM_Set(4000, 70);
HW_TIM_PWM_Enable();
HW_TIM_Delay(1000);
HW_TIM_PWM_Disable();
 
 
void HW_TIM_PWM_Set(uint16_t freq, uint16_t duty)
{
	uint32_t period;
 
	period = 140 -(freq /100);
	period = period *20;	// Lite osäker...
	uint16_t PULSE_VALUE = (period * duty)/100;
	uint16_t PrescalerValue = 0;
 
	/* Compute the prescaler value */
	PrescalerValue = (uint16_t) ((SystemCoreClock /2) / 4000000) - 1;	// 4 MHz PWM
 
	printf("PWM: period %d prescaler %d puls %d \n\r", (int)period, PrescalerValue, PULSE_VALUE);
	PWMTimHandle.Instance = TIM1;
 
	PWMTimHandle.Init.Prescaler         = PrescalerValue;
	PWMTimHandle.Init.Period            = period;
	PWMTimHandle.Init.ClockDivision     = 0;
	PWMTimHandle.Init.CounterMode       = TIM_COUNTERMODE_UP;
	PWMTimHandle.Init.RepetitionCounter = 0;
	if (HAL_TIM_PWM_Init(&PWMTimHandle) != HAL_OK)
	{
		printf("Error TIM!\r\n");
		return;
	}
 
	sConfig.OCMode       = TIM_OCMODE_PWM1;
	sConfig.OCPolarity   = TIM_OCPOLARITY_HIGH;
	sConfig.OCFastMode   = TIM_OCFAST_DISABLE;
	sConfig.OCNPolarity  = TIM_OCNPOLARITY_HIGH;
	sConfig.OCNIdleState = TIM_OCNIDLESTATE_RESET;
	sConfig.OCIdleState  = TIM_OCIDLESTATE_RESET;
 
	sConfig.Pulse = PULSE_VALUE;
	if (HAL_TIM_PWM_ConfigChannel(&PWMTimHandle, &sConfig, TIM_CHANNEL_1) != HAL_OK)
	{
		printf("Error PWM!\r\n");
	}
}
 
void HW_TIM_PWM_Enable()
{
	GPIO_InitTypeDef   GPIO_InitStruct;
	__HAL_RCC_GPIOA_CLK_ENABLE();
	GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
	GPIO_InitStruct.Pull = GPIO_PULLUP;
	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;
	GPIO_InitStruct.Alternate = GPIO_AF1_TIM1;
	GPIO_InitStruct.Pin = GPIO_PIN_8;
	HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
 
	if (HAL_TIM_PWM_Start(&PWMTimHandle, TIM_CHANNEL_1) != HAL_OK)
	{
		printf("PWM start error\r\n");
	}
}
 
void HW_TIM_PWM_Disable()
{
	GPIO_InitTypeDef   GPIO_InitStruct;
	HAL_TIM_PWM_Stop(&PWMTimHandle, TIM_CHANNEL_1);
 
	GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
	GPIO_InitStruct.Pull = GPIO_PULLUP;
	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;
	GPIO_InitStruct.Pin = GPIO_PIN_8;
	HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
	HAL_GPIO_WritePin(GPIOA,  GPIO_PIN_8, GPIO_PIN_RESET);
}
Användarvisningsbild
Uttis
Inlägg: 2071
Blev medlem: 16 december 2006, 00:54:34
Ort: häredetfaningenstjärna (fagersta)

Re: Hur svårt kan PWM vara?

Inlägg av Uttis »

Det är inte så att man behöver vrida upp en klöcka för alternate function ?

såhär fast för AF __HAL_RCC_GPIOA_CLK_ENABLE(); ?
Mr Andersson
Inlägg: 1394
Blev medlem: 29 januari 2011, 21:06:30
Ort: Lapplandet

Re: Hur svårt kan PWM vara?

Inlägg av Mr Andersson »

Testa starta timer-klockan. __HAL_RCC_TIM1_CLK_ENABLE()
Rick81
Inlägg: 746
Blev medlem: 30 december 2005, 13:07:09

Re: Hur svårt kan PWM vara?

Inlägg av Rick81 »

Hahah det var __HAL_RCC_TIM1_CLK_ENABLE();

Rookie mistake..... :lol:
DanielM
Inlägg: 2166
Blev medlem: 5 september 2019, 14:19:58

Re: Hur svårt kan PWM vara?

Inlägg av DanielM »

:)

Skriv svar