保姆级教程:用STM32的TIM3测PWM频率和占空比(附完整代码)
STM32实战指南TIM3精准捕获PWM频率与占空比全解析在嵌入式开发中精确测量外部PWM信号的频率和占空比是常见需求。无论是电机控制、传感器数据采集还是通信协议解析这项技能都至关重要。本文将带您从零开始使用STM32的TIM3定时器实现这一功能不仅提供完整代码还会深入解析每个配置步骤背后的原理。1. 硬件准备与环境搭建1.1 所需硬件清单STM32开发板推荐F103C8T6最小系统板USB转TTL串口模块用于调试输出示波器可选用于验证信号杜邦线若干1.2 开发环境配置安装Keil MDK或STM32CubeIDE确保已安装对应芯片的DFP支持包新建工程时选择正确的芯片型号提示初学者建议使用STM32CubeMX进行初始化配置可大幅降低出错概率1.3 引脚分配规划根据STM32F103的参考手册TIM3通道1对应PA6引脚功能引脚备注PWM输入信号PA6TIM3_CH1调试串口PA9/PA10USART1_TX/USART1_RX2. PWM输入捕获原理详解2.1 定时器输入捕获机制STM32的输入捕获功能通过以下组件协同工作时基单元提供计数时钟捕获/比较寄存器(CCR)记录触发时刻的计数值输入捕获通道检测边沿信号当指定边沿上升/下降到来时当前计数器的值会被锁存到CCR中同时可触发中断。2.2 PWMI模式特殊配置测量占空比需要使用PWM输入模式(PWMI)该模式特点同时配置两个捕获通道通道1捕获上升沿通道2捕获下降沿自动计算脉冲宽度和周期关键寄存器配置TIM_ICInitTypeDef TIM_ICInitStructure; TIM_ICInitStructure.TIM_Channel TIM_Channel_1; TIM_ICInitStructure.TIM_ICPolarity TIM_ICPolarity_Rising; TIM_ICInitStructure.TIM_ICSelection TIM_ICSelection_DirectTI; TIM_ICInitStructure.TIM_ICPrescaler TIM_ICPSC_DIV1; TIM_ICInitStructure.TIM_ICFilter 0x0; TIM_PWMIConfig(TIM3, TIM_ICInitStructure);3. 完整代码实现3.1 系统时钟配置首先确保系统时钟正确初始化以下代码基于72MHz主频void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct {0}; // 配置HSE振荡器 RCC_OscInitStruct.OscillatorType RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState RCC_HSE_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); }3.2 GPIO与定时器初始化配置PA6为输入模式并初始化TIM3void TIM3_IC_Init(void) { GPIO_InitTypeDef GPIO_InitStruct {0}; TIM_HandleTypeDef htim3; // 使能时钟 __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_TIM3_CLK_ENABLE(); // 配置PA6为浮空输入 GPIO_InitStruct.Pin GPIO_PIN_6; GPIO_InitStruct.Mode GPIO_MODE_INPUT; GPIO_InitStruct.Pull GPIO_NOPULL; HAL_GPIO_Init(GPIOA, GPIO_InitStruct); // 配置TIM3时基 htim3.Instance TIM3; htim3.Init.Prescaler 72-1; // 1MHz计数频率 htim3.Init.CounterMode TIM_COUNTERMODE_UP; htim3.Init.Period 0xFFFF; htim3.Init.ClockDivision TIM_CLOCKDIVISION_DIV1; HAL_TIM_IC_Init(htim3); // 配置输入捕获 TIM_IC_InitTypeDef sConfigIC; sConfigIC.ICPolarity TIM_INPUTCHANNELPOLARITY_RISING; sConfigIC.ICSelection TIM_ICSELECTION_DIRECTTI; sConfigIC.ICPrescaler TIM_ICPSC_DIV1; sConfigIC.ICFilter 0; HAL_TIM_IC_ConfigChannel(htim3, sConfigIC, TIM_CHANNEL_1); // 启动捕获 HAL_TIM_IC_Start_IT(htim3, TIM_CHANNEL_1); HAL_TIM_IC_Start_IT(htim3, TIM_CHANNEL_2); }3.3 中断处理与计算逻辑在捕获中断中计算频率和占空比void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) { static uint32_t IC1Value 0, IC2Value 0; static uint32_t captureNumber 0; static uint32_t period 0; static uint32_t pulse 0; if (htim-Channel HAL_TIM_ACTIVE_CHANNEL_1) { IC1Value HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1); captureNumber; } else if (htim-Channel HAL_TIM_ACTIVE_CHANNEL_2) { IC2Value HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2); if (IC1Value IC2Value) { period IC1Value - IC2Value; } else { period (0xFFFF - IC2Value) IC1Value; } pulse IC2Value; // 计算频率(Hz)和占空比(%) float frequency 1000000.0 / period; // 1MHz时钟 float dutyCycle (pulse * 100.0) / period; printf(频率: %.2f Hz, 占空比: %.2f%%\r\n, frequency, dutyCycle); } }4. 调试技巧与常见问题4.1 硬件连接检查清单确保信号源接地与开发板共地检查PA6引脚是否接触良好确认信号电压在3.3V范围内4.2 典型问题排查指南现象可能原因解决方案捕获值始终为0GPIO模式配置错误检查是否为输入模式测量结果不稳定信号噪声过大增加输入滤波器配置频率计算值偏差大时基预分频设置不当调整Prescaler值只能捕获上升沿PWMI模式未正确配置使用TIM_PWMIConfig函数4.3 性能优化建议抗干扰处理在信号输入端添加RC滤波适当增加数字滤波器值(TIM_ICInitStructure.TIM_ICFilter)高精度测量技巧// 提高测量分辨率 htim3.Init.Prescaler 0; // 72MHz直接计数 htim3.Init.Period 0xFFFFFFFF; // 32位计数器多通道扩展 若要同时测量多路PWM可复用相同配置到TIM2/TIM4/TIM5注意引脚分配冲突在实际项目中我发现TIM的输入捕获功能对信号质量较为敏感。当测量高频信号时建议在信号源和MCU之间加入缓冲电路同时合理配置数字滤波器参数通常设置为0x4到0x8之间能有效抑制噪声又不影响响应速度。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2436534.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!