Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
 Аватар для _SayHello
874 / 535 / 175
Регистрация: 30.07.2015
Сообщений: 1,739

Сбоит частотомер

29.02.2016, 23:27. Показов 2002. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток! Проблема: считаю период входного прямоугольного импульса с помощью захвата на stm32f100, затем пересчитываю в частоту. Рабочие частоты 1-100 Гц.
Инициализация:
C++
1
2
3
4
5
6
7
8
9
RCC->APB1ENR |= RCC_APB1ENR_TIM3EN; //Включаем тактирование TIM3
    TIM3->PSC = 239;
    TIM3->CCMR1 |= TIM_CCMR1_CC1S_0; //Выбор активного входа. Записываем "01" в биты CC1S - связываем регистр TIM3_CCR1 со входом TI1
    TIM3->CCMR1 |= (TIM_CCMR1_IC1F_0 | TIM_CCMR1_IC1F_1  | TIM_CCMR1_IC1F_2
            | TIM_CCMR1_IC1F_3); //Выбор длительнотси действия фильтра - 8 тактов. IC1F = 0011.
    TIM3->CCER &= ~TIM_CCER_CC1P; //По переднему фронту - положительный перепад импульса
    TIM3->CCER |= TIM_CCER_CC1E; //Разрешен з хват значения счетчика в регистр TIM3_CCR1
    TIM3->DIER |= TIM_DIER_CC1IE; //Разрешена генерация прерывания при захвате
    TIM3->CR1 |= TIM_CR1_CEN; //Запускаем счет таймера
Обработчик:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void TIM3_IRQHandler() {
    TIM3->SR &= ~TIM_SR_UIF;
    if (!n) {
        capture_1 = TIM3->CCR1;
        n = ~n;
    } else {
        capture_2 = TIM3->CCR1;
        period = capture_2 - capture_1;
        capture_1 = 0;
        capture_2 = 0;
        n = ~n;
    }
}
Вычисление частоты:
C++
1
2
3
4
5
6
7
int main(void) {
    initall();
    __enable_irq();
    NVIC_EnableIRQ(TIM3_IRQn);
    while (1) {
                frec_obmin =(100000000/period)*0.6;  // об/мин, домножение на 10 и деление на 6, дает странный результат
            }
ВЫкладываю только функции частотомера, частота устанавливается регулятором, поэтому плавает определенное время.
Проблема: при регулировании на частотах 500 < f < 1000 об / мин, могут возникать резкие падения периода до 0 и соответственно скачок расчетной частоты, которая в дальнейшем выбешивает регулятор. На частотах выше 1000 об/мин данного эффекта не наблюдается. Эффект наблюдал в STMStudio, просмотрев так же зависимость capture_1 и capture_2 увидел( что и логично) что в определенный момент времени они принимают одинаковые значения, и их разность дает 0. Не могу сообразить как от этого избавиться? Связано ли это с переполнением регистра счетчика? Заранее спасибо!
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.02.2016, 23:27
Ответы с готовыми решениями:

Частотомер
Привет всем, есть программа таймера ( частотомера) написана на ассемблере, в протеусе проверил сам таймер работает, но сама суть задачи не...

частотомер на at89c51
Сделал модель частотомера ra4nalа в протеусе. &lt;Изображение удалено&gt; не могу разобраться, почему не работает индикация.

Еще один частотомер
Наткнулся вот на такой частотомер http://www.itistronics-diy.com/50MHz_Fr ... ounter.php Собрал работает &lt;Изображение...

18
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
01.03.2016, 07:02
цифровые частотометры бывают двух типов
прямой это когда за определенный период подсчитывается количество импульсов (переходов)
и обратный это когда замеряется время импульса(перехода)
здесь используется второй способ
Цитата Сообщение от _SayHelli Посмотреть сообщение
считаю период входного прямоугольного импульса
точность на малых частотах у него выше чем у первого, Но( как часто это в жизни НО) это в идеале
в реале давай считать
Цитата Сообщение от _SayHelli Посмотреть сообщение
stm32f100
Цитата Сообщение от _SayHelli Посмотреть сообщение
TIM3->PSC = 239;
из этого делаю вывод что таймер молотит с частотой 100 000 Гц (0,00001 сек)
счетчик у таймера 16 разрядный т.е 0-65535, значит замерить можно до 0.65535 сек, (0,00001*65535) примерно 1,5 Гц далее переполнение,что уже не тянет на 1 Гц
далее
Цитата Сообщение от _SayHelli Посмотреть сообщение
C
1
100000000/period)
откуда число 100 миллионов?
Цитата Сообщение от _SayHelli Посмотреть сообщение
C
1
period = capture_2 - capture_1;
как объявлены эти переменные? знаковые? беззнаковые? размер?
Цитата Сообщение от _SayHelli Посмотреть сообщение
C
1
2
3
TIM3->CCER |= TIM_CCER_CC1E; //Разрешен з хват значения счетчика в регистр TIM3_CCR1
 TIM3->DIER |= TIM_DIER_CC1IE; //Разрешена генерация прерывания при захвате
 TIM3->CR1 |= TIM_CR1_CEN; //Запускаем счет таймера
вот здесь таймер начинает молотить и только потом считывает значения
как бы я сделал?
во первых увеличил бы предделитель
во вторых использовал бы внешние прерывания
по первому фронту запускаем таймер, по второму останавливаем(можно не останавливать а считать значение и перезапустить) , считываем значения заносим во внешнюю переменную и где то в главном цикле расчет
могу, если понадобится, чуть по позже скинуть кусок проги цифрового димера, где я рассчитывал длину полупериода осветительной сети
но там не точный расчет а относительный, на таймере реализован одновибратор, который за одно и рассчитывал период
0
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
01.03.2016, 08:30
... вдобавок к комментарию ValeryS, я бы добавил еще возможно, "дребезг контакта", или нечеткие фронты исходного сигнала. В итоге прерывание срабатывает дважды за один период, еще в момент прерывания. В итоге получается period равный нулю... Ну, и при расчете проверять же надо - при делении на ноль проц перейдет в exception. Ограничьте результат расчета какими-нибудь вменяемыми результатами, чтобы не было озвученных проблем с регулятором.
0
 Аватар для _SayHello
874 / 535 / 175
Регистрация: 30.07.2015
Сообщений: 1,739
01.03.2016, 11:21  [ТС]
Voland_, сигнал пропущен через компаратор, смотрю по осциллографу - меандр четкий. ValeryS, частота по факту колеблется в диапазоне 9-100 Гц. capture_1, 2 - unsigned 16 bit. 10000000 - для вычисления частоты в об/мин. 100.000 Гц *60 / period
0
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
01.03.2016, 11:47
ок. тогда вопросы с переполнением.
1) Проверьте, что capture1, capture2 у вас объявлены как:
C
1
static volatile uint16_t capture1, capture2;
2) До какого значения и в какую сторону считает ваш таймер? Здесь это важно.

3) Непонятно зачем вы делаете в прерывании деление алгоритма на две ветки. Флаг "n" вообще не нужен. Просто в каждом шаге сравнивайте значение счетчика с предыдущим, вычисляйте период и сохраняйте снова значения счетчика в буфер:

C
1
2
3
TIM3->SR &= ~TIM_SR_UIF; /* <== это надо перепроверить. Не факт что флаг надо сбрасывать, и что он сбрасывается именно так */
period = TIM3->CCR1-capture_1;
capture_1 = TIM3->CCR1;
Это все, что должно быть в прерывании, при условии п.1 и того что счетчик считает до 65535.

PS: что будет если вы остановите мотор, и импульсы перестанут приходить?
0
 Аватар для _SayHello
874 / 535 / 175
Регистрация: 30.07.2015
Сообщений: 1,739
01.03.2016, 12:04  [ТС]
Voland_,
Цитата Сообщение от Voland_ Посмотреть сообщение
1) Проверьте, что capture1, capture2 у вас объявлены как:
CВыделить код
1
static volatile uint16_t capture1, capture2;
Без static volatile объявлены, не очень понял что значат данные типы, что то с перезаписью в памяти?
Цитата Сообщение от Voland_ Посмотреть сообщение
2) До какого значения и в какую сторону считает ваш таймер? Здесь это важно.
до 65535 вверх.
Цитата Сообщение от Voland_ Посмотреть сообщение
3) Непонятно зачем вы делаете в прерывании деление алгоритма на две ветки. Флаг "n" вообще не нужен. Просто в каждом шаге сравнивайте значение счетчика с предыдущим, вычисляйте период и сохраняйте снова значения счетчика в буфер:
Ну, ну моя логика была - ловим первый фронт засекаем значение, ловим следующий засекаем снова, находим разницу. Ваш код делает по сути тоже самое только более оптимизирован) Исправлю.
Цитата Сообщение от Voland_ Посмотреть сообщение
PS: что будет если вы остановите мотор, и импульсы перестанут приходить?
По кнопке выключения двигателя : отключаются таймер счета, и таймер гернерирующий ШИМ , обнуляются значения частоты, периода, счетные регистры таймеров
0
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
01.03.2016, 12:44
Цитата Сообщение от _SayHelli Посмотреть сообщение
По кнопке выключения двигателя : отключаются таймер счета, и таймер гернерирующий ШИМ , обнуляются значения частоты, периода, счетные регистры таймеров
А если мотор не запустится или остановится по какой-то причине?
0
 Аватар для _SayHello
874 / 535 / 175
Регистрация: 30.07.2015
Сообщений: 1,739
01.03.2016, 13:30  [ТС]
Цитата Сообщение от Voland_ Посмотреть сообщение
А если мотор не запустится или остановится по какой-то причине?
хороший вопрос. Такой защиты нет( как можно сделать проверку на стопор? Проверять частоту и если она дает нулевые результаты при включенном устройстве, то отключать?
0
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
01.03.2016, 13:49
Я вам намекаю более проблемный случай - мотор работал (шли прерывания), а потом внезапно остановился. При этом расчетная частота осталась на прежнем уровне. Ваш прибор считает нормально, пытается регулировать, но мотор стоит. То же самое будет например, просто при обрыве датчика вращения, который делает вам импульсы.
0
 Аватар для _SayHello
874 / 535 / 175
Регистрация: 30.07.2015
Сообщений: 1,739
01.03.2016, 14:22  [ТС]
Voland_, да задумывался над этой проблемой, но не решил( каким способом можно этого избежать?
0
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
01.03.2016, 15:08
нужен таймаут этого счетчика, либо таймаут с помощью другого счетчика.
0
 Аватар для _SayHello
874 / 535 / 175
Регистрация: 30.07.2015
Сообщений: 1,739
01.03.2016, 15:10  [ТС]
Voland_, у меня есть вспомогательный счетчик который генерирует мелкое прерывание раз в 1 мс, в нем только декремент переменных по которым опрашиваются кнопки и период регулирования
0
 Аватар для _SayHello
874 / 535 / 175
Регистрация: 30.07.2015
Сообщений: 1,739
02.03.2016, 17:42  [ТС]
Voland_, таймаут это, что- то вроде: по какому то событию включается счетчик, досчитав определенное время, он снова проверяет, и если условие все еще выполняется то он отключает систему?
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
02.03.2016, 18:38
_SayHelli, вот смотри как просто сделать проверку если использовать не захват таймера
а внешние прерывания
пришло прерывание считали значение, обнулили таймер
пришло прерывания считали значение, обнулили таймер
если прерывание не пришло, обрыв датчика, остановился мотор
то счетчик досчитывает до переполнения, генерит свое прерывание, а там уже выставляется флаг "ахтунг"
недостаток что первое значение будет мусором
0
 Аватар для _SayHello
874 / 535 / 175
Регистрация: 30.07.2015
Сообщений: 1,739
02.03.2016, 19:25  [ТС]
ValeryS, у меня плата сделана уже и вход импульсов на первый канал TIM3. Он же имеет функцию внешнего прерывания? А я понял, у стм же любую ногу можно настроить на внешнее прерывание
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
02.03.2016, 20:00
Цитата Сообщение от _SayHelli Посмотреть сообщение
вход импульсов на первый канал TIM3.
он же PA6, настраиваешь его на вход, внешние прерывания по 6 каналу, порта A
Цитата Сообщение от _SayHelli Посмотреть сообщение
А я понял, у стм же любую ногу можно настроить на внешнее прерывание
не совсем, например PA6 PB6 PC6 не настроишь только один из них
0
 Аватар для _SayHello
874 / 535 / 175
Регистрация: 30.07.2015
Сообщений: 1,739
11.03.2016, 15:22  [ТС]
Проблема оказалась чисто аппаратная поставил фильтрующий конденсатор побольше и все заработало стабильно, видим высокочастотная помеха мешалась
0
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
11.03.2016, 16:40
Лучший ответ Сообщение было отмечено _SayHello как решение

Решение

Цитата Сообщение от _SayHelli Посмотреть сообщение
Проблема оказалась чисто аппаратная поставил фильтрующий конденсатор побольше и все заработало стабильно, видим высокочастотная помеха мешалась
подтвердилось вот это:
Цитата Сообщение от Voland_ Посмотреть сообщение
возможно, "дребезг контакта", или нечеткие фронты исходного сигнала. В итоге прерывание срабатывает дважды за один период, еще в момент прерывания. В итоге получается period равный нулю...
2
 Аватар для _SayHello
874 / 535 / 175
Регистрация: 30.07.2015
Сообщений: 1,739
11.03.2016, 16:47  [ТС]
Voland_, да вы были абсолютно правы, спасибо вам) Дело в том, что в тестовом варианте не присутствовали щетки для токосъема с вала( вал - электрод) и расстояние от оптодатчика было малым. При установке щеток пришлось метку поднять выше, и оптодатчик перестал ее "видеть", поменял резистор с 220 Ом на 100, чтобы ток диода был побольше, добавил мощности так сказать, и из за этого он стал "видеть" некие маленькие косяки метки (хотя по осциллографу их не было видно, и частоту осциллограф считал исправно, поэтому я и грешил на программу, возможно у прибора встроенный ФНЧ есть) . Поставил конденсатор на 22 нФ, больше побоялся сначала ставить, на больших частотах думал будет заваливать фронт. И этого конденсатора видимо хватало на частотах 1000-6000 об/мин, а на меньших он был маловат. Поставил 47 нФ, все пошло как по маслу, на 6000 об/мин косит фронты, но незначительно, компаратор выпрямляет как надо )
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.03.2016, 16:47
Помогаю со студенческими работами здесь

Частотомер на MSP430f2131 c HD44780
Всем добрый день. Тут появилась задача сделать частотомер. Вроде что то получается, но ни ничего не получается не получается. Сможете...

Частотомер на базе микропроцессора AT89S8252
Доброго времени суток, прошу помощи в написании программы для частотомера на базе микропроцессора AT89S8252 на языке ассемблер и в...

3хразряндный семисегментник, работающий как частотомер
Добрый день.В общем навыков программирования на ассимблере у меня нет, но задача есть. Разработать устройство для отображения на...

А делал ли кто-нибудь частотомер на MSP430?
Если кто-нибудь делал, поделитесь исходным кодом.

частотомер
форумчани подскажите пожалуйста, разрабатываю вот этот частотомер http://chipenable.ru/index.php/programm ... a-avr.html, не смог...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru