我们设置一个值CCRx,定时器开始计数,当计数值小于CCRx的时候输出高电平/低电平,当计数值大于CCRx的时候输出低电平/高电平。从而达到输出一个频率固定,但占空比可以通过CCRx调节的PWM波。
Clock Source选择Internal Clock(内部时钟)
channel1~channel4四个通道可根据需求确定使用哪几个通道。配置为PWM Generation CH1
Prescaler(预分频系数)
Counter Mode设置为Up(向上计数模式)
Counter Period。(这个是ARR自动重装载值)
Mode和CH Polorioty的设置将会影响PWM波占空比的设置。
Mode:
110:PWM模式1- 在向上计数时,一旦TIMx_CNT
111:PWM模式2- 在向上计数时,一旦TIMx_CNT
CH Polorioty配置有效电平是高电平还是低电平。
Pulse是设置CRR的值(即配置不同的占空比),假如Mode设置为PWM mode1,CH Polorioty设置为Hign时,ARR为9999,若想配置占空比为50%。那么就是在计数到ARR一半时变换电平,我们就把Pulse设为4999;
PWM频率计算:频率=定时器时钟频率/定时器分频系数PSC/自动重装载值ARR
几种模式函数的类型都差不多,包括基本类型(Base),输出比较(OC),输入捕获(IC),pwm(PWM),单脉冲(One_Pulse)和编码器(Encoder)。
/****** xxx使用上述几种模式的英文替换即可*******/
HAL_TIM_xxx_Init
HAL_TIM_xxx_DeInit
HAL_TIM_xxx_MspInit
HAL_TIM_xxx_MspDeInit
/***轮询方式启动/停止/
HAL_TIM_xxx_Start
HAL_TIM_xxx_Stop
/***中断方式启动/停止/
HAL_TIM_xxx_Start_IT
HAL_TIM_xxx_Stop_IT
/****DMA方式启动/停止/
HAL_TIM_xxx_Start_DMA
HAL_TIM_xxx_Stop_DMA
PWM模式:
/* Timer PWM functions *********************************************************/
HAL_StatusTypeDef HAL_TIM_PWM_Init(TIM_HandleTypeDef *htim);
HAL_StatusTypeDef HAL_TIM_PWM_DeInit(TIM_HandleTypeDef *htim);
void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim);
void HAL_TIM_PWM_MspDeInit(TIM_HandleTypeDef htim);
/ Blocking mode: Polling */
HAL_StatusTypeDef HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel);
HAL_StatusTypeDef HAL_TIM_PWM_Stop(TIM_HandleTypeDef htim, uint32_t Channel);
/ Non-Blocking mode: Interrupt */
HAL_StatusTypeDef HAL_TIM_PWM_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel);
HAL_StatusTypeDef HAL_TIM_PWM_Stop_IT(TIM_HandleTypeDef htim, uint32_t Channel);
/ Non-Blocking mode: DMA */
HAL_StatusTypeDef HAL_TIM_PWM_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length);
HAL_StatusTypeDef HAL_TIM_PWM_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel);
中断处理函数:
void HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim);
控制函数:
HAL_StatusTypeDef HAL_TIM_PWM_ConfigChannel(TIM_HandleTypeDef htim, TIM_OC_InitTypeDef sConfig, uint32_t Channel);
回调函数:
void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim);
HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_1);
//写了一个改变占空比的函数
void Change_Pulse(TIM_HandleTypeDef *htim,uint32_t Channel,uint16_t Pulse)
{
TIM_OC_InitTypeDef sConfigOC = {0};
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = Pulse;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
{
Error_Handler();
}
HAL_TIM_PWM_ConfigChannel(htim,&sConfigOC,Channel);
}
定时器输出比较模式多路同时启动异常