2017-03-24 3 views
0

내 프로세서를 제어하기 위해 타이머가 사용 STM32F437ZGT6이고 I는 두 개의 다른 펄스 트레인 (RPM)를 계산하기 바란다. 범위가 상당히 넓어서 150 rpm으로 공회전하는 엔진이있을 수 있으며 캠에서 펄스를 얻을 수 있으므로 0.5 펄스/초 또는 1.25 펄스/초입니다. 다른 극단에서는 초당 23000 펄스 인 3000 rpm으로 460 개의 플라이휠 치아를 계산해야 할 수도 있습니다. 나는 외부 이벤트를 최대 8 개까지 나눌 수 있도록 프리스케일러를 사용할 수 있지만 모든 이벤트 또는 8 개의 이벤트가 인터럽트를 유발하기 때문에 더 빠른 속도로 너무 강렬해진다. 내가 것 고려하고STM32F4 - 비 인접 타이머

하나의 대안은 하나 개의 타이머 시계와 같은 외부 이벤트를 사용해야하고 그것은 단지 시간 창 내에서 이벤트를 계산한다. 내 어려움은 CEN 또는 유사한 동작을 설정 및 지움으로써 다른 타이머를 사용하여 창을 제어하는 ​​방법을 결정할 때 발생합니다. RM0090에서

는 섹션 18.3.15 타이머 동기화 예는 다른 제어를 하나의 타이머는 타이머 1 개의 타이머 제어를 나타낸다. 나는 그것이 쓸모 있을지도 모른다라고 생각했다. 그러나 내가 그렇지 않다면 나는 2 명의 타이머가 짝을 지을 수 있었다는 것을 알지 않는다. 관심있는 신호는 실제로 두 개의 타이머를 공급합니다. TIM1 ch1 및 TIM9 ch1. 나는 하나의 타이머 ISR이 떨어져 화재가 다음 ISR이 열리고 시간 창을 닫 일부 루브 골드버그 방식을 자갈하지 않는

모든 제안을 감상 할 수있다.

I는 룩업 테이블은 예상되는 엔진 회전 수 및 회전 당의 펄스 수를 제공하는 제공되는 것을주의해야.

감사합니다, JH

답변

0

당신은 단지 외부 이벤트를 계산하려면, 당신은 타이머 외부 클럭 소스를 선택할 수 있습니다. (참조 매뉴얼의 "클럭 선택"을 참조하십시오). SPL에 예제가 있어야합니다. 그리고 필요할 때마다 Tim CNT 레지스터에서 카운트를 읽습니다. 여기에서 문제는 카운트를 자주 읽는 것입니다.

보통 자동 리로드 레지스터는 오버 플로우 전에 2^16 카운트에 그래서 2 바이트이며, 값을 계산 잃어버린. 타이머 2와 5는 자동 재로드 레지스터가 4 바이트이므로 최대 2^32 카운트가 있습니다. - 타이머 폭포, 서로에 대한 클럭으로 하나의 타이머 이벤트를 설정하여

: 더 후 2^32 카운트가 필요한 경우

당신은 적어도 두 가지 방법이있다. 참조 설명서에서 "하나의 타이머를 다른 타이머의 프리스케일러로 사용"에서 찾을 수 있습니다. 계단식 연결은 최대 2^64 타이머를 제공합니다. "TIM_CascadeSynchro"폴더에 SPL에 대한 예제가 있습니다. - 덜 아름답지만 더 쉬운 방법은 카운터 변수를 만들고 타이머 irq 처리기에서 카운터 변수를 증가시키는 것입니다. 카운트 수는 cnt_variable * TIMx-> ARR입니다. 여러 계단식 변수가 무제한 카운터를 제공합니다.

+0

게시 주셔서 감사합니다. 이벤트를 계산하기 위해 외부 클럭 소스를 선택하는 것에 동의하지만 타이머가 카운트 할 수있는 시간을 정확하게 제어하는 ​​방법을 알아야합니다. 예를 들어, 게이트를 선택하거나 원하는 시간만큼 껐습니다. 는 I 다른하는 precaler 또는 컨트롤러에 대해 하나의 타이머를 이용하여 상기 부분을 읽을 수 있지만 예에서는 타이머 (1) 및 (2) 내가 교인 슬레이브와 같은 임의의 세트를 사용하는 방법을 볼 수있다 이용한다. 다시 게시 해 주셔서 감사합니다. JH – user2579721

+0

마침내 표 97을 발견했습니다. RM0090의 TIMx 내부 트리거 연결과 제한된 마스터 채널 선택이 있습니다. 따라서 내 회로 중 하나가 정상적으로 작동 할 수 있으며 다른 동일한 회로는 다시 레이아웃해야합니다. – user2579721

+0

확인. 만약 당신이 특정 시간 창에서만 외부 사건을 세어야한다는 것을 이해한다면? 다음과 같이 권하고 싶습니다. 위에서 설명한 것처럼 하나의 타이머를 외부 이벤트의 카운터로 사용하십시오. 두 번째 타이머 출력 비교 채널을 사용하여 첫 번째 타이머를 활성화합니다. 이것은 RM0090의 "18.3.15 Timer synchronization"절에서 "하나의 타이머를 사용하여 다른 타이머를 활성화"에서 찾을 수 있습니다. 작업을 해결하는 더 좋은 방법이있을 수 있지만 먼저 더 자세히 설명해야합니다. – Yuriy

0

게시물 주셔서 감사합니다. 나는 약간의 세부 사항을 추가하려고 노력할 것이다. RPM 1은 TIM3 ch2 및 TIM4 ch1에 공급됩니다. RPM 2는 TIM1 ch1 및 Tim9 ch1에 공급됩니다. 두 제품 모두 초 당 1.25 펄스 범위에서 초당 최대 30000 펄스를 나타냅니다. 나는 1 회전 당 펄스의 수를 0.5에서 460까지 그리고 예상되는 엔진 rpm, 150에서 3000 rpm으로 줄 수 있기 때문에 약간의 스케일을 조정할 수 있습니다. 두 개의 서로 다른 타이머에 공급하는 이유는 속도 (초당 펄스)에 따라 다른 계산 기법을 사용할 수 있기 때문입니다. 저속의 경우 이벤트 (펄스)를 캡처하고 ISR을 사용하여 타이머 수를 얻을 수 있습니다. 그러나 펄스 수가 높아지면 다른 방법을 사용하여 채널당 초당 1000 개 이상의 인터럽트가 발생하지 않도록하고 싶습니다. 그래서 제 생각에는 다른 타이머를 하나의 타이머로 제어하는 ​​것입니다.하나의 타이머는 인터럽트를 생성하지 않고 이벤트를 단순히 카운트합니다. 두 번째 카운터는 첫 번째 타이머가 이벤트를 수집 할 수있는 기간을 제어합니다.

감사합니다,

0

당신처럼 보인다 JH이 필요합니다 마스터 타이머의 트리거 출력에 따라 슬레이브 타이머를 활성화/비활성화와 타이머 동기화를. 설명 RM0090의 다음 섹션에서 찾을 수있다 :

  • 18.3.14 타이머 단락 슬레이브 모드에서 외부 트리거 동기 : 정문 모드
  • 18.3.15 타이머 동기화 단락 에서 하나의 타이머를 사용하여 다른 타이머 활성화하기

TIMx registe에서도 좋은 설명을 찾을 수 있습니다. 레지스터 TIMx_SMCR 대한 R 섹션 : TS와 SMS 비트; TIMx_CR2 : 비트 MMS.

TIMx 내부 트리거 연결 (표 93, 97 및 100)은 하나의 타이머의 트리거 출력과 다른 입력의 가능한 입력을 연결합니다. 당신이 마스터로 사용할 수있는 타이머는 아래 그림에 표시됩니다 : SPL 라이브러리에서 enter image description here

TIM_ExtTriggerSynchro 예는 코드 복사 - 붙여 넣기 사용할 수 있습니다.

나는 가장 좋은 방법은 생각 : 슬레이브 타이머 외부 클럭 소스로

  1. 설정 RPM 핀.
  2. 마스터 타이머의 출력 비교에서 슬레이브 타이머의 활성화/비활성화를 설정합니다. 따라서 TIMx_CCRx 레지스터 값을 변경하면 측정 기간을 변경할 수 있습니다.
  3. 설정 마스터 타이머는 (아마도 몇 가지 이벤트 TIMx_RCR 레지스터에) 업데이트 이벤트를 중단합니다. 그냥 RPM 카운터와 같은 16 비트 타이머를 사용할 수있는

은 또한이 날 것으로 보인다 마스터 타이머 인터럽트 핸들러의 모든 계산을 수행합니다. 30000 펄스라도 2^16/30000 = 2,18 초마다 오버 플로우가 발생하며 이는 STM32F4 클럭 주파수에서는 드물게 발생합니다. 그리고 다른 타이머를 사용하십시오. 예를 들어, 계산을 위해 2 초의주기를 사용하십시오.

행운을 빈다.