Перейти к содержанию

crazz

Рекомендуемые сообщения

  • 2 недели спустя...

Ломаю голову, как получить мгновенное значение.

Задача такова. датчик скорости имеет 5 импульсов за один оборот колеса.

То-есть на расстояние 2.032м есть 5 импульсов.

То-есть каждый импульс это 0.4064м

Я хочу получить частоту дискретезации скорости хотя бы 10гц, тоесть 10 раз в секунду получать информацию о скорости.

100км в час это 68 импульсов в секунду.

Пробывал считать количество импульсов за 0.1 секунду, но получается очень высокая погрешность на 100км в час, так как за 0.1 секунду будет 6.8 импульсов, а точнее 6 импульсов так как нельзя посчитать не целое число импульсов.

Пробывал считать время за которое проскакивает 1 импульс, но не хватает 4mhz на точность. 1 импульс на скорости проскакивает за 0.0147 сек.

Получается погрешность 2 км в час. Не устраивает.

Прежде чем гнаться за увеличением частоты я решил спросить тут, так как может я чего то не знаю, каких то хитростей и других подходов, или каких то элементарных вещей.

Pic 16f819 Частота 4mhz и предделитель 1:2 и плюс на пик контроллере за 4 такта тикает.

То-есть получается минимальный шаг поднятия флага 8 битного таймера это 512 микросекунд. с таким шагом погрешность велика, думаю может в этом проблема, что я поднятием флага время замеряю?

Ссылка на комментарий
Поделиться на другие сайты

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Как я понял, включаем внешнее прервание по переднему фронту.и в момент прерывания по переднему фронту записываем значение регистра таймера, тоесть по сути записываем сколько тактов сделал таймер.

Но не понял а где начало отсчета. Что будет если таймер переполнется, вплане таймер тикает дотикал сбросился и тут бац сразу внешнее прерывание. Чето не разобрать вообщем мне этот код без комментариев =(

Ссылка на комментарий
Поделиться на другие сайты

Для измерения периода импульсов можно у пика использовать ССР модуль. У 16F819 есть замечательный вход ССР1. Запускаете таймер 1 в свободном полёте с частотой тиков Fosc/4, то есть таймер считает каждую микросекунду. На вход ССР1 подаёте импульсы скорости и включаете модуль ССР. После этого по каждому пришедшему импульсу скорости значение таймера 1 на лету автоматически будет записываться в специальные регистры, также будет вырабатываться прерывание.

То есть пришёл один импульс, значение таймера, например, 1560 записалось в регистры ССР. В прерывании это значение кладётся в переменную cnt0=1560. Пришёл второй импульс, защёлкнулось новое значение таймера 16260. В прерывании вычитаем старое из нового: 16260 - cnt0 = 14700, кладём cnt0=16260. Таким образом период между двумя импульсами скорости получился 14700 микросекунд, с точностью 1 мкс. И т.д.

Тут надо учесть, что максимальное число в таймере 65535, при небольших скоростях <25км/час таймер будет пару раз переполняться между импульсами. Ну, можно включить прескейлер и таймер будет тикать по 8 мкс, и минимальная измеряемая скорость составит 3км/час.

Ссылка на комментарий
Поделиться на другие сайты

Как я понял, включаем внешнее прервание по переднему фронту.и в момент прерывания по переднему фронту записываем значение регистра таймера, тоесть по сути записываем сколько тактов сделал таймер.

Но не понял а где начало отсчета. Что будет если таймер переполнется, вплане таймер тикает дотикал сбросился и тут бац сразу внешнее прерывание. Чето не разобрать вообщем мне этот код без комментариев =(

в данном случае это не таймер, а счетчик тиков МК, записали значение и обнулили счетчик = начало отсчета... на случай переполнения счетчика прерывание по таймеру = стоит заглушка просто драгаем пин... а так можно в этом месте добавить разрядность счетчика
Ссылка на комментарий
Поделиться на другие сайты

Запускаете таймер 1 в свободном полёте с частотой тиков Fosc/4, то есть таймер считает каждую микросекунду

да вот по этому пункту вопрос, я что то пересмотрел все свои комментарии с сылками на даташит и не понял как таймер врубить в свободном полете. Ну вплане я вижу где он врубается и дальше вижу где выбирается предделитель, для WDT или TMR0... хотя.... если выбрать предделитель для WDT то у TMR0 не будет предделителя и он будет в свободном полете?

Ссылка на комментарий
Поделиться на другие сайты

наверно спать пора или нет? ССР1 работает с TMR1!!!

если выбрать предделитель для WDT то у TMR0 не будет предделителя и он будет в свободном полете? 

таки да , но к ССР он не имеет никакого отношения...

Ссылка на комментарий
Поделиться на другие сайты

Далее включаете модуль захвата ССР, для этого пишите CCP1CON = 5.

Разрешаете прерывания от ССР, пишем PIE1 |= 0x4;

Делаете RB2 входом TRISB |= 0x04.

И понеслось. Подаёте на вход RB2 импульсы скорости, в прерывании проверяете флаг CCP1IF. Если флаг поднят, то переписываете захваченное значение таймера1 в какую-либо переменную и вычисляете период.

Изменено пользователем Yurkin2015
Ссылка на комментарий
Поделиться на другие сайты

Если флаг поднят, то переписываете захваченное значение таймера1 в какую-либо переменную и вычисляете период.

Нужно только не забыть объявить (или привести при вычислениях периода) переменные нового и предыдущего значений как signed long (32-разрядная знаковая), а результат вычитания привести к unsigned int (16-разрядная беззнаковая), тогда не нужно ловить переполнение счетчика или каждый раз его сбрасывать, чтобы исключить переполнение.

Ну и учесть квалификатор static для старого значения захвата, чтобы компилятор его не выкинул при выходе из обработчика, а также квалификатор volatile для вычисляемого периода, чтобы компилятор не намудрил с оптимизацией вне обработчика...

// глобальные переменные
volatile unsigned int period;
// в обработчике прерываний по захвату
static long old_timer;
long current_timer;
...............................
...............................
current_timer = CCPRL+(CCPRH<<8);
period = (unsigned int)(current_timer - old_timer);
old_timer = current_timer;

Изменено пользователем my504

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

Мне кажется с этими long переменными - перебор. Если есть два 16-ти битовых значения типа unsigned int, старое 0xF000 и новое 0x1000, например,то процессор тупо вычитает 0x1000 - 0xF000 = 0x2000 и получает правильный результат.

Ссылка на комментарий
Поделиться на другие сайты

Помоему, тут надо действовать в зависимости от входящей частоты - для низкой частоты измерять период импульсов, а для более высокой - период N импульсов. Например 8-и импульсов, результат потом поделить на 8 простым сдвигом на 3 бита.

результаты измерения пропустить через фильтр усредняющий по методу подвижного окна(размер окна выбрать в зависимости от необходимой минимальной частоты).

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

Помоему, тут надо действовать в зависимости от входящей частоты

это лишние, у ТС на скорости 200км/ч частота около 137Гц , скорости МК выше крыши
Ссылка на комментарий
Поделиться на другие сайты

Помоему, тут надо действовать в зависимости от входящей частоты - для низкой частоты измерять период импульсов, а для более высокой - период N импульсов. Например 8-и импульсов, результат потом поделить на 8 простым сдвигом на 3 бита.

Да именно так это слишком медленно будет. Вплане при 100 км в час у меня всего будет 7 импульсов в секунду, а если ждать секунду чтобы отсчитать эти 7 импульсов то погрешность будет 1 секунда а это дофига. как я написал мне нужно максимум погрешность 0.1 сек

Ссылка на комментарий
Поделиться на другие сайты

Интерполяцию используй по 3...5 последним результатам. Это конечно дело ресурсоёмкое, но с частотой 10/сек я думаю справиться можно будет. Например кубический сплайн.

Впрочем, есть и другой метод измерения частоты. Как думаешь измеряют частоту сети 50Гц с точностью до 4 знаков да еще за время 0.1 сек? довольно просто... там используют умножитель частоты и обыкновенный частотомер, который по факту измеряет 50кГц за 0.1 сек.

Изменено пользователем Alexeyslav

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

Зачем интерполяция? я думаю она не нужна. Я сейчас не спидометр делаю, а просто счетчик времени разгона до 100км в час. тоесть мне побольшому счету не обязательно что то выводить на экран, нужно будет время выводить и все. но можно и скорость показывать. Спидометр думаю сделать гораздо проще, ну или да сделать со средней скользящей

Ссылка на комментарий
Поделиться на другие сайты

так если тебе надо сделать счетчик времени разгона, то просто привяжись к периоду сигнала с датчика - как только станет меньше заданного - скорость достигнута.

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

Впрочем, есть и другой метод измерения частоты. Как думаешь измеряют частоту сети 50Гц с точностью до 4 знаков да еще за время 0.1 сек? довольно просто... там используют умножитель частоты и обыкновенный частотомер, который по факту измеряет 50кГц за 0.1 сек.

умножитель на 1000 :shok: это как????
Ссылка на комментарий
Поделиться на другие сайты

так если тебе надо сделать счетчик времени разгона, то просто привяжись к периоду сигнала с датчика - как только станет меньше заданного - скорость достигнута.

Отличный совет. Тоесть мне нужно модуль CCP использовать в режиме сравнения? Я просто пока только знакомлюсь по даташиту с этим модулем

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...