This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

tiva怎样用定时器捕获脉宽



最好有例程


  • #include "sys.h"
    #include "usart.h"  
    #include "delay.h" 
    //#include "led.h" 
    //#include "key.h"
    //#include "exti.h"
    //#include "wdg.h"
    #include "timer.h"    


    u16   IC2Value;
    u16   DutyCycle;
    u16   Frequency;

    void PWM_Init(u16 arr,u16 psc);
    void Capture_Init(u16 arr,u16 psc);
    int  main(void)
    {
      Stm32_Clock_Init(9); //系统时钟设置
      delay_init(72);//延时函数初始化 
      uart_init(72,9600);
      PWM_Init(1500,72-1);  //不分频。PWM频率=72000/1440=5Khz 
      Capture_Init(2000,72-1); 
      while(1)
      {
       printf("suqingxiao\r\n");
      delay_ms(100);
      }
    }

    //PWM输出初始化
    //arr:自动重装值
    //psc:时钟预分频数
    void PWM_Init(u16 arr,u16 psc)
    {         
     //此部分需手动修改 IO口设置  
     RCC->APB2ENR|=1<<0;    //  
     RCC->APB1ENR|=1<<2;       //TIM4 时钟使能 
     RCC->APB2ENR|=1<<3;    //使能PORTB时钟 
       
     GPIOB->CRL&=0XF0FFFFFF;//PB6 输出  
     GPIOB->CRL|=0X0B000000;//复用功能输出       
     GPIOB->ODR|=1<<6;//PB6 上拉   
      
     TIM4->ARR=arr;//设定计数器自动重装值   
     TIM4->PSC=psc;//预分频器不分频 

     TIM4->CCMR1|=7<<4;  //CH1 PWM2模式      
     TIM4->CCMR1|=1<<3; //CH1 预装载使能       
     TIM4->CCER|=1<<0;  //OC1  输出使能      
     TIM4->CR1=0x0080;  //ARPE使能  

     TIM4->CR1|=0x01;    //使能定时器 3 

     TIM4->CCR1   = 500;  //占空比初值 =  1440*50% = 720                                       
    }


    void Capture_Init(u16 arr,u16 psc)
    {
     //此部分需手动修改 IO口设置  
     RCC->APB2ENR|=1<<0;    //  
     RCC->APB1ENR|=1<<0;       //TIM2 时钟使能 
     RCC->APB2ENR|=1<<2;    //使能PORTA时钟 
        
      TIM2->ARR=arr;  //设定计数器自动重装值//刚好1ms    
     TIM2->PSC=psc;  //预分频器,

     GPIOA->CRL&=0XFFFFFFF0;//PA0 输入  
     GPIOA->CRL|=0X00000004;//复用功能输入       
     GPIOA->ODR|=1<<0;//PA0 上拉
       
     TIM2->SMCR|=0x00D4; 
     //TIM2->SMCR|= 1<<5; //MSM=1 主/从模式 
     //TIM2->SMCR|= 5<<4; //TS=101 触发选择 
     //TIM2->SMCR|= 4<<0; //SMS=100 复位模式

     TIM2->CCMR1|=1<<0;//CC1S=01 选择输入端  
     TIM2->CCMR1|=3<<4; //IC1F=0011配置输入滤波器
     TIM2->CCER|=0<<1; //CC1P=0 选择有交转换边沿
     TIM2->CCMR1|=0<<2; //IC1PS=00 配置输入分频 
     TIM2->CCER|=1<<0; //CC1E=1 允许捕获计数器的值到捕获寄存器中

     TIM2->DIER|=1<<1;   //允许更新捕获中断    
         
     TIM2->CR1|=0x01;    //使能定时器2
       MY_NVIC_Init(1,3,TIM2_IRQChannel,2);//抢占1,子优先级3,组2          
    }

    //定时器2中断服务程序  
    void TIM2_IRQHandler(void)
    {                  
     IC2Value = TIM2->CCR1;//读取CCR1也可以清CC1IF标志位
     printf("IC2Value = %d\r\n",1000000/IC2Value);                     
     TIM2->SR&=~(1<<1);//清除中断标志位      
    }

  • 逗我吧 32的我也会啊