×
嵌入式 > 技术百科 > 详情

stm8系列输入捕获

发布时间:2020-06-12 发布时间:
|

输入捕获分为两种,一种是正常的输入捕获,当检测到输入信号的边沿后,计数器的当前值被锁存到捕获/比较寄存器(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工程。直接看文档操作寄存器还是更直接更明了,库函数总是朦朦胧胧,看似方便快捷,实则雾里看花。



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
分布式光纤温度传感器(DTS)系统的应用