@ru_electronics

Страница 422 из 718
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 может быть такая точность

Страница 422 из 718