硬汉嵌入式论坛

 找回密码
 立即注册
查看: 934|回复: 1
收起左侧

[客户分享] 通用定时器实现1对互补带死区的PWM信号输出

[复制链接]

335

主题

2040

回帖

3050

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3050
发表于 2022-2-23 14:38:32 | 显示全部楼层 |阅读模式
本帖最后由 caicaptain2 于 2022-2-23 14:44 编辑

互补的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);







回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107111
QQ
发表于 2022-2-24 10:38:33 | 显示全部楼层
谢谢楼主分享。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-18 12:13 , Processed in 0.143743 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表