2017-03-27 10 views
-1

나는 DAC 사인파 발생을 운전하는 STM32f3 발견 널에 타이머 8을 사용하고있다. 다음은 타이머 구성입니다.STM32F303VC 부정확 한 타이머 시계

TIM_TimeBaseInitTypeDef timer; 

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE); 

TIM_TimeBaseStructInit(&timer); 
timer.TIM_CounterMode = TIM_CounterMode_Up; 
//Setting prescaler so that timer clock will be only 64000Hz 
timer.TIM_Prescaler = 1125; 
//Setting period so Timer will give signal of frequency 1000Hz 
timer.TIM_Period = 10; 
TIM_TimeBaseInit(TIM6, &timer); 

//generate event when counter hits TIM_period value 
TIM_SelectOutputTrigger(TIM6, TIM_TRGOSource_Update); 

/* TIM2 enable counter */ 
TIM_Cmd(TIM6, ENABLE); 

클럭이 72MHz라고 가정합니다. I가 정현파 frequeency 측정하면

는 대신 100Hz에서의 90 Hz의를 나타낸다. 내가 다시 APB1 클럭의 클록 주파수를 계산할 때, 그것은 매우 이상하게 보이는 64.8MHz와 동일하다는 것을 알 수있다. lcock 구성 설정과 관련하여 아무 것도 변경하지 않았으며 모든 것이 기본값입니다.

시스템 클럭의 코어 (RCC_GetClocksFreq 명령을 사용하여 검사)는 Crystal 같습니다.

어디에서 발생했는지 알 수 있습니까?

+0

_ "클럭이 72MHz와 같다고 가정합니다."_ 정말로 알아야 할 필요가 있습니다. PLL을 이와 같이 구성한 경우 72MHz _only_이고 정확한 외부 발진기를 사용하는 경우 _only_입니다. 내부 HSE RC 발진기는 폭이 다양하며 온도 안정성이 없습니다. 표준 CMSIS 시작 코드를 사용하는 경우, PLL은 system_stm32f3xx.c'SystemInit()'에 구성됩니다. 그리고 _nominal_ 클럭 주파수는 전역'SystemCoreClock'에 저장 될 것입니다. – Clifford

+0

다른 클록 구성으로의 이식성을 위해 ABP1 클럭 주파수보다 더 나은 "SystemCoreClock"또는 더 나은 점으로 프리스케일러를 계산하는 것이 좋습니다. – Clifford

답변

1

당신이 소스로 HSI 클럭을 사용하는 경우, 여기에 문제가 있습니다.

HSI 시계는 정확하지 않습니다 및 + 달라질 수 있습니다 - 적어도 10 %.

의견을 보내주십시오.

Timer count clock = timer_input_clock/(prescaler_value + 1) 

귀하의 케이스 (10)의 기간으로

72000000/1126 = 63943Hz 

당신이 얻을 :

tim_overflow_period = tim_clock/(period + 1) 

를 귀하의 경우

63943/11 = 5813 

에 당신이 1124과 기간에 프리스케일러를 설정하는 경우 9, 당신은 더 나은 결과를 얻을 것이다.

timer_clock = 72000000/(1124 + 1) = 64000 
timer_overflow = 64000/(9 + 1) = 6400 

DAC 출력 신호가 64 개 샘플입니까? 나는 그것을 위해 DMA를 사용한다고 생각합니다.

그렇다면, 당신은 외부 오실레이터이있는 경우, 100Hz의를 얻어야한다, 그렇지 않으면 당신은하지 않을 수 있습니다. HSI 오실레이터 보정에 관한 어플리케이션 노트를 확인하십시오.

+0

탐색 보드에 크리스탈이 있어야합니다. – LPs

+0

수정하십시오. 하지만 소프트웨어로 활성화 했습니까? – tilz0R

+0

질문하지 않습니다;) – LPs