SapegoAL 0 12 ноября, 2020 Опубликовано 12 ноября, 2020 · Жалоба Добрый день. Процессор stm32f042, хотя думаю что это не принципиально. Мне надо подсчитать импульсы таймером. Так как разведена плата, попадает на 3 канал (PB0 [TIM3_CH3]) Пытаюсь настроить согласно даташиту: 1. Включаю тактирование таймера 2. TIM3->CCMR2 = TIM_CCMR2_CC3S_0; // Включаю 3 канал 3. TIM3->CCER = TIM_CCER_CC3P; // По заднему фронту 4. TIM3->SMCR = TIM_SMCR_SMS | TIM_SMCR_TS_1 | TIM_SMCR_TS_0; // Перевести в режим Ext Mode 1 5. TIM3->DIER = TIM_DIER_UIE; // // Включить прерывание по переполнению Ну и когда идёт счёт TIM3->CR1 = TIM_CR1_CEN; // Включить таймер Ноги настроены правильно... Счёт не идёт. По схеме таймера в даташите особо непонятно, хотя описано, что в этом Ext Mode 1, вроде как можно. С другой стороны есть разночтение там пишется TI а не CH. И не совсем понятно, допускается ли подключение 3 канала. Кто делал? Что не так? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vlad_G 5 12 ноября, 2020 Опубликовано 12 ноября, 2020 (изменено) · Жалоба 1 hour ago, SapegoAL said: 5. TIM3->DIER = TIM_DIER_UIE; // // Включить прерывание по переполнению Что не так сейчас и не вспомню, считал я внешнюю частоту, все работало. Вечером посмотрю, может найду код настройки, если раньше не решится. Но вод по пункту 5 есть вопрос. В кубеиде (или атоллик) включить прерывания вот так мало, надо еще написать: NVIC_EnableIRQ(TIM16_IRQn); Без этого не работает, во всяком случае у меня и при работе с регистрами. Хотя, может просто не указали этот момент. Изменено 12 ноября, 2020 пользователем Vlad_G Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Eddy_Em 1 12 ноября, 2020 Опубликовано 12 ноября, 2020 (изменено) · Жалоба Вот здесь у меня STM32F072 считает импульсы от вентилятора первым каналом таймера 3. Так настраиваю: RCC->APB1ENR |= RCC_APB1ENR_TIM3EN; TIM3->SMCR = TIM_SMCR_TS_2 | TIM_SMCR_TS_0 | TIM_SMCR_SMS; // TS=101, SMS=111 - external trigger on input1 TIM3->CCMR1 = TIM_CCMR1_CC1S_0; // CC1 is input mapped on channel TI1 TIM3->CR1 = TIM_CR1_CE Так считаю: void sys_tick_handler(void){ static uint32_t actr = 0; ++Tms; if(++actr == 1000){ // RPM counter Coolerspeed[0] = TIM3->CNT/2; TIM3->CNT = 0; actr = 0; } } Изменено 12 ноября, 2020 пользователем Eddy_Em борьба с ветряными мельницами Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 117 12 ноября, 2020 Опубликовано 12 ноября, 2020 · Жалоба 2 часа назад, SapegoAL сказал: Так как разведена плата, попадает на 3 канал Описание там, конечно, для сильных духом. Но если внимательно посмотреть на картинку 128 (TI2 external clock connection example) или на описание битов SMS - видно, что на входной мультиплексор поступают сигналы TI1F (выход модуля совпадения канала 1), TI2F (выход модуля совпадения канала 2), TRGI (выход внутреннего триггера), ETRF (выход внешнего триггера, есть только у таймера 2 - TIM2_CH1_ETR), CK_INT (такты системной шины). На вход мультиплексора внутреннего триггера поступают сигналы ITRx (выходы других таймеров), TI1_ED (хз, но канал 1), TI1FP (вход канала 1) TI2FP (вход канала 2), ETRF. как видно, вход канала 3 сюла не заведен. Вывод - считать импульсы с канала 3 не получится. Единственный шанс - если эта же нога также заведена на один из счетных входов таймеров 1, 2, 15 или 14 - тогда один из этих таймеров можно использовать как предделитель и таймером3 считать импульсы с соответствующего входа ITRx, но это не ваш случай - на PB0 выведен только выход TIM1_CH2N. Так что увы - или менять разводку, или настраивать канал 3 на захват и считать прерывания захвата на каждый импульс (но тогда проще считать прерывания EXTI и не мучать таймер). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Eddy_Em 1 12 ноября, 2020 Опубликовано 12 ноября, 2020 (изменено) · Жалоба Вот картинка. Жаль, конечно, что ST так сделали, что считать внешние импульсы или обрабатывать энкодер можно лишь на каналах 1 и 2… А еще всякие TIM14 и т.д. не умеют считать! В вышеприведенной железяке сам на это напоролся, разведя плату так, чтобы частоту вращения второго кулера считать первым каналом TIM14, пришлось делать это на EXTI. Изменено 12 ноября, 2020 пользователем Eddy_Em Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SapegoAL 0 12 ноября, 2020 Опубликовано 12 ноября, 2020 · Жалоба Всем спасибо за участие. Если честно я так и думал. На картинке видно, что не заведено, но всё таки надеялся... )) Рядом свободная нога, думал соплю кину, так там TIM14_CH1... )) Придётся проводничёк кидать на PA8. Там TIM1.ch1. Может и EXTI можно попробовать, но проц слабенький, скорее всего не буду экспериментировать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться