|
stm32f103 непонятки с таймером, частота прерываний на порядок ниже и фаза плавает |
|
|
|
Sep 2 2014, 20:23
|
Участник

Группа: Участник
Сообщений: 27
Регистрация: 11-05-10
Пользователь №: 57 193

|
Допустим, делаю генератор с частотой 5кГц, а получаю 454 Гц и фаза пляшет как хочет (смотрю осциллом). Других прерываний нет, таймеры остановлены. Библиотеки инициализации все раскопал, частоты тактирования AHB, APB1,2 правильные (72, 36 и 72 МГц соотв.). Из странно, TIM4_Struct.TIM_ClockDivision пробовал 1,2,4. Те же 454 Гц все равно. Подскажите плс., что за грабли. вот инициализация: Код TIM_TimeBaseInitTypeDef TIM4_Struct; TIM4_Struct.TIM_Prescaler = (7200)-1; //72M / 7200 => 100KHZ freq ...._rcc.c без прескалера, скорость двойная! (шина 36, но тактовая x2) TIM4_Struct.TIM_CounterMode = TIM_CounterMode_Up; TIM4_Struct.TIM_Period = (10); // TIM4_Struct.TIM_ClockDivision = TIM_CKD_DIV1; // TIM4_Struct.TIM_RepetitionCounter = 0; // играет роль только в таймерах 1 и 8 TIM_TimeBaseInit( TIM4 , &TIM4_Struct ); TIM_ITConfig( TIM4 , TIM_IT_Update , ENABLE ); // EI TIM_Cmd( TIM4 , ENABLE ); //Запуск таймера
// прерывания TIM4 NVIC_InitTypeDef NVIC_tim4; NVIC_tim4.NVIC_IRQChannel = TIM4_IRQn; NVIC_tim4.NVIC_IRQChannelPreemptionPriority = 1; NVIC_tim4.NVIC_IRQChannelSubPriority = 1; NVIC_tim4.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_tim4); Обработчик: Код void TIM4_IRQHandler(void) { TIM_ClearITPendingBit(TIM4, TIM_IT_Update); GPIOB->ODR ^= GPIO_Pin_8; //переворачиваю лапу } Больше никаких прерываний не включал
Сообщение отредактировал gena_p1 - Sep 3 2014, 07:12
|
|
|
|
|
Sep 3 2014, 06:54
|
Участник

Группа: Участник
Сообщений: 27
Регистрация: 11-05-10
Пользователь №: 57 193

|
Лапа в порядке, настроена на 50МГц, программка main() вида while(1){GPIOB->ODR ^= GPIO_Pin_8;}; выдает без проблем ~1.7МГц
Разобраться откуда прерывание можно, но их меньше, чем нужно, а не больше. Или есть вероятность замедления и пропуска прерываний из-за повторного входа?
Сейчас пересчитал на экселе: 72000000 тактовой / 7200 предделитель /10 период /2 период переворота ножки= 500 Гц (на счет 5кГц я ошибся, сути это не меняет).
Осцилл и мультиметр выдают 454 Гц вместо 500. Дергается это все добро, как будто не от кварца работает, и изменение поля TIM_ClockDivision не влияет на частоту, хотя по идее, должно.
|
|
|
|
|
Sep 3 2014, 07:11
|
Участник

Группа: Участник
Сообщений: 27
Регистрация: 11-05-10
Пользователь №: 57 193

|
Цитата(adnega @ Sep 3 2014, 11:07)  Его тоже бы на единичку уменьшить. Иначе 11 получается. Яростно лайкаю Ваш ответ, похоже так и есть! Специально "особые" величины ставил в скобки, чтобы от расчетной величины единицу отнять. Спасибо!
|
|
|
|
|
Sep 3 2014, 07:29
|
Частый гость
 
Группа: Участник
Сообщений: 121
Регистрация: 8-11-05
Пользователь №: 10 577

|
Цитата(gena_p1 @ Sep 3 2014, 02:23)  Допустим, делаю генератор с частотой 5кГц, а получаю 454 Гц и фаза пляшет как хочет (смотрю осциллом). Изначально указали неправильное значение частоты в 5кГц - это 5000Гц, а не 500Гц как вы хотели, то есть разница на порядок! А если разница всего в 6 Гц, то понятно же первым делом поиграться значением периода...
|
|
|
|
|
Sep 3 2014, 09:58
|
Участник

Группа: Участник
Сообщений: 27
Регистрация: 11-05-10
Пользователь №: 57 193

|
Мы имеем дело с синхронной системой, с кварцевой стабилизацией. Все разбросы известны, на сколько я понял (вход в прерывание 7 тактов и т.п.). Прерывание системного таймера отключаемое (нашел пару рецептов на зарубежных сайтах, там тоже и ложные срабатывания и косяки с длительностью нахождения и т.п.), будет крутиться как счетчик и опрашиваться, если надо. По идее, если разработка не требует 100% загрузки, то можно сделать синхронную систему, выключив все лишнее. И прерыванием обойтись одним - по таймеру. Остальное опросом готовности. У таймеров есть синхронизация, так, что если надо, чтобы "играли в долю" , все вполне конфигурируемо. А если нет, то я ошибся платформой и, видимо, буду подбирать что-то другое. Цитата(kostyan @ Sep 3 2014, 12:29)  А кстати да, выход шим настроить на меандр совсем не вариант? Кое что надо опрашивать с частотой не менее 1кГц. Частоту и стабильность проверял через дерганье лапой. Да и ШИМ будет через одно место, если таймер криво настроен.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|