STM32的HAL库开发---高级定时器PWM输入模式实验

一、PWM输入模式工作原理

通过PWM输入模式,可以测量PWM的周期、频率、占空比。

时钟源选择内部时钟源,然后设置PSC预分频系数。F1系列内部时钟为72M的,PSC分频系数设置为0,也就是不分频。可以计算出计数器计一个数的时间,也就是量器的精度。

具体配置:例如PWM从通道1输入,配置TI1的两个信号TI1FP1和TI1FP2分别映射到IC1和IC2上面。然后设置IC1为上升沿触发,IC2为下降沿触发。然后当上升沿来的时候,让计数器的值变为0。这个可以通过配置定时器的从模式为复位模式,通过配置TRGI为TI1FP1触发,当TI1FP1信号来的时候,计数器自动清零。由于通道3和通道4没有信号可以触发定时器的从模式,所以只能用通道1和通道2。

二、PWM输入模式时序

首先PWM上升沿来的时候,计数器的值会被清0 ,等待下降沿到来。下降沿来时,计数器的值会转移到CCR2里边,然后上升沿再次来时,计数器的值会被转移到CCR1里边,同时计数器的值再次清零。 

三、PWM输入模式配置步骤

1、HAL_TIM_IC_init()函数,配置定时器基础工作参数。,与base_init()函数一样

2、HAL_TIM_IC_MspInit()函数,配置NVIC、CLOCK、GPIO等。

3、HAL_TIM_IC_ConfigChannel()函数,配置输入通道1/2映射、捕获边沿等。

4、HAL_TIM_SlaveConfigSynchro()函数,设置从模式触发源

5、HAL_NVIC_SetPriority()、HAL_NVIC_EnablelRQ()函数,设置优先级,使能中断。

6、HAL_TIM_IC_Start_IT()函数,使能捕获、捕获中断及计数器。

7、TIMx_IROHandler()中断服务函数。

8、HAL_TIM_IC_CaptureCallback()函数,输入捕获中断回调函数。

### STM32 HAL实现红外遥控与定时器中断的相关解决方案 #### 使用HAL配置红外接收功能 通过STM32的TIM输入捕获模式可以检测到红外信号的高电平和低电平时长,从而解析出对应的编码数据。具体来说,可以通过设置定时器的工作模式为输入捕获模式来捕捉外部信号的变化时刻[^1]。 ```c // 初始化定时器用于捕获红外信号 void MX_TIM2_Init(void) { TIM_HandleTypeDef htim2; __HAL_RCC_TIM2_CLK_ENABLE(); htim2.Instance = TIM2; htim2.Init.Prescaler = 71; // 设置预分频器,假设系统时钟为84MHz,则计数频率约为1Mhz htim2.Init.CounterMode = TIM_COUNTERMODE_UP; htim2.Init.Period = 0xFFFF; // 自动重装载值设大一些以便能够容纳较长周期脉冲 htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim2.Init.RepetitionCounter = 0; if (HAL_TIM_IC_Init(&htim2) != HAL_OK){ Error_Handler(); // 错误处理函数定义由用户自行完成 } } ``` 上述代码片段展示了如何初始化一个通用定时器(这里以TIM2为例),将其配置成适合于测量外部事件宽度的形式[^2]。 #### 配置中断服务程序 当接收到特定条件下的触发信号后会进入相应的ISR(Interrupt Service Routine),在此处读取并保存当前的时间戳或者计算前后两次沿之间经历了多少个时钟周期[^3]。 ```c extern uint16_t IRCodeBuffer[IR_CODE_LEN]; // 假定已经声明了一个缓冲区存储解码后的命令字节序列 void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) { static uint32_t previousCaptureValue = 0; uint32_t currentCaptureValue; int i=0; if(htim->Instance==TIM2){ /* 获取最新的捕获数值 */ currentCaptureValue = HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1); /* 计算两个连续边沿间经过的实际微秒数量 */ uint32_t pulseWidthUs=(currentCaptureValue>previousCaptureValue)? ((currentCaptureValue-previousCaptureValue)*US_PER_TICK):((MAX_PERIOD-(previousCaptureValue-currentCaptureValue))*US_PER_TICK); // 将获取的数据存入数组中等待后续进一步分析判断是否匹配已知协议模板... while(IRCodeBuffer[i]!=NULL && i<IR_CODE_LEN)i++; IRCodeBuffer[i]=pulseWidthUs; /* 更新前一次记录的位置变量*/ previousCaptureValue=currentCaptureValue ; } } ``` 此部分实现了每当发生指定类型的转换结束之后自动调用该回调方法,并从中提取有用的信息填充至全局共享区域供主循环访问[^4]。 #### 结合实际应用案例说明流程控制逻辑设计要点 对于NEC标准而言,其载波频率固定为38kHz左右,在发送端采用PWM方式产生相应占空比方波;而在接受侧则利用前述提到过的机制探测到来自发射装置发出的一连串短促交替高低变化特征向量组合作为依据还原原始按键意图表达形式[^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值