PWM输入模式

本文详细介绍了PWM输入模式的概念,包括输入捕获与PWM输入模式的区别,如何配置PWM输入模式,以及通过程序实例展示了如何使用TIM3进行PWM输入捕获,测量PWM周期和占空比,还提供了中断处理函数的代码示例。
摘要由CSDN通过智能技术生成

一、概念理解

PWM输入捕获模式是输入捕获模式的特例,

输入捕获就是当连接到定时器的引脚上产生电平变化时对应的捕获装置会立即将当前计数值复制到另一个寄存器中。你可以开启捕获中断然后在中断处理函数中读出保存的计数值。

与输入捕获不同的是PWM输入模式会将同一个输入信号(TI1或TI2)连接到两个捕获装置(IC1和IC2)。这两个捕获装置一个捕获上升沿一个捕获下降沿。TI1FP1、TI2FP2它们中的一个被选择为触发输入且从模式控制器被配置为复位模式。

自己理解如下

1. 每个定时器有四个输入捕获通道IC1、IC2、IC3、IC4。且IC1 IC2一组,IC3 IC4一组。并且可是设置管脚和寄存器的对应关系。

2. 同一个TIx输入映射了两个ICx信号。

3. 这两个ICx信号分别在相反的极性边沿有效。

4. 两个边沿信号中的一个被选为触发信号,并且从模式控制器被设置成复位模式。

5. 当触发信号来临时,被设置成触发输入信号的捕获寄存器,捕获“一个PWM周期(即连续的两个上升沿或下降沿)”,它等于包含TIM时钟周期的个数(即捕获寄存器中捕获的为TIM的计数个数n)。

6. 同样另一个捕获通道捕获触发信号和下一个相反极性的边沿信号的计数个数m,即(即高电平的周期或低电平的周期)

7. 由此可以计算出PWM的时钟周期和占空比了

    frequency=f(TIM时钟频率)/n。

    duty cycle=(高电平计数个数/n),

    若m为高电平计数个数,则duty cycle=m/n

    若m为低电平计数个数,则

STM32F407的定时器可以配置为输入捕获模式,实现PWM输入模式。以下是配置步骤: 1. 选择需要使用的定时器TIMx,并开启时钟。 2. 配置定时器的输入捕获通道,选择输入端口GPIOx_Pinx,并将其配置为复用模式。 3. 配置定时器的计数模式,设置计数器的自动重载值和预分频器的值。 4. 配置定时器的输入捕获模式,选择输入捕获通道的触发边沿和捕获模式。 5. 在中断服务程序中获取输入脉冲的周期和占空比。 以下是示例代码: ```c // 定义定时器句柄 TIM_HandleTypeDef htimx; // 定义输入捕获结构体 TIM_IC_InitTypeDef sConfigIC; // 定义输入捕获中断结构体 TIM_HandleTypeDef htim_ic; // 初始化定时器 void TIMx_Init(void) { // 开启时钟 TIMx_CLK_ENABLE(); // 配置定时器的计数模式 htimx.Instance = TIMx; htimx.Init.Prescaler = 0; // 预分频器值 htimx.Init.CounterMode = TIM_COUNTERMODE_UP; htimx.Init.Period = 0xFFFF; // 自动重载值 htimx.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; HAL_TIM_Base_Init(&htimx); // 配置定时器的输入捕获模式 sConfigIC.ICPolarity = TIM_ICPOLARITY_RISING; // 上升沿触发 sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI; sConfigIC.ICPrescaler = TIM_ICPSC_DIV1; // 输入分频器 sConfigIC.ICFilter = 0; HAL_TIM_IC_ConfigChannel(&htimx, &sConfigIC, TIM_CHANNEL_1); // 开启输入捕获中断 HAL_NVIC_SetPriority(TIMx_IRQn, 0, 1); HAL_NVIC_EnableIRQ(TIMx_IRQn); HAL_TIM_IC_Start_IT(&htimx, TIM_CHANNEL_1); } // 定时器输入捕获中断服务程序 void TIMx_IRQHandler(void) { HAL_TIM_IRQHandler(&htim_ic); } // 输入捕获中断回调函数 void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) { if (htim->Instance == TIMx) { uint32_t period = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1); uint32_t duty = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2); uint32_t pulse = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_3); uint32_t freq = HAL_RCC_GetPCLK1Freq() / (htim->Init.Prescaler + 1) / period; float duty_cycle = ((float)duty / (float)period) * 100.0f; float pulse_width = ((float)pulse / (float)freq) * 1000.0f; // 处理输入脉冲的周期、占空比和脉宽 } } ``` 在以上代码中,TIMx_INIT()函数配置了定时器TIMx的计数模式输入捕获模式,并开启了输入捕获中断。TIMx_IRQHandler()函数是定时器的输入捕获中断服务程序,当捕获到输入脉冲时,中断会被触发。HAL_TIM_IC_CaptureCallback()函数是输入捕获中断回调函数,用于获取输入脉冲的周期、占空比和脉宽。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值