Argon (09.07.2014 19:03 - 19:23, просмотров: 2551)
STM32F2: по какой причине частота PWM может отличаться от расчетной? Вот такая у меня инициализация
T9Freq = 10000000; //близкая к желаемой частота инкремента таймера
/* Compute the prescaler value */
PrescalerValue = (uint16_t) (((&rcc_clocks)->SYSCLK_Frequency) / T9Freq) - 1; //
//пересчет реальной частоты с учетом округления предделителя
T9Freq = ((&rcc_clocks)->SYSCLK_Frequency)/(PrescalerValue + 1);
T9Period = (T9Freq*10/36000 + 5)/10; // период апдейта таймера ~36 кГц с округлением.
/* Time base configuration */
TIM_TimeBaseStructure.TIM_Period = T9Period;
TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM9, &TIM_TimeBaseStructure);
/* PWM1 Mode configuration: Channel1 */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = T9Period/2;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM9, &TIM_OCInitStructure);
TIM_OC2Init(TIM9, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM9, TIM_OCPreload_Enable);
TIM_ARRPreloadConfig(TIM9, ENABLE);
Внешний кварц имею: 11059200 Гц,
частота системного клока 59788800 Гц.
предделитель TIM9: 4
Реальная частота TIM9 11957760 Гц (ну это с учетом целочисленного вычисления предделителя)
Период T9Period = 332
Итого частота ШИМ должна быть 11957760/332 = 36017 Гц.
Тремя разными частотомерами меряется что-то около 35800 Гц.
Частотомеры не прецизионные, можно было бы сказать, врут. Но занижают - все 3! Здесь причина где-то в другом. Но где?