输入捕获分为两种,一种是正常的输入捕获,当检测到输入信号的边沿后,计数器的当前值被锁存到捕获/比较寄存器(TIM1_CCRx)中。当发生捕获事件时,相应的CCiIF标志(TIM1_SR寄存器)被置1 。如果使能了中断,则产生中断, 置位CCiIF寄存器或者读取捕获寄存器的值可以清除 CCiIF 。
配置步骤:
1.选择有效的输入信号,选择channel;
2. 输入信号TIi的特点,配置TIM1_CCMRi寄存器中的ICiF位来设置相应的输入滤波器的滤波时间。
3.选择触发方式,上升沿下降沿。
4.设置预分频器;
5.设置TIM1_CCER1寄存器的CC1E=1,允许捕获计数器的值到捕获寄存器中;
6.enable interrupt;
result->
1.TIM1_CCR1寄存器保存寄存器到值;
2. CCiIF的值违背清除而发生两个连续的触发是, CCiOF的值也变为1;
3.CC interrupt
第二种是PWM输入信号测量
差别:
1. 两个通道信号被映射到一个输入上;
2.这两个通道信号极性相反;
3.其中一个TIiFP信号设置为触发信号,触摸模式控制器被配置为复位触发模式。
配置(测量TI1输入pwm信号的周期(CCR1)和占空比(CCR2)):
1.选择TIM1_CCR1的有效输入:置TIM1_CCMR1寄存器的CC1S=01(选中TI1)。
2. 选择TI1FP1的有效极性(用来捕获数据到TIM1_CCR1中和清除计数器):置CC1P=0(上升沿有效)。
3.选择TIM1_CCR2的有效输入:置TIM1_CCMR2寄存器的CC2S=10(选中TI1FP2)。
4. 选择TI1FP2的有效极性(捕获数据到TIM1_CCR2):置CC2P=1(下降沿有效)。
5.选择有效的触发输入信号:置TIM1_SMCR寄存器中的TS=101(选择TI1FP1)。
6. 配置触发模式控制器为复位触发模式:置TIM1_SMCR中的SMS=100。
7. 使能捕获:置TIM1_CCER1寄存器中CC1E=1, CC2E=1。
pwm输入捕获模式中断中,首先检查CC1IF和CC2IF寄存器是否为1,然后读取周期和占空比通过CCR1和CCR2寄存器。具体例子如下:
void Ir_Receive(void)
{
switch(IrRecStep)
{
case 0:
IrIndex = 0;
if ((TIM1_SR1_CC1IF == 1)&&(TIM1_SR1_CC2IF == 1)) //捕获完成,CC1IF.CC2IF为捕获标记
{
IrHigh = (uint)(TIM1_CCR2H);
IrHigh = (IrHigh << 8) + TIM1_CCR2L; //IrHigh占空比
IrCycle = (uint)(TIM1_CCR1H);
IrCycle = (IrCycle << 8) + TIM1_CCR1L; //IrCycle周期
//是否在引导码低电平范围内
if (((IrCycle - IrHigh) < IrHeadLow_Max)&&((IrCycle - IrHigh) > IrHeadLow_Min)) (低电平持续时间,即输入高电平时间)
{
IrRecStep = 1;
TIM1_SR1_CC1IF = 0;
TIM1_SR1_CC2IF = 0;
TIM1_SR2_CC1OF = 0;
TIM1_SR2_CC2OF = 0;
TIM1_SR1_UIF = 0;
IrRecBuff[0] = 0;
IrRecBuff[1] = 0;
IrRecBuff[2] = 0;
IrRecBuff[3] = 0;
}
}
break;
case 1:
if ((TIM1_SR2_CC1OF==1) || (TIM1_SR2_CC2OF==1) || (TIM1_SR1_UIF==1))//UIF位是中断更新位,CCIOF.CC2OF为重复捕获标记
{
IrRecStep = 0;
}
else
{
if ((TIM1_SR1_CC1IF == 1)&&(TIM1_SR1_CC2IF == 1))
{
IrHigh = (uint)(TIM1_CCR2H);
IrHigh = (IrHigh << 8) + TIM1_CCR2L;
IrCycle = (uint)(TIM1_CCR1H);
IrCycle = (IrCycle << 8) + TIM1_CCR1L;
//是否在引导码高电平范围内
if ((IrHigh < IrHeadHigh_Max)&&(IrHigh > IrHeadHigh_Min))
{
IrRecStep = 2;
}
}
}
break;
case 2:
if ((TIM1_SR2_CC1OF==1) || (TIM1_SR2_CC2OF==1) || (TIM1_SR1_UIF==1))
{
IrRecStep = 0;
}
else
{
if ((TIM1_SR1_CC1IF == 1)&&(TIM1_SR1_CC2IF == 1))
{
IrHigh = (uint)(TIM1_CCR2H);
IrHigh = (IrHigh << 8) + TIM1_CCR2L;
IrCycle = (uint)(TIM1_CCR1H);
IrCycle = (IrCycle << 8) + TIM1_CCR1L;
//周期是否在数据0范围内
if ((IrCycle > IrData00_Min)&&(IrCycle < IrData00_Max))
{
//高电平是否在数据0范围内
if ((IrHigh > IrData0_Min)&&(IrHigh < IrData0_Max))
{
IrIndex++;
}
else
{
IrRecStep = 0;
}
}
//周期是否在数据1范围内
else if ((IrCycle > IrData10_Min)&&(IrCycle < IrData10_Max))
{
//高电平是否在数据1范围内
if ((IrHigh > IrData1_Min)&&(IrHigh < IrData1_Max))
{
IrRecBuff[IrIndex >> 3] |= IrCode[IrIndex & 0x07];
IrIndex++;
}
else
{
IrRecStep = 0;
}
}
else
{
IrRecStep = 0;
}
if(IrIndex >= 32)
{
IrRecStep = 0;
IrRecFlag = 1;
}
}
}
break;
}
}
初始化及数据解析位于HT16C22工程。直接看文档操作寄存器还是更直接更明了,库函数总是朦朦胧胧,看似方便快捷,实则雾里看花。
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』