登录/注册

STM32PWM程序实例

更多

以下是一个基于STM32 HAL库的PWM输出示例代码(以TIM3通道1为例,PA6引脚):

#include "main.h"
#include "stm32f1xx_hal.h"

TIM_HandleTypeDef htim3;

void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_TIM3_Init(void);

int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_TIM3_Init();

  // 启动PWM输出
  HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);

  uint16_t duty = 0;
  while (1)
  {
    // 呼吸灯效果:改变占空比
    while(duty < 1000)
    {
      __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, duty++);
      HAL_Delay(1);
    }
    while(duty > 0)
    {
      __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, duty--);
      HAL_Delay(1);
    }
  }
}

// TIM3初始化配置
void MX_TIM3_Init(void)
{
  TIM_ClockConfigTypeDef sClockSourceConfig = {0};
  TIM_MasterConfigTypeDef sMasterConfig = {0};
  TIM_OC_InitTypeDef sConfigOC = {0};

  htim3.Instance = TIM3;
  htim3.Init.Prescaler = 72-1;          // 预分频72,72MHz/72=1MHz
  htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim3.Init.Period = 1000-1;          // 自动重载值ARR,PWM周期=1MHz/1000=1KHz
  htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  HAL_TIM_PWM_Init(&htim3);

  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig);

  sConfigOC.OCMode = TIM_OCMODE_PWM1;
  sConfigOC.Pulse = 500;               // 初始占空比50%(500/1000)
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1);

  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  HAL_TIMEx_MasterConfigSynchronize(&htim3, &sMasterConfig);
}

// GPIO初始化
void MX_GPIO_Init(void)
{
  __HAL_RCC_GPIOA_CLK_ENABLE();
  GPIO_InitTypeDef GPIO_InitStruct = {0};

  // PA6配置为TIM3_CH1
  GPIO_InitStruct.Pin = GPIO_PIN_6;
  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}

// 系统时钟配置(72MHz)
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
  HAL_RCC_OscConfig(&RCC_OscInitStruct);

  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2);
}

关键配置说明:

  1. 定时器参数:

    • Prescaler: 预分频值,决定计数器时钟频率
    • Period: 自动重载值ARR,决定PWM周期
    • Pulse: 初始占空比(CCR寄存器值)
  2. PWM频率计算公式:

    PWM频率 = 定时器时钟 / (Prescaler + 1) / (Period + 1)
    本例:72MHz / 72 / 1000 = 1KHz
  3. 占空比计算:

    占空比 = (Pulse / (Period + 1)) * 100%
    示例中500对应50%占空比

使用说明:

  1. 本示例基于STM32F103系列,使用TIM3通道1(PA6引脚)
  2. 实现呼吸灯效果,PWM频率1KHz
  3. 通过__HAL_TIM_SET_COMPARE()函数动态修改占空比
  4. 实际使用需根据具体硬件修改引脚和定时器配置

注意事项:

  1. 不同型号STM32的定时器通道对应引脚可能不同
  2. 使用前务必使能相关时钟(GPIO、TIM)
  3. 高精度PWM需考虑预分频和ARR值的合理搭配
  4. 可通过STM32CubeMX工具生成初始化代码

可根据具体需求修改定时器、通道、引脚和PWM参数来适配不同的应用场景。

进行STM32 PWM输入捕获遇到的疑问求解

我在进行STM32PWM输入捕获的时候一直有一个疑问,希望各位大神能给我解决一下。 100:复位模式 – 选中的触发输入(TRGI)的上升沿重新初始化计数器,并且产生一个更新寄存器的信号。 PWM

2024-05-17 06:13:11

STM32实例-待机唤醒实验

STM32实例-待机唤醒实验

2023-10-26 15:48:00

STM32CubeIDE软件实现STM32外部中断实例

本文用STM32CubeIDE软件实现STM32外部中断实例。

2022-08-24 09:09:12

STM32读取光敏AD值自动调节屏幕亮度PWM

前提:STM32PWM配置完成(这里是通道4),PWM设置越大,屏幕背光越亮PWM调节函数:__HAL_TIM_SetCompare(&

资料下载 佚名 2022-01-14 13:07:21

STM32应用IAP进行程序更新详解及实例

STM32应用IAP进行程序更新详解及实例,硬件平台:STM32F103

资料下载 佚名 2021-12-04 20:36:09

STM32PWM与示波器实验

STM32PWM与示波器实验STM32输出PWM波形1、PWM(脉冲宽度

资料下载 而无返还 2021-12-02 13:21:09

基于STM32单片机的小车PWM调速系统

基于STM32单片机的小车PWM调速系统

资料下载 jameschen1978cw 2021-06-03 09:22:20

STM32实现PWM呼吸灯的程序合集免费下载

本文档的主要内容详细介绍的是STM32实现PWM呼吸灯的程序合集免费下载。

资料下载 h1654155285.3128 2020-03-19 08:00:00

STM32 PWM配置完成

前提:STM32PWM配置完成(这里是通道4),PWM设置越大,屏幕背光越亮PWM调节函数:__HAL_TIM_SetCompare(&

2022-01-14 07:20:19

stm32 pwm自动计算定时器配置工具相关资料下载

stm32pwm自动计算定时器配置工具

2022-01-12 07:05:03

stm32pwm和dac 精选资料分享

stm32pwm和dac一、PWM练习Keil软件仿真二、输出周期为2kHz的正炫波形三、数字音频转换为模拟音频一、PWM练习

2021-08-10 08:05:25

stm32输出pwm波的程序

stm32输出pwm波的程序,目录一、PWM简介二、实验步骤1.示例2.

2021-08-09 09:02:59

stm32PWM DAC原理

stm32PWM DAC原理简而言之:改变PWM占空比,利用DAC和ADC显示电压PWM本质上其实就是是一种周期一定,而高低电平占空比可调的方波

2021-07-20 08:23:51
7天热门专题 换一换
相关标签