在增强型51单片机开发中,PWM输入捕获功能是测量外部信号周期和占空比的核心技术。传统方法需要两个输入通道分别捕获上升沿和下降沿,而STC增强型51单片机提供的从模式(Slave Mode)方案,通过内部捕获模块的协同工作,仅需单个物理引脚即可完成精确测量。
从模式的核心在于利用定时器的触发联动机制。当配置为复位模式(Reset Mode)时,TI1FP1(定时器输入1滤波后的信号)的上升沿会触发计数器重新初始化。具体工作流程如下:
第一个上升沿到来时:
下降沿到来时:
下一个上升沿到来时:
关键提示:由于采用复位模式,每个周期都会清零计数器,因此CCR2的值直接代表周期,而无需像普通模式那样需要计算两次捕获的差值。
传统方案需要将PWM信号同时连接到两个GPIO引脚(如TI1和TI2),但在从模式方案中,硬件连接得以简化:
code复制PWM信号源 ────┤ TIMx_CH1 ├
(如P1.0)
这种设计避免了外部飞线连接,既减少了PCB布线复杂度,又降低了信号干扰风险。
STC增强型51的定时器模块存在特定的捕获通道配对规则:
| 有效组合 | 可捕获引脚 | 典型应用场景 |
|---|---|---|
| CC1+CC2 | TIMx_CH1 或 TIMx_CH2 | 通用PWM测量 |
| CC5+CC6 | TIMx_CH5 或 TIMx_CH6 | 高级定时器专用通道 |
配置时需特别注意:
以下是配置流程的关键代码段(基于Keil开发环境):
c复制// 定时器基础配置
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_Period = 0xFFFF; // 自动重装载值
TIM_TimeBaseStructure.TIM_Prescaler = 72-1; // 72分频(1MHz计数频率)
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
// 输入捕获配置
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_ICInit(TIM3, &TIM_ICInitStructure);
// 从模式配置
TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);
TIM_SelectInputTrigger(TIM3, TIM_TS_TI1FP1);
TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable);
预分频器设置:
测量精度提升技巧:
实验所需材料:
接线示意图:
code复制信号源PWM_OUT ──┬── 开发板P1.0(TIM3_CH1)
│
示波器探头 ──────┘(可选,用于验证)
c复制uint32_t Get_PWM_Parameters(void)
{
uint32_t IC2Value = 0, IC1Value = 0;
uint32_t DutyCycle = 0, Period = 0;
// 等待捕获完成
while((TIM3->SR & TIM_FLAG_CC2) == RESET);
IC2Value = TIM_GetCapture2(TIM3);
if(IC2Value != 0)
{
// 获取周期(CCR2为上升沿间隔)
Period = IC2Value;
// 获取占空比(CCR1为下降沿时刻)
IC1Value = TIM_GetCapture1(TIM3);
DutyCycle = (IC1Value * 100) / Period;
}
return ((Period << 16) | (DutyCycle & 0xFFFF));
}
典型问题1:捕获值不稳定
典型问题2:测量值偏小
性能优化建议:
通过合理配置,单个定时器可同时测量两路独立PWM信号:
定时器TIM3:
关键配置差异:
c复制// 第二通道配置
TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_IndirectTI;
TIM_ICInit(TIM3, &TIM_ICInitStructure);
当信号周期超过65535个计数时:
实现代码片段:
c复制volatile uint32_t overflow_count = 0;
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
{
overflow_count++;
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
}
}
在实际项目中,我发现信号边沿抖动是影响测量精度的主要因素。通过对比测试,当输入信号存在>100ns的抖动时,建议启用输入滤波(TIM_ICInitStructure.TIM_ICFilter设置为0x4~0xF)。此外,对于电机控制等应用,建议在软件中加入异常值剔除算法,当连续三次测量结果偏差超过5%时自动触发重新校准。