原创 TIMx 的PWM波输入,ST的TIMx example6

2008-4-14 20:43 3334 3 5 分类: MCU/ 嵌入式




TIMx 的PWM波输入用于检测输入PWM波形的duty cycle 和频率。


一个TIMx含有4个CCR寄存器(compare capture register),Example6中,TIM2被用于检测输入波形,使用到了2个CCR,CCR1用于记录整个周期的计数,CCR2用于记录高电平的计数。CCR1由高电平触发,而CCR2由低电平触发。


点击看大图


其中一个TIxFP信号被作为触发输入信号,并且从模式控制器被配置成复位模式。


int main(void)
{  /* System Clocks Configuration */
  RCC_Configuration();
      
  /* NVIC configuration */
  NVIC_Configuration();         //打开TIM2的中断


  /* Configure the GPIO ports */
  GPIO_Configuration();        


//  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;


  /* TIM2 configuration: PWM Input mode ------------------------
     The external signal is connected to TIM2 CH2 pin (PA.01),
     The Rising edge is used as active edge,
     The TIM2 CCR2 is used to compute the frequency value
     The TIM2 CCR1 is used to compute the duty cycle value
  ------------------------------------------------------------ */


 TIM_ICInitStructure.TIM_ICMode = TIM_ICMode_PWMI;         //2种input compare模式:PWM & input  capture mode  
  TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;          
  TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;             //input signal active edge: rising edge
  TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;      
//TIM Input 2, 3 or 4 are selected to be connected respectively to IC1 or IC2 or IC3 or IC4.
  TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;      


//TIM Capture performed each time an edge is detected on the capture input.
  TIM_ICInitStructure.TIM_ICFilter = 0x0;             //input filter, the value can be 0~0xF, when toggle,the input signal maybe not stable, so we can ignore n cycles
 
  TIM_ICInit(TIM2, &TIM_ICInitStructure); 


  /* Select the TIM2 Input Trigger: TI2FP2 */
  TIM_SelectInputTrigger(TIM2, TIM_TS_TI2FP2);     //Selects the TIMx Input Trigger source. TIM2 filtered timer input2


  /* Select the slave Mode: Reset Mode */
  TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset);
 //Rising edge of the selected trigger signal (TRGI) reinitializes the counter and triggers an update of the registers.
  /* Enable the Master/Slave Mode */
  TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_Enable);
 
  /* TIM enable counter */
  TIM_Cmd(TIM2, ENABLE);


  /* Enable the CC2 Interrupt Request */
  TIM_ITConfig(TIM2, TIM_IT_CC2, ENABLE);         //set the Capture/Compare 2 as the interrupt source
 //一个TIM有4个CC Registers


  while(1);     
}


中断程序:


void TIM2_IRQHandler(void)
{ // CCR1 是整个周期的计数值,CCR2是高电平的计数值
  /* Clear TIM2 Capture compare interrupt pending bit */
  TIM_ClearITPendingBit(TIM2, TIM_IT_CC2);
 
  /* Get the Input Capture register CCR2 value */
  IC2_Value = TIM_GetCapture2(TIM2);       
 
  if(IC2_Value != 0)
  {
    /* Duty cycle computation */
    Duty_Cycle = (TIM_GetCapture1(TIM2) * 100) / IC2_Value;   // duty cycle = CCR1/CCR2


    /* Frequency computation */
    Frequency = 72000000 / IC2_Value;
  }
  else
  {
    Duty_Cycle = 0;
    Frequency = 0;
  }
}

文章评论2条评论)

登录后参与讨论

用户1337079 2008-8-26 16:01

请问这个程序可以正常运行吗? 我在仿真时,可以进中断,但是CCR2是空的???

用户1337079 2008-8-26 16:01

请问这个程序可以正常运行吗? 我在仿真时,可以进中断,但是CCR2是空的???
相关推荐阅读
用户1359586 2011-07-07 11:49
一个简单字符驱动
网上常见的一个linux字符驱动,见 http://www.dzsc.com/data/html/2009-5-31/76528.html insmod test.ko lsmod      就可...
用户1359586 2010-05-14 22:38
FPGA自己产生reset
遇到一个FPGA没有外部的reset,只能自己产生了,这么简单一个问题居然想了很久才实现。在modelsim仿真是对的,还没有实际操作,也希望和大家讨论一下module reset_generatio...
用户1359586 2010-05-10 22:27
SRAM的时序约束
http://blog.ednchina.com/ilove314/198969/message.aspx#85821  读SRAM时序约束分析分析了SRAM的IO计算,但是没有讲如何具体的计算和Ti...
用户1359586 2010-04-07 21:09
CCS6000安装问题
http://bbs.21ic.com/icview-39374-1-1.html在安装CCS6000的时候,运行ccs6000.exe的时候,碰到好几机子都装不上。主要问题是在安装到“compone...
用户1359586 2010-01-13 21:15
matlab 函数:sprintf
for i="1:20"     j="sprintf"('%03d',i)endj =001j =002j =003j =004j =005j =006j =007j =008j =009j =01...
用户1359586 2009-09-29 09:54
有着十三亿人众的孔孟之乡没有一个教育家
   耶鲁大学校长 小贝诺.施密德特  曾任耶鲁大学校长的小贝诺?施密德特,日前在耶鲁大学学报上公开撰文批判中国大学,引起了美国教育界人士对中国大学的激烈争论。 对中国大学近年来久盛不衰的“做大做强”...
我要评论
2
3
关闭 站长推荐上一条 /2 下一条