STM32 HAL库系列(一)定时器PWM输入捕获模式

前言:STM32 为了方便用户使用,设置了专门的PWM输入捕获模式,在这种模式下,输入捕获更加快捷,而且相比于普通的输入捕获模式,该模式的代码量更小,能够快速实现对PWM周期,占空比,频率的测量。
定时器的PWM输入模式:一路输入信号被两个IC捕获,有TIM1和TIM2可以实现。此时定时器工作于从模式下的复位模式。
复位模式:当检测到边沿触发信号时,定时器计数器的值会被重新更新,从0开始计数。根据CUBEMX 配置,遇到目标边沿发生复位,如果使用上升沿触发,遇到上升沿发生复位。这样通过上升沿与下降沿两次捕获的时间差就是脉宽。
需要注意的是:捕获值需要在寄存器值的基础上加一,因为时钟是从0开始计数。

该模式是输入捕获模式的一个特例,除下列区别外,操作与输入捕获模式相同:
● 两个ICx信号被映射至同一个TIx输入。
● 这2个ICx信号为边沿有效,但是极性相反。
● 其中一个TIxFP信号被作为触发输入信号,而从模式控制器被配置成复位模式。
例如,你需要测量输入到TI1上的PWM信号的长度(TIMx_CCR1寄存器)和占空比(TIMx_CCR2
寄存器),具体步骤如下(取决于CK_INT的频率和预分频器的值)
● 选择TIMx_CCR1的有效输入:置TIMx_CCMR1寄存器的CC1S=01(选中TI1)。
● 选择TI1FP1的有效极性(用来捕获数据到TIMx_CCR1中和清除计数器):置CC1P=0(上升沿
有效)。
● 选择TIMx_CCR2的有效输入:置TIMx_CCMR1寄存器的CC2S=10(选中TI1)。
● 选择TI1FP2的有效极性(捕获数据到TIMx_CCR2):置CC2P=1(下降沿有效)。
● 选择有效的触发输入信号:置TIMx_SMCR寄存器中的TS=101(选择TI1FP1)。
● 配置从模式控制器为复位模式:置TIMx_SMCR中的SMS=100。
● 使能捕获:置TIMx_CCER寄存器中CC1E=1且CC2E=1。

具体的原理如下图:
在这里插入图片描述

使用C8T6最小系统来实现该功能。
CUBEMX 配置如下:
使用定时器1,配置如下:
引脚:
在这里插入图片描述
PA0产生PWM,PA8用来输入PWM,需要使用杜邦线将两个引脚相连。

定时器一的配置:
在这里插入图片描述
时基单元配置:
在这里插入图片描述
使能定时器1的中断,用于在信号边沿产生中断;
在这里插入图片描述

定时器2 用来产生PWM波:
在这里插入图片描述

串口配置:直接使能异步模式即可;
对于RCC等配置此处不再赘述;
代码很简单,只需要使能定时器,编写中断回调函数就好;

使能定时器

/* USER CODE BEGIN 2 */
	HAL_TIM_PWM_Start 	(&htim2  ,TIM_CHANNEL_1 );
	HAL_TIM_IC_Start_IT (&htim1,TIM_CHANNEL_1);
	HAL_TIM_IC_Start_IT (&htim1,TIM_CHANNEL_2);
	printf ("TIM Capture test !\r\n");
  /* USER CODE END 2 */

打印数据,printf 的使用将在串口部分介绍。

while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		HAL_Delay (500);
		printf ("Cap_val1 is :%d ,  Cap_val1 is : %d \r\n",Cap_val1 ,Cap_val2 );
		printf ("Duty is :%0.2f%% Frequency is : %0.2f\r\n",Duty  ,Frequency  );
  }
  /* USER CODE END 3 */

回调函数

/* USER CODE BEGIN 4 */
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
/*判断中断来源*/
	if(htim ->Channel == HAL_TIM_ACTIVE_CHANNEL_1 )
	{
	/*读取寄存器的值*/
		Cap_val1 = HAL_TIM_ReadCapturedValue (&htim1 ,TIM_CHANNEL_1 );
		Cap_val2 = HAL_TIM_ReadCapturedValue (&htim1 ,TIM_CHANNEL_2 );
		/*计算占空比,频率*/
		if(Cap_val1 != 0)
		{
			Duty = (float )(Cap_val2+ 1)*100 / (Cap_val1 +1) ;
			Frequency = 72000000 / 72 / (float )(Cap_val1 +1) ;
		}
		
	}
}
/* USER CODE END 4 */

结果展示
在这里插入图片描述

  • 9
    点赞
  • 111
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
你好!关于STM32 HALPWM输入捕获功能,我可以给你一些基本的介绍。 在STM32中,PWM输入捕获是一种用于测量外部信号的功能。通过配置PWM输入捕获,你可以测量一个PWM信号的频率、占空比或者脉冲宽度。 首先,你需要选择一个可用的定时器和通道来进行PWM输入捕获。然后,使用HAL的函数来配置定时器和通道,并启用输入捕获模式。 以下是一个简单的示例代码来实现PWM输入捕获: ```c #include "stm32f4xx_hal.h" TIM_HandleTypeDef htim3; void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) { if(htim->Instance == TIM3) { uint32_t captureValue = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1); // 读取捕获的值 // 进行处理或者显示 } } int main(void) { HAL_Init(); SystemClock_Config(); __HAL_RCC_TIM3_CLK_ENABLE(); htim3.Instance = TIM3; htim3.Init.Prescaler = 0; 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_ICPOLARITY_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); while (1) { // Your code here } } ``` 在上述代码中,我们首先初始化定时器TIM3,并配置通道1为输入捕获模式。然后,在主循环中你可以添加自己的代码逻辑。 需要注意的是,在使用PWM输入捕获之前,你需要根据你的需求进行适当的配置和调整代码。 希望能对你有所帮助!如果有任何进一步的问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值