

Andrey
25.11.2017
20:43:33
Всем привет! Cтолкнулся с проблемой с таймерами и stm32.
Есть stm32f030 на 48мгц, тактирование от HSE через PLL, соотв. все шины тоже 48МГц.
Задача - отмерять промежутки времени от 10мс до 10 мин с точностью 1мс.
Для этого я завожу таймер ТИМ6 и делаю след настройки
psc = 48
arr = 1000, то есть он тикает каждую 1мс. Там уже переменную uint32_t timer инкрементирую, по ней смотрю сколько натикало когда надо. Чтобы проверить точность - сделал пустой проект, там только инит таймера и прерывание его каждую 1мс... поставил дерганье пином просто, togglepin - вроде 1мс дергает, но видно, что фронт со временем уезжает на какие-то мксек... ладно... делаем измерения на более долгих временах, поднимаю ногу. тикаю переменной в таймере и там при if (timer == 500) опускаю. И вижу на осциле, что вместо 500мс натикало меньше. Делаю для 1сек.. там вообще не хватает 2мс уже... Смотрю осциллом или анализатором логическим. Для десятков минут уже и говорить нечего - там набег в секунды...
инициализации разные пробовал уже, и с -1 для arr, как народ пишет. и комбинации разные
/* TIM6 init function */
static void MX_TIM6_Init(void)
{
LL_TIM_InitTypeDef TIM_InitStruct;
/* Peripheral clock enable */
LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_TIM6);
/* TIM6 interrupt Init */
NVIC_SetPriority(TIM6_DAC_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),0, 0));
NVIC_EnableIRQ(TIM6_DAC_IRQn);
TIM_InitStruct.Prescaler = 48;
TIM_InitStruct.CounterMode = LL_TIM_COUNTERMODE_UP;
TIM_InitStruct.Autoreload = 1000;
LL_TIM_Init(TIM6, &TIM_InitStruct);
LL_TIM_DisableARRPreload(TIM6);
LL_TIM_SetTriggerOutput(TIM6, LL_TIM_TRGO_RESET);
LL_TIM_DisableMasterSlaveMode(TIM6);
}
пробовал уже TIM_InitStruct.Autoreload = 999, пофиг...
TIM_InitStruct.Prescaler = 48; тоже менял на 47.. но это уже подгон какой-то... или 1мс шаг это уже серьезно и недостижимо или просто таймер настроить не могу?)
Думал может с кварцем чего на моей плате.. нагрузил не теми емкостями... взял уже nucleo дискавери l476... такая же абсолютно картина...


sifun
25.11.2017
20:50:22
насколько я помню период не равен значению arr
там плюс один или минус один чот такое

Andrey
25.11.2017
20:52:22
это все перепробовал, все равно есть смещение какое-то... и 999 ставил и 1001

Google

sifun
25.11.2017
20:58:11
а ты уверен что это не лог анализатор лажает

Andrey
25.11.2017
21:09:21
Ну это я проверял и осциллом ещё, так что уверен

sifun
25.11.2017
21:10:05
так осцил тоже не обязан быть точным
а ошибка повторяется?
кто источник тактовой

Firelander
25.11.2017
21:19:09
Прескелер надо -1 от актуального значения ставить, а арр вроде точно

sifun
25.11.2017
21:20:50
а во

Admin
ERROR: S client not available

Firelander
25.11.2017
21:24:32
Вообще у осцила и анализатора есть своя точность измерения времени. По-хорошему тебе надо на таймере выплюнуть аппаратный шим и хорошим частотметром замерить

sifun
25.11.2017
21:25:35
ага
6 знаков чтоб

Firelander
25.11.2017
21:25:53
Точности 1 мс за 10 минут кварц почти наверняка не даст. Это пара ппм, только у хороших tcxo может быть такая точность