zoukankan      html  css  js  c++  java
  • STM32学习笔记3(TIM通用模块输入捕获)

    PWM 输入捕获模式< xmlnamespace prefix ="o" ns ="urn:schemas-microsoft-com:office:office" />

    一、概念理解

    PWM输入捕获模式时输入捕获模式的特例

    1、每个定时器有四个输入通道IC1IC2IC3IC4,IC1 IC2一组,IC3 IC4一组,并可是设置管脚和寄存器的对应关系

    2、两个TI输出映射了两个ICx信号

    3、这两个ICx信号分别在相反的极性边沿有效

    4、两个边沿信号中的一个被选为触发信号,并且从模式控制器被设置成复位模式

    5、当触发信号来临时,被设置成触发输入信号的捕获寄存器,捕获“一个PWM周期(即连续的两个上升沿或下降沿)”,他等于包含TIM时钟周期的个数(即捕获寄存器中捕获的为TIM的计数个数n

    6、同样另一个捕获通道捕获触发信号和下一个相反极性的边沿信号的计数个数m,即(即高电平的周期或低电平的周期)

    7、由此可以计算出PWM的时钟周期和占空比

    Frequency=f(TIM时钟频率)/n

    Duty cycle =(高电平计数个数)/n

    m为高电平计数个数,则duty cycle=m/n;

    m位低电平计数个数,则duty cycle=(n-m)/n

    注:因为计数器为16位,所以一个周期最多计数65535个,所以测得的最小频率=TIM时钟频率/65535

    二、程序设计

    1、程序概述:选择TIM3作为PWM输入捕获。IC2设置为上升沿,并设置为有效的触发输入信号,所以IC2的捕获寄存器捕获PWM周期01  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟配置 
    02  RCC_APP2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); 
    03   
    04  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;    //GPIO配置 
    05  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 
    06  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
    07  GPIO_Init(GPIOA, &GPIO_InitStructure); 
    08   
    09  NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //NVIC配置 
    10  NVIC_InitStructure.NVIC_IRQChannePreemptionPriority = 0; 
    11  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; 
    12  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 
    13  NVIC_Init(&NVIC_InitStructure); 
    14   
    15  TIM_ICInitStructure.TIM_Channel = TIM_Channel_2; //通道选择 
    16  TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿触发 
    17  TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //管脚与寄存器对应关系 
    18  TIM_ICInitStructure.TIM_ICPSC_DIV1;//输入预分频,意思是控制在多少个输入周期做一个捕获,如果输入的信号频率没有变,测得的周期也不会变,比如选择四分频,则没四个输入周期做一次捕获,这昂再输入信号不频繁的情况下,可以减少软件被不断中断的次数 
    19   
    20  TIM_ICInitStructure.TIM_ICFiter = 0x0; //滤波设置,经历几个周期跳变认定波形稳定0x0-0xf; 
    21  TIM_PWMIConfig(TIM3, &TIM_ICInitStructure); //根据参数配置TIM外设信息 
    22  TIM_SelectInputTrigger(TIM3, TIM_TS_TI2FP2); 
    23  TIM_SelectMasterSalveMode(TIM3, TIM_MasterSlaveMode_Enable); 
    24  TIM_Cmd(TIM3, ENABLE); 
    25  TIM_ITConfig(TIM3, TIM_IT_CC2, ENABLE); 
    26   
    27  void TIM3_IRQHandler(void) 
    28  { 
    29      TIM_CLearITPendingBit(TIM3, TIM_IT_CC3); 
    30      IC2Value = TIM_GetCapture2(TIM3); 
    31      if(IC2Value != 0) 
    32      { 
    33          DutyCyle = (TIM_GetCapture1(TIM3) * 100) / IC2Value; 
    34          Frequency = 72000000 / IC2Value; 
    35      } 
    36      else 
    37      { 
    38          DutyCycle = 0; 
    39          Frequency = 0; 
    40      } 
    41   
    42  } 
    43   
    44  注(一):若想改变测量的PWM频率范围,可将TIM时钟频率做分频处理 
    45   
    46  TIM_TimeBaseStructure.TIM_Period = 0xFFFF;     //周期0~FFFF 
    47  TIM_TimeBaseStructure.TIM_Prescaler = 5;       //时钟分频,分频数为5+1即6分频 
    48  TIM_TimeBaseStructure.TIM_ClockDivision = 0;   //时钟分割 
    49  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//模式 
    50  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);//基本初始化 
    51  注注(二):定时器TIM的倍频器X1或X2。在APB分频为1时,倍频值为1,否则为2 

    ICInitStructre结构体的定义

    01  typedef struct 
    02  { 
    03      u16 TIM_ICMode; 
    04      u16 TIM_Channel; 
    05      u16 TIM_ICPolarity; 
    06      u16 TIM_ICSelection; 
    07      u16 TIM_ICPrescaler; 
    08      u16 TIM_ICFilter; 
    09  } TIM_ICInitTypeDef; 
    10   
    11   
    12   
    13  TIM_ICMode定义 
    14  TIM_ICMode_ICAP    TIM使用输入捕获模式 
    15  TIM_ICMode_PWM1    TIM使用输入PWM模式 
    16   
    17  TIM_Channel 
    18  TIMChannel选择通道 
    19  TIM_Channel_1    使用TIM通道1 
    20  TIM_Channel_2    使用TIM通道2 
    21  TIM_Channel_3    使用TIM通道3 
    22  TIM_Channel_4    使用TIM通道4 
    23   
    24  TIM_ICPolarity 
    25  TIM_ICPolarity输入活动沿 
    26  TIM_ICPolarity_Rising    TIM输入捕获上升沿 
    27  TIM_ICPolarity_Falling    TIM输入捕获下降沿 
    28   
    29  TIM_ICSelection 
    30  TIM_ICSelection选择输入 
    31  TIM_ICSelection_DirectTI    TIM输入2,3或4选择对应的IC1或IC2或IC3或IC4相连 
    32  TIM_ICSelection_IndirectTI    TIM输入2,3或4选的对应与IC2或IC1或IC4或IC3相连 
    33  TIM_ICSelection_TRC    TIM输入2,3或3选择与TRC相连 
    34   
    35  TIM_ICPrescaler 
    36  TIM_ICPSC_DIV1    TIM捕获在捕获输入行每探测到一个边沿执行一次 
    37  TIM_ICPS_DIV2        TIM捕获每2个事件执行一次 
    38  TIM_ICPS_DIV3        TIM捕获每3个事件执行一次 
    39  TIM_ICPS_DIV4        TIM捕获每4个事件执行一次 

  • 相关阅读:
    arclinux安装报错unknown trust
    linux微型主机服务器配置
    spring data jpa + hibernate
    又纠结activiti
    comet4j
    shiro纠结之旅
    ubuntu更改jdk版本的问题
    struts上传
    java实现四则运算
    6 个重构方法可帮你提升 80% 的代码质量(转)
  • 原文地址:https://www.cnblogs.com/dustinzhu/p/3886768.html
Copyright © 2011-2022 走看看