十三届蓝桥杯嵌入式PWM(pwm模式频率不可变)

原理:

我们设置一个值CCRx,定时器开始计数,当计数值小于CCRx的时候输出高电平/低电平,当计数值大于CCRx的时候输出低电平/高电平。从而达到输出一个频率固定,但占空比可以通过CCRx调节的PWM波。

cubmax初始化配置:(好像比赛我没用到过中断我就没配置)

十三届蓝桥杯嵌入式PWM(pwm模式频率不可变)_第1张图片

Clock Source选择Internal Clock(内部时钟)
channel1~channel4四个通道可根据需求确定使用哪几个通道。配置为PWM Generation CH1
 Prescaler(预分频系数)
Counter Mode设置为Up(向上计数模式)
Counter Period。(这个是ARR自动重装载值)
ModeCH Polorioty的设置将会影响PWM波占空比的设置。

Mode:

110:PWM模式1- 在向上计数时,一旦TIMx_CNTTIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效电平(OC1REF=1)。

111:PWM模式2- 在向上计数时,一旦TIMx_CNTTIMx_CCR1时通道1为有效电平,否则为无效电平

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);
}

十三届蓝桥杯嵌入式PWM(pwm模式频率不可变)_第2张图片

注意事项和问题:

 定时器输出比较模式多路同时启动异常

你可能感兴趣的:(十三届蓝桥杯嵌入式,蓝桥杯,stm32)