这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » 【转载】通用定时器实现1对互补带死区的PWM信号输出--from三叶

共4条 1/1 1 跳转至

【转载】通用定时器实现1对互补带死区的PWM信号输出--from三叶

工程师
2024-05-20 23:56:26     打赏

互补的PWM经常用到,还得带死区保证安全。使用高级定时器TIM1和TIM8容易实现。最近发现通用定时器TIM2~TIM5也可以实现。技巧是,使用中心计数模式。 简单好用。

  1. /* TIM4 init function */

  2. void MX_TIM4_Init(void) //

  3. {

  4.   TIM_ClockConfigTypeDef sClockSourceConfig = {0};

  5.   TIM_MasterConfigTypeDef sMasterConfig = {0};

  6.   TIM_OC_InitTypeDef sConfigOC = {0};


  7.   htim4.Instance = TIM4;

  8.   htim4.Init.Prescaler = 0;

  9.   htim4.Init.CounterMode =TIM_COUNTERMODE_CENTERALIGNED3; //中心计数模式

  10.   htim4.Init.Period =210-1;//84MHz/200KHz/2=210 MCU主频168MHz,定时器时钟频率84Mhz

  11.   htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;

  12.   htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;

  13.   if (HAL_TIM_Base_Init(&htim4) != HAL_OK)

  14.   {

  15.     Error_Handler();

  16.   }

  17.   sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;

  18.   if (HAL_TIM_ConfigClockSource(&htim4, &sClockSourceConfig) != HAL_OK)

  19.   {

  20.     Error_Handler();

  21.   }

  22.   if (HAL_TIM_PWM_Init(&htim4) != HAL_OK)

  23.   {

  24.     Error_Handler();

  25.   }

  26.   sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;

  27.   sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;

  28.   if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK)

  29.   {

  30.     Error_Handler();

  31.   }

  32.   sConfigOC.OCMode = TIM_OCMODE_PWM2;

  33.   sConfigOC.Pulse = 210/2-1;

  34.   sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;

  35.   sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;

  36.   if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)

  37.   {

  38.     Error_Handler();

  39.   }


  40.   sConfigOC.OCPolarity = TIM_OCPOLARITY_LOW;

  41.   sConfigOC.Pulse = 210/2-1-5;//后面这个减5,就是死区。单个死区占空比是 5/420=1.2%

  42.   if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)

  43.   {

  44.     Error_Handler();

  45.   }

  46.   HAL_TIM_MspPostInit(&htim4);


  47. }

复制代码

启动运行的话,使用这个函数:
        HAL_TIM_OC_Start(&htim4,TIM_CHANNEL_1);//启动TIM4的PWM输出。
        HAL_TIM_OC_Start(&htim4,TIM_CHANNEL_2);//启动TIM4的PWM输出。

如果做开关电源的驱动信号的话,这里启动函数有个小隐患,HAL库函数不支持2个通道同步启动或者停止。。。。。只能使用LL库操作比较好。


修改占空比的话,使用这个函数:
    __HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_1,xxxx/2-1);  //xxxx是定时器比较的计数值
    __HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_2,(210-xxxx)/2-1-5);

来源: 整理文章为传播相关技术,网络版权归原作者所有,如有侵权,请联系删除。


高工
2024-05-21 08:43:41     打赏
2楼

谢谢分享


菜鸟
2024-06-06 21:01:17     打赏
3楼

学习了!谢谢版主


高工
2024-06-19 08:51:56     打赏
4楼

学习一下


共4条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]