STM 32 입력 캡 처 모드

10741 단어 #stm32알고리즘
포획 모드 를 입력 하면 펄스 폭 을 측정 하거나 주파 수 를 측정 할 수 있 습 니 다.STM 32 의 타이머 에는 TIM 6 와 TIM 7 을 제외 한 다른 타이머 에는 입력 캡 처 기능 이 있다.STM 32 의 입력 포획, 쉽게 말 하면 TIMx 검 측 을 통 해CHx 의 가장자리 신 호 는 가장자리 신호 가 점프 (예 를 들 어 상승 선 / 하강 선) 할 때 현재 타이머 의 값 (TIMx CNT) 을 해당 채널 의 캡 처 / 비교 저장 (TIMx CCRx) 에 저장 하여 캡 처 를 완료 합 니 다.캡 처 시 인 터 럽 트 / DMA 실행 여부 등 도 설정 할 수 있 습 니 다.
   :    TIM5_CH1        ,                 ,          TIM5_CNT  。              ,       ,    ,      TIM5_CNT 。  ,    TIM5_CNT  ,        ,  TIM5           ,                 。

   TIMx_ARR TIMx_PSC,                TIMx     。

       /       1:TIMx_CCMR1,             ,    ;TIMx_CCMR1     2      ,   [7:0]    /    1   ,    [15:8]     /    2   ,  TIMx  CCMR2     ,      CCMR2       3   4(  《STM32    》290 ,14.4.8 )。

    TIM5   /    1,      TIMx_CMMR1 [7:0] (   8     )。

      /       :TIMx_CCER;

        DMA/       :TIMx_DIER,               ,        1       , CC1IE   1。

     :TIMx_CR1,           ,           ;

        /     1:TIMx_CCR1,             ,TIMx_CNT  ,   TIMx_CCR1       1       TIMx_CNT ,      (       ,       )   ,              。  

         (  TIM5 DIER   ) 

우리 가 잡 아야 할 것 은 고 레벨 신호 의 펄스 폭 이기 때문에 첫 번 째 캡 처 는 상승 선 이 고 두 번 째 캡 처 시 하강 선 입 니 다. 캡 처 상승 선 을 잡 은 후에 캡 처 가장자리 가 하강 선 으로 설정 해 야 합 니 다. 또한 펄스 폭 이 비교적 길 면 타이머 가 넘 치고 넘 치 는 것 을 처리 해 야 합 니 다. 그렇지 않 으 면 결과 가 정확 하지 않 습 니 다.이 두 가지 일 은 모두 중단 되 어 있 기 때문에 캡 처 중단 과 업데이트 중단 을 시작 해 야 합 니 다.
PWM 입력 캡 처 모드 1. 개념 이해 PWM 입력 캡 처 모드 의 특례 1. 각 타이머 에 네 개의 입력 채널 IC1, IC2, IC3, IC4 가 있 고 IC1 IC2 1 조, IC3 IC4 1 조 가 있 으 며 파이프 와 레지스터 의 대응 관 계 를 설정 합 니 다. 2. 두 개의 TI 출력 은 두 개의 ICx 신호 3 을 비 추 었 습 니 다. 이 두 개의 ICx 신 호 는 각각 반대 되 는 극성 가장자리 에서 유효 합 니 다.두 개의 사 이 드 신호 중 하 나 는 트리거 신호 로 선택 되 었 고 모드 컨트롤 러 에서 리 셋 모드 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 2, 프로 그래 밍 1, 프로그램 개요: TIM 3 를 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   112 




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  23 4     IC1 IC2 IC3 IC4   
32  TIM_ICSelection_IndirectTI    TIM  23 4     IC2 IC1 IC4 IC3   
33  TIM_ICSelection_TRC    TIM  23 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        

1, 회전:http://www.eeworld.com.cn/mcu/2015/1009/article_22791.html 2, 참조:http://blog.csdn.net/xiaoxiongli/article/details/49885675 http://blog.csdn.net/gtkknd/article/details/52846860 3. 작은 응용 프로그램:http://www.51hei.com/bbs/dpj-41774-1.html 4. 레지스터 의 원리 설명:http://blog.csdn.net/longintchar/article/details/43453393

좋은 웹페이지 즐겨찾기