【STM32CubeMX学习教程】——5.PWM模式配置(通用定时器)


一、PWM基础概念

PWM(Pulse Width Modulation,脉宽调制)是一种通过调节脉冲宽度来控制模拟信号的技术。在STM32中,定时器可以生成高精度的PWM信号。

PWM关键参数:

  • 频率: 1秒内完整周期数(F = 1/T)
  • 占空比: 高电平时间占整个周期的比例(D = Ton/T)
  • 分辨率: 占空比可调的最小步长

二、PWM模式类型

1. PWM模式1

  • 特点:
    • 向上计数时:CNT < CCRx时输出有效电平,否则输出无效电平
    • 向下计数时:CNT > CCRx时输出无效电平,否则输出有效电平
  • 适用场景: 大多数标准PWM应用

2. PWM模式2

  • 特点:
    • 向上计数时:CNT < CCRx时输出无效电平,否则输出有效电平
    • 向下计数时:CNT > CCRx时输出有效电平,否则输出无效电平
  • 适用场景: 需要反相PWM信号的应用

三、STM32CubeMX定时器配置

1.新建工程

1.双击打开桌面下载好的STM32CubeMX,点击File–>New Project,或直接点击ACCEE TO MCU SELECTOR

Alt
2.在左边搜索栏里输入使用的芯片型号,右边选中并开始创建

Alt

2.设置RCC时钟源

设置高/低速时钟源都由外部晶振产生。

Alt

3.设置定时器参数

1.PWM模式参数设置(以TIM4的通道1为例)

Alt

注:

1. Input Capture direct mode(输入捕获直接模式):或叫“直连模式”,通过定时器的一个通道直接捕获输入信号的上升沿或下降沿。
                
2. Input Capture indirect mode(输入捕获间接模式):或叫“非直连模式”,使用定时器的两个通道(如通道1和通道2)来分别捕获输入信号的上升沿和下降沿,比如同时测量输入信号的上升沿和下降沿时,由于一个通道只能配置一种边沿触发,所以将通道1配置为上升沿捕获(直连),将通道2配置为下降沿捕获(非直连)来配合使用。
                
3. Input Capture triggered by TRC(TRC触发输入捕获):捕获操作由定时器的内部触发控制器(Timer Trigger Controller, TRC)控制,而非直接由外部输入信号触发,TRC触发就是:不是信号本身决定何时捕获,而是由TRC来决定何时捕获。
                
4. Output Compare No Output(输出比较无输出模式):定时器的比较功能正常,可以产生比较事件和中断,但没有输出,不会让引脚上的电平发生变化。
                
5. Output Compare CH1(输出比较CH1模式):定时器通道1的输出比较功能,通过比较计数器(CNT)与捕获/比较寄存器(CCR1)的值来控制输出引脚的电平状态。
                
6. PWM Generation No Output (PWM生成无输出模式): PWM生成逻辑但是不输出波形,比较事件、中断、DMA请求正常产生,不影响物理输出引脚的电平状态。
                
7. PWM Generation CH1(PWM生成CH1模式):定时器通道1的PWM输出功能,通过比较计数器(CNT)与捕获/比较寄存器1(CCR1)的值,在每个引脚上输出PWM波形。

2.关于是否需要定期器中断

大多数情况下,PWM配置不需要开启中断。只有在特定需求下才需要开启中断。
需要开启中断的情况:
1)需要实时监控PWM状态时
2)需要精确控制占空比变化时
不需要开启中断的情况:
1)单纯的PWM输出
2)电机速度控制(除非需要精确换相)
3)LED调光控制
4)普通的信号生成

4.时钟配置

1.时钟源设置
默认时钟源是由内部RC振荡器产生,可通过图中按钮进行修改,外部晶振数值取决于实际电路板上的晶振大小.

Alt
提示:

  • 这里用到的芯片的最大时钟频率是100MHz,有的芯片最大只有72MHz,实际最大频率可通过查看芯片数据手册确定。

2.时钟频率设置

Alt
①PLLM—PLL输入时钟分频系数,根据自己需要的系统时钟频率来进行修改
②PLLN—主PLL倍频系数(自动计算)
③PLLP—主PLL分频系数(自动计算)
④SYSCLK—系统时钟
⑤HCLK—AHB总线时钟,由系统时钟SYSCLK 分频得到,一般不分频,等于系统时钟
⑥APB1/APB2 Prescaler—APB1/APB2总线的预分频系数,可根据需要修改

5.工程管理

1.工程设置
注:工程路径中不能有中文,否则会输出错误。
库文件要提前下载好,具体方法在 “【STM32CubeMX学习教程】——1.软件安装” 这一篇文章中有提到。

Alt

2.代码生成设置

Alt

6.生成源码

1.点击右上角按钮生成代码,之后会出现下面的窗口,再点击打开工程即可在用keil查看工程代码。

Alt

四、PWM相关代码

1.定时器4配置函数

void MX_TIM4_Init(void)
{

  TIM_ClockConfigTypeDef sClockSourceConfig = {0};
  TIM_MasterConfigTypeDef sMasterConfig = {0};
  TIM_OC_InitTypeDef sConfigOC = {0};

  htim4.Instance = TIM4;
  htim4.Init.Prescaler = 95;
  htim4.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim4.Init.Period = 999;
  htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV4;
  htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
  if (HAL_TIM_Base_Init(&htim4) != HAL_OK)
  {
    Error_Handler();
  }
  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  if (HAL_TIM_ConfigClockSource(&htim4, &sClockSourceConfig) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_TIM_PWM_Init(&htim4) != HAL_OK)
  {
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }
  sConfigOC.OCMode = TIM_OCMODE_PWM1;
  sConfigOC.Pulse = 499;
  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_MspPostInit(&htim4);

}

2.在主函数中启动PWM

int main(void)
{
    // HAL初始化(自动生成)
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    MX_TIM4_Init();
    
    // 用户代码:启动PWM
    HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_1);
    
    // 如果需要互补输出(高级定时器)
    // HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_1);
    
    while(1) {
        // 主循环
    }
}

以上就是本章的全部内容,如果对你有帮助,欢迎点赞支持,谢谢!

### STM32 CubeMX PWM 配置教程 #### 1. 系统时钟配置 在使用STM32CubeMX进行PWM配置之前,需要先完成系统的时钟配置。例如,在引用中提到的案例中,使用的外部晶振频率为8 MHz,并将主频配置为168 MHz[^2]。这一步骤对于确保定时器能够精确工作至关重要。 #### 2. 定时器的选择与模式设置 选择合适的定时器用于PWM输出。一般情况下,可以选用高级控制定时器(如TIM1或TIM8),或者通用定时器(如TIM2至TIM5)。进入定时器的参数配置界面后,将其模式设置为**PWM模式**。具体操作是在“Pinout & Configuration”页面找到对应的定时器通道,并将其功能设定为“Timer Output Compare”。随后,在“Configuration”标签页下,选择“Mode”为“PWM Mode 1”或“PWM Mode 2”,取决于所需的极性[^4]。 #### 3. 参数调整 ##### (a) 自动重装载寄存器(ARR) 自动重装载寄存器决定了PWM信号的一个周期长度。如果希望生成一个固定频率的PWM信号,则可以根据以下公式计算ARR值: \[ ARR = \frac{f_{clk}}{(PSC + 1) \cdot f_{PWM}} \] 其中 \(f_{clk}\)定时器输入时钟频率,\(PSC\) 是预分频系数,而 \(f_{PWM}\) 则为目标PWM频率。 ##### (b) 比较寄存器(CCR) 比较寄存器定义了PWM信号的占空比。其数值范围是从0到ARR的最大值之间变化。当该值接近于ARR时,表示高电平时间较长;反之则低电平持续更久。通过修改这个寄存器的内容即可动态改变占空比。 ```c // 设置占空比为10% __HAL_TIM_SET_COMPARE(&htim15, TIM_CHANNEL_1, ARR * 0.1); ``` #### 4. 主从同步机制实现相位调节 为了达到任意初相位可调的目的,可以通过建立主从关系来达成目标。即让多个从属定时器跟随同一个主定时器更新事件来进行计数清零动作,从而形成具有相同起始时刻的不同通道输出波形[^1]。 #### 5. 启动PWM输出 最后,在初始化完成后,利用`HAL_TIM_PWM_Start()`函数启动指定通道上的PWM输出过程。 ```c HAL_TIM_PWM_Start(&htim15, TIM_CHANNEL_1); ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

玥山山

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值