Jump to content

    
Sign in to follow this  
research1

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

Recommended Posts

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

 

Больше никаких прерываний не включал

Edited by gena_p1

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites
Для начала вставьте проверку флага в обработчик прерывания:

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

 

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

Share this post


Link to post
Share on other sites

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

 

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

 

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

 

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

Share this post


Link to post
Share on other sites
Его тоже бы на единичку уменьшить. Иначе 11 получается.

 

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

Спасибо!

Share this post


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

 

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

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

Share this post


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

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

 

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

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

 

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

 

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

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

Share this post


Link to post
Share on other sites

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

 

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

 

 

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this