基于HAL库的PWM波的实现

使用AD7606做项目时,把CONVA所接引脚配置为PWM模式,PWM产生波形,可以控制好AD的采样频率。

个人对于PWM波的理解:
定时器(频率为总线频率分频后的频率),周期性的计数,若为向上计数,则从0计数到重载值是一个周期。所以,PWM波的频率是: (时钟总线频率/分频系数)/重载值

当计数值和比较值相等时,方波电平翻转(若初始电平为高,翻转后变为低电平)。则占空比为:
比较值/重载值

1.CubeMX配置

选择的是TIM3通道4,PWM模式。
基于HAL库的PWM波的实现_第1张图片

基于HAL库的PWM波的实现_第2张图片

2.初始化函数

因为需要可以修改频率的函数,所以需要重写CubeMX自动生成的函数。修改后的函数如下:

/* USER CODE BEGIN 0 */
TIM_HandleTypeDef htim3;

/* TIM3 init function */
void MY_TIM3_Init(u16 arr,u16 psc)  //把生成的函数的空参数,改为,重载值arr,分频系数psc做为参数。
{
  TIM_ClockConfigTypeDef sClockSourceConfig = {0};
  TIM_MasterConfigTypeDef sMasterConfig = {0};
  TIM_OC_InitTypeDef sConfigOC = {0};

  htim3.Instance = TIM3;	//定时器3
  htim3.Init.Prescaler = psc; //定时器分频   psc
  htim3.Init.CounterMode = TIM_COUNTERMODE_UP; //向上计数模式
  htim3.Init.Period = arr;						//自动重载值  arr
  htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  if (HAL_TIM_Base_Init(&htim3) != HAL_OK)
  {
    Error_Handler();
  }
  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  if (HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_TIM_PWM_Init(&htim3) != HAL_OK)
  {
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }
  sConfigOC.OCMode = TIM_OCMODE_PWM1; //模式选择PWM1
  sConfigOC.Pulse = arr/100;			  //设置比较值,此值是用来设置占空比   =  自动重载值/比较值 
  sConfigOC.OCPolarity = TIM_OCPOLARITY_LOW; //输出比较极性为低
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_4) != HAL_OK)//配置TIM3通道4
  {
    Error_Handler();
  }
  HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_4);//开启PWM通道4  --- 注意要开启通道,否则只是配置,并不会运行PWM
  
  HAL_TIM_MspPostInit(&htim3);
  

}
/* USER CODE END 0 */




void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
{

  if(tim_baseHandle->Instance==TIM3)
  {
  /* USER CODE BEGIN TIM3_MspInit 0 */

  /* USER CODE END TIM3_MspInit 0 */
    /* TIM3 clock enable */
    __HAL_RCC_TIM3_CLK_ENABLE();
  /* USER CODE BEGIN TIM3_MspInit 1 */

  /* USER CODE END TIM3_MspInit 1 */
  }
}
void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle)
{

  GPIO_InitTypeDef GPIO_InitStruct = {0};
  if(timHandle->Instance==TIM3)
  {
  /* USER CODE BEGIN TIM3_MspPostInit 0 */

  /* USER CODE END TIM3_MspPostInit 0 */
  
    __HAL_RCC_GPIOB_CLK_ENABLE();
    /**TIM3 GPIO Configuration    
    PB1     ------> TIM3_CH4 
    */
    GPIO_InitStruct.Pin = GPIO_PIN_1;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    GPIO_InitStruct.Alternate = GPIO_AF2_TIM3;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  /* USER CODE BEGIN TIM3_MspPostInit 1 */
  
  /* USER CODE END TIM3_MspPostInit 1 */
  }

}

主要改了几个内容:
(1)void MY_TIM3_Init(u16 arr,u16 psc) //把生成的函数的空参数,改为,重载值arr,分频系数psc做为参数。
(2)htim3.Init.Prescaler = psc; //定时器分频 psc — 把固定值,改为变量
(3) htim3.Init.Period = arr; //自动重载值 arr ---- -把固定值,改为变量
(4)sConfigOC.Pulse = arr/100; //设置比较值,此值是用来设置占空比 = 自动重载值/比较值

注意要开启该PWM通道:
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_4);//开启PWM通道4 — 注意要开启通道,否则只是配置,并不会运行PWM
这样,就可以通过调用函数MY_TIM3_Init( )设置或修改PWM波的频率了。
如:
MY_TIM3_Init(1000-1,9-1); //90/9 = 10MHZ 自动重装载为1000,那么PWM频率为10M/1000=10kHZ

3.改变占空比

//设置TIM通道4的占空比
//compare:比较值
void TIM_SetTIM3Compare4(u32 compare)
{
	TIM3->CCR4=compare; 
}

你可能感兴趣的:(单片机)