登录/注册

stm32pwm波捕获

更多

在STM32中实现PWM波捕获,通常使用定时器的输入捕获(Input Capture)功能。以下是实现步骤和关键代码示例:


1. 硬件配置


2. 定时器配置

关键配置步骤

  1. 使能定时器时钟

    __HAL_RCC_TIMx_CLK_ENABLE();  // 替换x为实际定时器编号
  2. 初始化定时器

    TIM_HandleTypeDef htim;
    htim.Instance = TIMx;  // 定时器实例
    htim.Init.Prescaler = 0;      // 预分频系数(根据信号频率调整)
    htim.Init.CounterMode = TIM_COUNTERMODE_UP; // 向上计数
    htim.Init.Period = 0xFFFF;    // 自动重装载值(最大16位)
    HAL_TIM_IC_Init(&htim);
  3. 配置输入捕获通道

    TIM_IC_InitTypeDef ic_config;
    ic_config.ICPolarity = TIM_ICPOLARITY_RISING; // 捕获上升沿
    ic_config.ICSelection = TIM_ICSELECTION_DIRECTTI; // 直接映射到通道
    ic_config.ICPrescaler = TIM_ICPSC_DIV1;       // 不分频
    ic_config.ICFilter = 0;                        // 滤波器关闭
    HAL_TIM_IC_ConfigChannel(&htim, &ic_config, TIM_CHANNEL_y); // y为通道号
  4. 启用捕获中断

    HAL_TIM_IC_Start_IT(&htim, TIM_CHANNEL_y); // 启动捕获并开启中断

3. 中断处理

在中断中捕获上升沿和下降沿的时间戳,计算周期和占空比:

volatile uint32_t rise_time = 0, fall_time = 0;
volatile uint32_t period = 0, duty = 0;

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) {
    if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_y) {
        if (htim->Instance->CCMR1 & TIM_CCMR1_CC1S_0) { // 捕获到上升沿
            rise_time = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_y);
            // 切换为下降沿捕获
            __HAL_TIM_SET_CAPTUREPOLARITY(htim, TIM_CHANNEL_y, TIM_ICPOLARITY_FALLING);
        } else { // 捕获到下降沿
            fall_time = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_y);
            period = fall_time - rise_time;  // 计算周期
            duty = (fall_time - rise_time) * 100 / period; // 计算占空比
            // 切换回上升沿捕获
            __HAL_TIM_SET_CAPTUREPOLARITY(htim, TIM_CHANNEL_y, TIM_ICPOLARITY_RISING);
        }
    }
}

4. 注意事项


5. 示例代码(HAL库)

完整初始化示例:

// 初始化GPIO
GPIO_InitTypeDef gpio_init;
gpio_init.Pin = GPIO_PIN_z;          // PWM输入引脚
gpio_init.Mode = GPIO_MODE_AF_PP;    // 复用推挽模式
gpio_init.Pull = GPIO_PULLDOWN;
gpio_init.Speed = GPIO_SPEED_FREQ_HIGH;
gpio_init.Alternate = GPIO_AFx_TIMy; // 定时器复用功能
HAL_GPIO_Init(GPIOA, &gpio_init);

// 初始化定时器和输入捕获
HAL_TIM_IC_Init(&htim);
HAL_TIM_IC_ConfigChannel(&htim, &ic_config, TIM_CHANNEL_y);
HAL_TIM_IC_Start_IT(&htim, TIM_CHANNEL_y);

通过以上步骤,即可在STM32上实现PWM波的周期和占空比测量。如需更高精度,可结合定时器的溢出中断处理。

使用STM32捕获PWM时同时捕获2个通道时会出现捕获的频率值不准确是什么原因导致的?

在使用STM32F103芯片的2个定时器捕获2路PWM波时,当2路信号同

2025-04-27 08:39:28

使用STM32捕获PWM时同时捕获2个通道时会出现捕获的频率值不准确的问题,是什么原因导致的?

在使用STM32F103芯片的2个定时器捕获2路PWM波时,当2路信号同

2025-04-25 08:29:21

使用STM32捕获PWM时同时捕获2个通道时会出现捕获的频率值不准,为什么?

在使用STM32F103芯片的2个定时器捕获2路PWM波时,当2路信号同

2025-04-22 10:43:06

STM32生成互补PWM(输出前均为低电平)

STM32生成互补PWM波

资料下载 duke刘 2021-12-31 19:13:21

STM32-定时器输入捕获实验(捕获PWM方波的频率和占空比)

STM32-定时器输入捕获实验(捕获PWM方波的频率和占空比)一、输入

资料下载 20762 2021-12-14 18:55:21

STM32PWM与示波器实验

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

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

基于STM32F103C8 输入捕获实验

基于STM32F103C8 输入捕获实验-目的该项目是在实习时做的一个基于STM32+CUBEMX工具读取温度计输出的

资料下载 佚名 2021-11-30 10:36:12

基于STM32f103的输入捕获测频率和占空比

基于STM32f103的输入捕获测频率和占空比

资料下载 shyshyshy 2021-08-02 10:10:24

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

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

2024-05-17 06:13:11

pwm输入捕获实验记录

STM32f4日记2之pwm波输入捕获实验(可以接信号发生器,也可跟上一

2022-01-06 08:25:07

PWM的高精度捕获实现

今天帮别人做了一下PWM波的高精度捕获,因为要求精度比较高,所以确定使用双通道的捕获

2022-01-06 08:21:04

如何使用STM32的定时器捕获功能来测量PWM

怎么知道产生的PWM波形对不对呢?如何使用STM32的定时器捕获功能来测量PWM

2021-11-17 08:00:30

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天热门专题 换一换
相关标签