|
|
  |
stm32 захват таймера 16 бит |
|
|
|
Apr 3 2014, 11:46
|
Частый гость
 
Группа: Участник
Сообщений: 97
Регистрация: 24-07-08
Из: Иркутск
Пользователь №: 39 180

|
Цитата(SasaVitebsk @ Apr 3 2014, 20:09)  Я могу как-то захватить оба таймера? Пробовал на stm32f107 два таймера, захват на каждом, есть сомнение в синхронности. Для вашего варианта можно посмотреть в сторону DMA. По событиям от TIM8, запускать чтение(запись) регистров TIM2 или TIM5.
|
|
|
|
|
Apr 3 2014, 12:07
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Для AVR приходилось тоже извращаться (программно-аппаратное увеличение разрядности регистра захвата таймера). Не смог найти оригинальный источник с этой идеей на этом сайте. Поищите, может вы найдёте... Вот что у меня получилось после творческой переработки: Код ISR(COMP_VECTOR) { compare_isr(); }
//============================================================================= // Подпрограмма выгребания события из регистра ICR. // Приоритет выше чем у переполнения и сравнения, поэтому такие сложности... //============================================================================= ISR(CAPT_VECTOR) { uint16_t icr = ICR;
if ((icr<0x8000) && (TIFR & (1<<OCF))) { TIFR = (1<<OCF); // clr compare flag by writing 1 to its bits location. compare_isr(); } ... }
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Apr 3 2014, 13:27
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
у вас переполнение первого таймера вызывает тик второго, такая схема? и вы боитесь что пока читаете один, тикнет другой?
Если я все правильно понял то решается двойным чтением
младший1 старший1 младший2 старший2
если младший2 больше младший1, то значит переполнения небыло, и старший1 - верное значение, полное число старший1+младший1, иначе - было переполнение, и правильное число старший2+младший2. Так как старший 2 считан позже младшего2, и если переполенние было на младишй2, то и старший2 точно корректен.
вот и все, 4 чтения + 1 сравнение...
|
|
|
|
|
Apr 4 2014, 03:36
|

Местный
  
Группа: Участник
Сообщений: 355
Регистрация: 27-03-07
Из: Україна, Чуднів
Пользователь №: 26 530

|
Цитата(demiurg_spb @ Apr 3 2014, 16:07)  Для AVR приходилось тоже извращаться (программно-аппаратное увеличение разрядности регистра захвата таймера). Не смог найти оригинальный источник с этой идеей на этом сайте. Поищите, может вы найдёте... В своё время мне помогла вот эта ветка, сама идея заключалась в дополнительной проверке флага переполнения. Я прав, она? А именно && (TIFR & (1<<OCF)
--------------------
нельзя недооценивать предсказуемость глупости
|
|
|
|
|
Apr 4 2014, 03:45
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(sKWO @ Apr 4 2014, 07:36)  Я прав, она? Да. Похоже она. Цитата(SasaVitebsk @ Apr 4 2014, 06:26)  Идею demiurg_spb, стыдно признаться - не понял. compare_isr() инкрементирует старшее слово (программное), а из ICR читается младшее слово. Таким образом получается 32 разряда. А условие ((icr<0x8000) && (TIFR & (1<<OCF))) проверяет, что переполнение случилось недавно. Давность можно регулировать, задав вместо 0x8000 другое значение. На STM32 таких проблем как с AVR быть не должно, т.к. можно конфигурировать NVIC и разруливать приоритеты по собственному желанию.
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Apr 4 2014, 14:47
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
Цитата Для PIC когда-то было предложено. Читать старший, читать младший, читать старший. Если оба прочтения старшего одинаковые, значит, переполнения не было. а если старшие не равны, то надо читать новый младший и все теже 4 считывания получаются%), это все та же старая стандартная идея, с разными типами проверки Цитата Это всё понятно. У меня частота 14 и соответственно 213.6. Вопрос о напряжности сложный, если это прибор коммерческого учёта. )) Придётся всёже переразвести на 32-ух битный таймер. мне тут в личку написали, смысл идеи с ДМА, перепишу суда своими словами. вы запускаете таймер 32 разрядный, настраиваете ДМА на чтение этого таймера по 1 тику вашего 8 разрядного таймера что идет наружу. И настраиваете запуск этого 8 разрядного таймера по внешнему сигналу. В результате с появлением внешнего сигнала, таймер делает тик, и запускает чтение 32 разрядного таймера по ДМА. Фактически это тоже что запустить 32 битный таймер и по сигналу его запомнить +- пару тактов... хотя если есть возможность переразвести, лучше сразу сделать нормально. или отладить на этой все остальное, и уже переразвести исправив все ошибки, а не только эту...
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|