AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
04.08.2016, 21:32
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
|
Re: Спидометр атмега 8
Сообщение от МВА
|
miwutka, я что-то никак не пойму, а где у тебя синхронизируется таймер с импульсами?
|
Ну у меня синхронизации нету вроде. Там просто по входному фронту считает таймер. Первый вход в прерывание - запоминает значение регистра захвата. Второй вход - вичитает разницу. И по разнице показывает время между импульсами. Я уже код изменил. Завтра выложу. Но он не сильно отличается от того, который я использовал для спидометра. Но это делаю тахометр.
Если есть вот тот захват чтобы каждый 4-ый импульс то скажите где там у атмеги8 это есть?
|
|
|
|
04.08.2016, 21:35
|
|
Гражданин KAZUS.RU
Регистрация: 03.07.2010
Сообщений: 843
Сказал спасибо: 156
Сказали Спасибо 378 раз(а) в 190 сообщении(ях)
|
Re: Спидометр атмега 8
Красиво! А на практике по большей части смотрю лишь краем глаза на белые светодиоды, которые специально поставил яркие, они показывают момент переключения следующей передачи, да и то по началу, как привыкаешь ориентируешься уже по динамике авто. Из хороших опций это автоматическая регулировка яркости, по фоторезистору.
|
|
|
|
04.08.2016, 21:38
|
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 18,904
Сказал спасибо: 2,542
Сказали Спасибо 11,816 раз(а) в 5,922 сообщении(ях)
|
Re: Спидометр атмега 8
Сообщение от miwutka
|
а на больших больше
|
Надо смотреть что и как сделано. Так трудно сказать что-то определенное. Нужны цивры.
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
|
|
|
|
04.08.2016, 21:43
|
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 18,904
Сказал спасибо: 2,542
Сказали Спасибо 11,816 раз(а) в 5,922 сообщении(ях)
|
Re: Спидометр атмега 8
Сообщение от С.М.С
|
ориентируешься уже по динамике авто
|
И не только. Еще и динамика потока учитывается. При вялом движении переключаюсь вверх раньше, на меньших оборотах. Зато при динамичном - когда перестает вдавливать в спинку (ускорение упало). Тут светлодиоды не помощники. Так, баловство одно...
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
|
|
|
|
05.08.2016, 09:51
|
|
Гражданин KAZUS.RU
Регистрация: 15.08.2010
Адрес: Днепр
Сообщений: 842
Сказал спасибо: 74
Сказали Спасибо 199 раз(а) в 174 сообщении(ях)
|
Re: Спидометр атмега 8
Сообщение от miwutka
|
Ну у меня синхронизации нету вроде. Там просто по входному фронту считает таймер. Первый вход в прерывание - запоминает значение регистра захвата. Второй вход - вичитает разницу. И по разнице показывает время между импульсами. Я уже код изменил. Завтра выложу. Но он не сильно отличается от того, который я использовал для спидометра. Но это делаю тахометр.
Если есть вот тот захват чтобы каждый 4-ый импульс то скажите где там у атмеги8 это есть?
|
Всем привет. Не нравится мне этот алгоритм. Очень большие вычисления делаются в прерывании. Я бы попробовал другие.
1). Прерывание по захвату. Это значит прошел импульс, забираешь содержимое счетчика, обнуляешь его и подсчет делаешь в главной программе. При следующем прерывании по захвату у тебя буде в счетчике значение соответствующее интервалу между импульсами. Однако есть возможность того, что программа не успеет посчитать, если частота входных импульсов будет высокой и предделитель таймера маленький или 1. Тогда следующий алгоритм.
2). В прерывании по захвату инвертируем какую-то переменную bool и по ней ореентируемся четное или не четное прерывание.
Если bool = 0, то инвертируем ее, забираем переменную, обнуляем счетчик и выходим.
Если bool =1, инвертируем , обнуляем и выходим.
Ну, а если и этого не будет хватать, то вместо bool используем uint8_t. Заносим туда количество пропускаемых импульсов и при входе в прерывание выполняем конструкцию:
___________________________
if(i){
i--;
обнуляем счетчик;
}else{
забираем переменную;
i=колличество пропусков;
}
____________________________
Все. Остальное делаем в главном цикле.
Для спидометра возможно подойдет и первый вариант, так как частота импульсов не большая, а для тахометра может потребоваться второй, а то и со счетчиком.
Последний раз редактировалось МВА; 05.08.2016 в 09:55.
|
|
|
|
05.08.2016, 10:42
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.10.2007
Сообщений: 2,760
Сказал спасибо: 1,105
Сказали Спасибо 1,037 раз(а) в 569 сообщении(ях)
|
Re: Спидометр атмега 8
Сообщение от miwutka
|
rpm=((tahom[0]*16)+(tahom[1]*16)+(tahom[2]*16)+(tahom[3]*16)+(tahom[4]*16)+(tahom[5]*16)+(tahom[6]*16)+(tahom[7]*16)+
(tahom[8]*16)+(tahom[9]*16)+(tahom[10]*16)+(tahom[11]*16)+(tahom[12]*16)+(tahom[13]*16)+(tahom[14]*16)+(tahom[15]*16)+
(tahom[16]*16)+(tahom[17]*16)+(tahom[18]*16)+(tahom[19]*16));
};
|
Тебе что, за буквы платят?!
for (i=0; i‹20; i++) rpm+=tahom[i]; rpm*=16;
или это что было?
Сообщение от miwutka
|
ссылка что точнее хочю получить
|
Уже бы давно мог получить китайча рулит. Там, правда, циферки не бегают как сумасшедшие, а где-то раз в секунду.
Скажите, а это я один такой тупой, что не смотрю на тахометр? Вроде не совсем:
Сообщение от С.М.С
|
как привыкаешь ориентируешься уже по динамике авто
|
Или все меняют машины, как перчатки, что не успевают привыкнуть? Было время - ездил на трёх машинах, в голове образовалось три пресета, сел, поехал - через 10 минут почувствовал динамику, когда переключиться и т.п. Зачем тахометр, как им пользоваться?
Сообщение от МВА
|
Не нравится мне этот алгоритм. Очень большие вычисления делаются в прерывании. Я бы попробовал другие.
|
За вычисления в прерываниях надо сжигать на медленном огне. В прерывании выхватываются значения входов/счётчиков, ставится флаг - и всё. И потом всё успевает.
Здесь алгоритм может быть такой.
В прерывании, значение счётчика таймера прибавляется к аккумулятору (4-байтовая переменная в памяти), наращивается счётчик (1-байтовая переменная), обнуляется счётчик таймера.
В основной программе периодически проверяется счётчик. Если он не нулевой, то аккумулятор делится на счётчик - получаем время между импульсами скорости в попугаях таймера. Счётчик и аккумулятор обнуляем (при запрещённых прерываниях).
Тут есть источник погрешности - обнуление таймера в прерывании. Если вместо этого запоминать предыдущее значение таймера и вычитать его из текущего (с учётом переполнения), погрешность будет меньше.
На высоких оборотах импульсы скорости идут чаще, таймер насчитывает меньше, погрешность больше. Тут можно либо переходить на алгоритм подсчёта кол-ва импульсов скорости за секунду, либо увеличить разрядность таймера, либо увеличить частоту счёта таймера (чтобы он был близок к максимуму на минимальных оборотах)
Последний раз редактировалось makakus; 05.08.2016 в 10:46.
|
|
|
Сказали "Спасибо" makakus
|
|
|
05.08.2016, 11:31
|
|
Гражданин KAZUS.RU
Регистрация: 15.08.2010
Адрес: Днепр
Сообщений: 842
Сказал спасибо: 74
Сказали Спасибо 199 раз(а) в 174 сообщении(ях)
|
Re: Спидометр атмега 8
Сообщение от makakus
|
Если вместо этого запоминать предыдущее значение таймера и вычитать его из текущего (с учётом переполнения), погрешность будет меньше.
|
А теперь представь, что запомнили предыдущее значение, которое было в конце счета таймера, а следующее прерывание (захват) произошло после переполнения, то получится билиберда какая-то. И не думаю, что обнуление займет больше тактов, чем чтение в буфер. Да, и грузить процессор лишними вычислениями, да еще и двух байтовые переменные, то же не выход. Ему еще надо заниматься индикацией, а может и других функций можно напичкать.
Цитата:
|
В прерывании, значение счётчика таймера прибавляется к аккумулятору (4-байтовая переменная в памяти)
|
А разве 16 битный счетчик не двухбайтная переменная?
Последний раз редактировалось МВА; 05.08.2016 в 11:37.
|
|
|
|
05.08.2016, 11:34
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.08.2010
Адрес: Днепр
Сообщений: 8,565
Сказал спасибо: 5,041
Сказали Спасибо 10,612 раз(а) в 3,604 сообщении(ях)
|
Re: Спидометр атмега 8
По поводу разной точности при разных оборотах. Я подобную проблему решаю так. Задаюсь неким минимальным числом, которое гарантированно обеспечивает заданную точность вычислений. Это число должно быть примерно на треть, или на половину меньше максимального значения. Например, для максимального двухбайтового 65535 выберем число 40000. Это количество тиков, заполняющих счетчик таймера. Одновременно надо вести подсчет количества импульсов датчика скорости.
1. Обнуляем таймер и счетчик импульсов.
2. Ожидаем фронт первого импульса датчика скорости.
3. Дождались - запустить таймер на подсчет тиков времени.
4. Ожидаем фронт следующего импульса.
5. Дождались - прибавляем единицу к счетчику импульсов, и считываем счетчик таймера. Сравниваем считанное значение с нашим числом 40000. Если считанное меньше - возврат на п.п.4.
6. Если уже набралось 40000 и более - ожидаем фронт очередного импульса.
7. Дождались - быстренько останавливаем счет таймера, прибавляем единицу к счетчику импульсов, и делим количество тиков таймера на количество импульсов.
Таким способом мы всегда получим точность вычислений в заданных пределах, и минимальную погрешность, так как мы всегда имеем дело с целым количеством импульсов датчика.
Конечно, при ожидании очередного фронта импульса можно его и не дождаться, если двигатель вообще остановился. Поэтому надо контролировать переполнение таймера.
|
|
|
|
05.08.2016, 11:37
|
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 18,904
Сказал спасибо: 2,542
Сказали Спасибо 11,816 раз(а) в 5,922 сообщении(ях)
|
Re: Спидометр атмега 8
Да и вообще, зачем пытаться решать такие сложные задачи на Меге?
Взять обычный православный СТМ32, у которого и таймеров хватает, и таймеры не кастрированные, и за скорострельность можно не переживать... Все решится гораздо проще.
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
|
|
|
|
05.08.2016, 12:36
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.10.2007
Сообщений: 2,760
Сказал спасибо: 1,105
Сказали Спасибо 1,037 раз(а) в 569 сообщении(ях)
|
Re: Спидометр атмега 8
Сообщение от МВА
|
а следующее прерывание (захват) произошло после переполнения, то получится билиберда какая-то.
|
Там я в скобках написал: с учётом переполнения. К белиберде надо прибавить единицу в 17-й бит
Сообщение от МВА
|
да еще и двух байтовые переменные
|
Да можно работать и с одним байтом, чёж. Насчитали 10 импульсов - погрешность 10%. если устраивает.
Сообщение от МВА
|
А разве 16 битный счетчик не двухбайтная переменная?
|
Да. А где я писал "двухбайтная переменная"?
Сообщение от Alex9797
|
. Я подобную проблему решаю так. Задаюсь неким минимальным числом, которое гарантированно обеспечивает заданную точность вычислений.
|
Конечно же! Эта работа должна выполняться ещё до программирования. Какая погрешность допустима? Какое количество импульсов насчитает таймер на минимальной/максимальной частоте? Всё это оцениваем, отсюда выбираем разрядности-частоты-времена.
Вот только про это в большинстве проектов - ни слова... "Купил ардуину - подключил либу - показывает! Ура-ура!!" А что показывает, он не думал...
|
|
|
Сказали "Спасибо" makakus
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 22:30.
|
|