【嵌入式蓝桥杯】PWM输入捕获的

本文介绍了如何在STM32中配置PWM输入捕获,使用固件库v3.5的TIM_PWM_Input示例,详细讲解了PA1和PA2作为TIM2的CH2、CH3和CH4的设置过程,以及输入捕获的周期和占空比计算方法。通过修改中断处理函数和增加通道配置,实现了双通道输入捕获功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先我们确认好的输出PWM引脚是
在这里插入图片描述

PA1 TIM2 CH2 作为输出1
PA2 TIM2 CH3 作为输出2
PA2 TIM2 CH4 作为输出2
我们要用的固件库是路径是
\STM32固件库v3.5\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Examples\TIM\PWM_Input\main.c
然后我们找到这一串代码
【很好找的 因为名字上写了pwm input】

输入捕获的一些知识储备
首先两个输入捕获会用的寄存器配置

		TIM_GetCapture1(TIM2);
		得到高电平 也就是上升沿触发的次数
	    TIM_GetCapture2(TIM2);
	    得到低电平 也就是下升沿触发的次数

然后 周期就是主频频率除以上升沿触发的次数(中间注意类型转换)

   采集频率  =    (float)(72000/TIM_GetCapture1(TIM2)));

占空比就是 高电平 除以低电平的次数 (中间注意类型转换)
Channerl_2," Channerl(2):%.3fKHZ ",(float)(72000/DutyCycle_2)

 占空比=	(float)(TIM_GetCapture1(TIM2);*100/TIM_GetCapture2(TIM2);));
 /* TIM3 configuration: PWM Input mode ------------------------
     The external signal is connected to TIM3 CH2 pin (PA.01), 
     The Rising edge is used as active edge,
     The TIM3 CCR2 is used to compute the frequency value 
     The TIM3 CCR1 is used to compute the duty cycle value
  ------------------------------------------------------------ */

  TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
  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);

  /* Select the TIM3 Input Trigger: TI2FP2 */
  TIM_SelectInputTrigger(TIM3, TIM_TS_TI2FP2);

  /* Select the slave Mode: Reset Mode */
  TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);

  /* Enable the Master/Slave Mode */
  TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable);

  /* TIM enable counter */
  TIM_Cmd(TIM3, ENABLE);

  /* Enable the CC2 Interrupt Request */
  TIM_ITConfig(TIM3, TIM_IT_CC2, ENABLE);
	

最后把结构体加上去就好了

	TIM_ICInitTypeDef  TIM_ICInitStructure;

接下来把时钟 和GPIO配置加上去 都不用改的直接复制粘贴加上去就好了

  /* TIM3 channel 2 pin (PA.07) configuration */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_Init(GPIOA, &GPIO_InitStructure);
  /* TIM3 clock enable */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE)
### 使用定时器输入捕获测量PWM占空比 在嵌入式系统中,特别是针对蓝桥杯竞赛的需求,使用定时器进行PWM占空比的测量是一个常见的任务。此过程可以通过配置定时器进入特定的工作模式来完成。 #### 配置双通道定时器PWM输入模式 为了更精确地测量PWM信号的特性,采用双通道的方式能够提供更高的准确性。在这种方法下,两个不同的事件——上升沿和下降沿分别由两个独立的通道负责捕捉[^1]。这种设计允许系统不仅记录每次变化的时间戳,而且还能有效地追踪定时器本身的溢出次数,从而确保即使是在较长周期的情况下也能获得准确的结果。 #### 设置PWM工作模式 根据具体的硬件平台(如GD32系列微控制器),可以选择不同类型的PWM输出模式,即边沿对齐PWM(EAPWM)或中央对齐PWM(CAPWM)[^2]。这两种模式的主要区别在于计数方向及其影响下的波形形状;而在实际操作中,则涉及到如何设置相应的寄存器以定义期望的行为。例如,在PWM模式0中,当计数值超过预设阈值时会改变输出状态,而PWM模式1则呈现相反的操作逻辑。 #### 实现细节与代码示例 下面给出了一段基于STM32 HAL库编写的C语言程序片段,展示了如何利用定时器输入捕获功能来获取PWM信号的关键参数: ```c // 初始化TIMx外设为输入捕获模式 void MX_TIMx_Init(void){ __HAL_RCC_TIMx_CLK_ENABLE(); TIM_HandleTypeDef htim; htims.Instance = TIMx; // 配置定时器基本属性... } // 启动定时器并开启中断服务函数 void StartCapture(void){ HAL_TIM_IC_Start_IT(&htim, TIM_CHANNEL_1); HAL_TIM_IC_Start_IT(&htim, TIM_CHANNEL_2); } // 中断处理函数:每当发生一次捕获就调用它更新全局变量 void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim){ static uint32_t lastRisingEdgeTime = 0; static uint32_t risingEdgeTime = 0; static uint32_t fallingEdgeTime = 0; if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_CC1)){ // 上升沿被捕获到 risingEdgeTime = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1); if (lastRisingEdgeTime != 0){ period = risingEdgeTime - lastRisingEdgeTime; dutyCycle = ((fallingEdgeTime - lastRisingEdgeTime)*100)/period; } lastRisingEdgeTime = risingEdgeTime; } if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_CC2)){ // 下降沿被捕获到 fallingEdgeTime = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2); } } ``` 这段代码实现了通过定时器的不同通道分别监测同一PWM信号的上升沿和下降沿时刻,并据此计算出其周期(period)及占空比(duty cycle),其中`dutyCycle`是以百分比形式表示的实际高电平时长占比。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

-ATAO----

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

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

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

打赏作者

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

抵扣说明:

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

余额充值