реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> stm32f103 непонятки с таймером, частота прерываний на порядок ниже и фаза плавает
gena_p1
сообщение Sep 2 2014, 20:23
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Sep 2 2014, 20:39
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



ножку настроили на максимальную частоту?
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Sep 3 2014, 04:44
Сообщение #3


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Для начала вставьте проверку флага в обработчик прерывания:
Код
if(TIM_GetITStatus(TIM4, TIM_IT_Update) == SET)
{
    TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
    GPIOB->ODR ^= GPIO_Pin_8;
}


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
adnega
сообщение Sep 3 2014, 06:38
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(AHTOXA @ Sep 3 2014, 08:44) *
Для начала вставьте проверку флага в обработчик прерывания:

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

Неужели в книжках так учат? Или в Интернете? Или это последствия перехода с AVR?
Go to the top of the page
 
+Quote Post
gena_p1
сообщение Sep 3 2014, 06:54
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 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 не влияет на частоту, хотя по идее, должно.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Sep 3 2014, 06:54
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(adnega @ Sep 3 2014, 12:38) *
еужели в книжках так учат? Или в Интернете? Или это последствия перехода с AVR?

Да-да... молодёжь уже не та......
Go to the top of the page
 
+Quote Post
adnega
сообщение Sep 3 2014, 07:07
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(gena_p1 @ Sep 3 2014, 10:54) *
10 период

Его тоже бы на единичку уменьшить. Иначе 11 получается.
Go to the top of the page
 
+Quote Post
gena_p1
сообщение Sep 3 2014, 07:11
Сообщение #8


Участник
*

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



Цитата(adnega @ Sep 3 2014, 11:07) *
Его тоже бы на единичку уменьшить. Иначе 11 получается.


Яростно лайкаю Ваш ответ, похоже так и есть! Специально "особые" величины ставил в скобки, чтобы от расчетной величины единицу отнять.
Спасибо!
Go to the top of the page
 
+Quote Post
kostyan
сообщение Sep 3 2014, 07:29
Сообщение #9


Частый гость
**

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



Цитата(gena_p1 @ Sep 3 2014, 02:23) *
Допустим, делаю генератор с частотой 5кГц, а получаю 454 Гц и фаза пляшет как хочет (смотрю осциллом).


Изначально указали неправильное значение частоты в 5кГц - это 5000Гц, а не 500Гц как вы хотели, то есть разница на порядок!
А если разница всего в 6 Гц, то понятно же первым делом поиграться значением периода...
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Sep 3 2014, 07:35
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



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

меня немного смущает желание чтобы нога выставляемая в прерывании была стабильна. Время входа в прерывание имеет некоторый разброс, вроде как. Я понимаю что оно у вас одно, но все же. Там и системный таймер тикает и опять же наши всем любимые ложные срабатывания?
Go to the top of the page
 
+Quote Post
kostyan
сообщение Sep 3 2014, 08:29
Сообщение #11


Частый гость
**

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



А кстати да, выход шим настроить на меандр совсем не вариант?
Go to the top of the page
 
+Quote Post
ViKo
сообщение Sep 3 2014, 08:53
Сообщение #12


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Если "фаза пляшет, как хочет" и "смотрю осциллом", то вся проблема в "осцилле", или в операторе. Стробоскопический эффект?
Попробуйте посмотреть частоту на кварцевом резонаторе, если он есть. Циферки на резонаторе и в осциллографе должны быть одинаковыми. ph34r.gif ph34r.gif
Go to the top of the page
 
+Quote Post
gena_p1
сообщение Sep 3 2014, 09:58
Сообщение #13


Участник
*

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



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

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

Цитата(kostyan @ Sep 3 2014, 12:29) *
А кстати да, выход шим настроить на меандр совсем не вариант?


Кое что надо опрашивать с частотой не менее 1кГц. Частоту и стабильность проверял через дерганье лапой.
Да и ШИМ будет через одно место, если таймер криво настроен.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Sep 3 2014, 10:31
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



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

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

Go to the top of the page
 
+Quote Post
adnega
сообщение Sep 3 2014, 12:43
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



При 72МГц ядра, 1000Гц частоте прерываний и 7 тактах дрожание фазы получается 7 * 1000 / 72000000 менее 0.01%
Это действительно можно увидеть осциллографом?
Даже если весь экран (а у меня это 800 точек) заполнить одним периодом сигнала, то дрожание порядка 0.1 пикселя.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 00:06
Рейтинг@Mail.ru


Страница сгенерированна за 0.01491 секунд с 7
ELECTRONIX ©2004-2016