STM32F42系列PWM波生成——库函数版本
这里我给出的是STM32F427系列定时器4的PWM输出源代码,本人实测是完全好用的,看到网上的很多代码很难实际加进去就用,需要驱动直流电机的可以直接拿走,不懂的可以私下交流,后续将一些STM32的源代码就都放出来,我也是新手,互相交流,相互提升。qq:643375731
针对这个图可以把一个坑给大家说出来,底下图片VCC写的是5V,其实是驱动不了的,用一个IO输出高电平即3.3V就可以解决
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_TIM4_Init();
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);//
while (1)
{
__HAL_RCC_TIM4_CLK_ENABLE();//这个地方必须写,否则无效
__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_1,1200);
__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_2, 1200);
__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_3, 1200);
__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_4, 1200);
}
}
/* TIM4 init function */
void MX_TIM4_Init(void)
{
TIM_MasterConfigTypeDef sMasterConfig;
TIM_OC_InitTypeDef sConfigOC;
htim4.Instance = TIM4;
htim4.Init.Prescaler = 89;
htim4.Init.CounterMode = TIM_COUNTERMODE_UP;
htim4.Init.Period = 2499;
htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
HAL_TIM_PWM_Init(&htim4);
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig);
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 0;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_1);
HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_2);
HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_3);
HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_4);
HAL_TIM_MspPostInit(&htim4);
}
void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef* tim_pwmHandle)
{
if(tim_pwmHandle->Instance==TIM4)
__HAL_RCC_TIM4_CLK_ENABLE();
}
void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle)
{
GPIO_InitTypeDef GPIO_InitStruct;
if(timHandle->Instance==TIM4)
{
/**TIM4 GPIO Configuration
PD15 ------> TIM4_CH4
PD14 ------> TIM4_CH3
PD13 ------> TIM4_CH2
PD12 ------> TIM4_CH1
*/
GPIO_InitStruct.Pin = GPIO_PIN_15|GPIO_PIN_14|GPIO_PIN_13|GPIO_PIN_12;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate = GPIO_AF2_TIM4;
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
}