Перейти к содержанию
    

stm32f103 непонятки с таймером

Допустим, делаю генератор с частотой 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для начала вставьте проверку флага в обработчик прерывания:

if(TIM_GetITStatus(TIM4, TIM_IT_Update) == SET)
{
    TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
    GPIOB->ODR ^= GPIO_Pin_8;
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для начала вставьте проверку флага в обработчик прерывания:

Похоже эта фраза, так часто повторяемая здесь, скоро станет присказкой, типа "Вы пробовали включить-выключить?"©

 

Неужели в книжках так учат? Или в Интернете? Или это последствия перехода с AVR?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Лапа в порядке, настроена на 50МГц, программка main() вида while(1){GPIOB->ODR ^= GPIO_Pin_8;}; выдает без проблем ~1.7МГц

 

Разобраться откуда прерывание можно, но их меньше, чем нужно, а не больше. Или есть вероятность замедления и пропуска прерываний из-за повторного входа?

 

Сейчас пересчитал на экселе: 72000000 тактовой / 7200 предделитель /10 период /2 период переворота ножки= 500 Гц (на счет 5кГц я ошибся, сути это не меняет).

 

Осцилл и мультиметр выдают 454 Гц вместо 500. Дергается это все добро, как будто не от кварца работает, и изменение поля TIM_ClockDivision не влияет на частоту, хотя по идее, должно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

еужели в книжках так учат? Или в Интернете? Или это последствия перехода с AVR?

Да-да... молодёжь уже не та......

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 период

Его тоже бы на единичку уменьшить. Иначе 11 получается.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Его тоже бы на единичку уменьшить. Иначе 11 получается.

 

Яростно лайкаю Ваш ответ, похоже так и есть! Специально "особые" величины ставил в скобки, чтобы от расчетной величины единицу отнять.

Спасибо!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Допустим, делаю генератор с частотой 5кГц, а получаю 454 Гц и фаза пляшет как хочет (смотрю осциллом).

 

Изначально указали неправильное значение частоты в 5кГц - это 5000Гц, а не 500Гц как вы хотели, то есть разница на порядок!

А если разница всего в 6 Гц, то понятно же первым делом поиграться значением периода...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Дергается это все добро, как будто не от кварца работает, и изменение поля TIM_ClockDivision не влияет на частоту, хотя по идее, должно.

меня немного смущает желание чтобы нога выставляемая в прерывании была стабильна. Время входа в прерывание имеет некоторый разброс, вроде как. Я понимаю что оно у вас одно, но все же. Там и системный таймер тикает и опять же наши всем любимые ложные срабатывания?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если "фаза пляшет, как хочет" и "смотрю осциллом", то вся проблема в "осцилле", или в операторе. Стробоскопический эффект?

Попробуйте посмотреть частоту на кварцевом резонаторе, если он есть. Циферки на резонаторе и в осциллографе должны быть одинаковыми. :ph34r: :ph34r:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мы имеем дело с синхронной системой, с кварцевой стабилизацией. Все разбросы известны, на сколько я понял (вход в прерывание 7 тактов и т.п.). Прерывание системного таймера отключаемое (нашел пару рецептов на зарубежных сайтах, там тоже и ложные срабатывания и косяки с длительностью нахождения и т.п.), будет крутиться как счетчик и опрашиваться, если надо. По идее, если разработка не требует 100% загрузки, то можно сделать синхронную систему, выключив все лишнее. И прерыванием обойтись одним - по таймеру. Остальное опросом готовности.

 

У таймеров есть синхронизация, так, что если надо, чтобы "играли в долю" , все вполне конфигурируемо.

А если нет, то я ошибся платформой и, видимо, буду подбирать что-то другое.

 

А кстати да, выход шим настроить на меандр совсем не вариант?

 

Кое что надо опрашивать с частотой не менее 1кГц. Частоту и стабильность проверял через дерганье лапой.

Да и ШИМ будет через одно место, если таймер криво настроен.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вход в прерывание не 7 тактов, а до 7 тактов. Это величина различная, хотя конечно на фоне 70 МГц не существенная...

 

Если вы запустите таймер и его выход будет дергаться ШИМом, уверяю вас все будет работать точно и без дерганья, если кварц и ПЛЛ не дергает. Это кстати хороший тест, тем более что у вас есть осциллограф.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

При 72МГц ядра, 1000Гц частоте прерываний и 7 тактах дрожание фазы получается 7 * 1000 / 72000000 менее 0.01%

Это действительно можно увидеть осциллографом?

Даже если весь экран (а у меня это 800 точек) заполнить одним периодом сигнала, то дрожание порядка 0.1 пикселя.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...