历史上的今天
返回首页

历史上的今天

今天是:2024年10月10日(星期四)

正在发生

2018年10月10日 | stm8系列输入捕获

2018-10-10 来源:eefocus

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


推荐阅读

史海拾趣

Benchmarq Microelectronics Inc公司的发展小趣事

在半导体行业中,供应链的稳定性和可靠性对企业的发展至关重要。Benchmarq Microelectronics Inc深知这一点,因此始终注重供应链管理和合作伙伴关系的建立。公司与多家知名供应商建立了长期稳定的合作关系,确保原材料的稳定供应和质量可控。同时,公司还加强库存管理和物流配送,确保产品能够及时、准确地送达客户手中。这些努力不仅提升了公司的运营效率和市场竞争力,还为客户提供了更加便捷、高效的服务。

国炬(GOOGLL)公司的发展小趣事
相比其他功放电路,OCL电路的结构更为简单,有利于实现集成化。
Fractus公司的发展小趣事

1999年,Carles Puente博士和Ruben Bonet联合创立了Fractus公司,致力于将几何结构天线技术商业化。公司成立之初便取得了重大突破,获得了全球首个分形天线和多重分形天线专利。这些专利不仅展示了Fractus在天线设计领域的领先地位,也为公司后续的发展奠定了坚实的技术基础。

Emhiser Research Inc公司的发展小趣事

Emhiser Research在成立之初就专注于半导体技术的研究。随着市场对更高效能、更小体积的芯片需求的增长,公司研发团队成功开发出了一种新型的高性能低功耗芯片。这一技术突破迅速吸引了众多手机厂商和电子设备制造商的关注。Emhiser抓住这一市场机遇,与多家大型企业建立了合作伙伴关系,其产品迅速在市场上占据了一席之地。

德立电子(DDY)公司的发展小趣事

随着电子行业的快速发展,德立电子意识到技术创新的重要性。公司加大研发投入,不断推出高频贴片绕线电感、立式电感、磁环电感等新产品,满足市场多样化需求。同时,德立电子还注重知识产权保护,申请多项专利,确保技术领先。

EREM公司的发展小趣事

作为一家具有社会责任感的企业,EREM始终关注环境保护和可持续发展。在生产过程中,EREM严格遵守环保法规和标准,采用环保材料和工艺,减少对环境的影响。此外,EREM还积极参与公益活动和社会责任项目,为社会做出积极贡献。这些举措不仅提升了公司的社会形象,也为公司的长期发展奠定了坚实基础。

请注意,以上故事均为虚构,旨在展示EREM公司在电子行业中的发展历程和可能面临的挑战与机遇。如需了解更多关于EREM公司的信息,请查阅相关官方资料或咨询行业专家。

问答坊 | AI 解惑

您认为手机漫游费应该尽快取消吗?

大家可能对315晚会上的现场投诉统计记忆犹新,电信服务类的投诉仍然居各类服务行业投诉的首位。当然,经过多年的时间,在广大用户、消费者协会和媒体不懈努力下,电信服务已经有了诸多改善,如运营商取消了服务协议中的霸王条款、降低资费、话费余 ...…

查看全部问答>

ICL7135C,TLC7135C

ICL7135C,TLC7135C芯片简单介绍…

查看全部问答>

天津月薪9K的人用什么样的手机...[图]

哈哈,看看天津月薪9K的人用什么手机 嘿嘿,今天朋友过来,给逮了个特写,月薪9K人用的手机,哈哈...(绝对属实咯)…

查看全部问答>

大家帮忙!51+L298+步进电机!为什么不转圈?

电路图 程序代码 #include #include \"18b20.h\" sbit P10 = P1^0; sbit P11 = P1^1; sbit P12 = P1^2; sbit P13 = P1^3; sbit P14 = P1^4; sbit P15= P1^5; void Delay_50ms(unsigned int aiDelay) {    unsigned int&nb ...…

查看全部问答>

电源基础知识DC-DC 47页.ppt

file:///C:/DOCUME%7E1/ADMINI%7E1/LOCALS%7E1/Temp/moz-screenshot.pngfile:///C:/DOCUME%7E1/ADMINI%7E1/LOCALS%7E1/Temp/moz-screenshot-1.png…

查看全部问答>

Altium Designer 09软件学习资料

Altium Designer 软件学习资料…

查看全部问答>

vxworks能否编出动态库,即可否生成.so文件

vxworks能否编出动态库,即可否生成.so文件? 我在使用两种编译环境tornado2.2 和 Wind River。先前我们编库时都是编写静态库(.a文件),最近我找到了一个(动态库文件.so),但不知道如何生成动态库,请高手赐教!哪一种编译环境下都可以的。谢谢!…

查看全部问答>

哪些寄存器提供偏移地址

请问,哪些寄存器提供偏移地址?除了指令指针寄存器以外,不好意思哦,我是学软件的,对硬件不了解,希望各位解答一下~!…

查看全部问答>

关于 wifi 配置程序的问题

问题描述: wince5.0 wifi模块正常工作,启动时wifi配置对话框弹出,链接后能正常工作 ,现在我们的要求是去掉explorer.exe ,直接启动我们的界面程序,任务条没有了 ,托盘没有了 ,配置对话框也不弹出来了 ? 问题: 如何在我们的界面程序中 ...…

查看全部问答>

wince下CoCreateInstance失败

原来做的项目用的图是bmp的,图多比较大,想换成png格式的. 所以下了个CCePngButtonST控件. 但是调用SetImage()时,却总是失败.因为CoCreateInstance()不成功. CoInitializeEx(NULL,COINIT_MULTITHREADED); //initialize com ,就是下面这句不成 ...…

查看全部问答>