AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
05.08.2016, 19:16
|
#71
|
Почётный гражданин KAZUS.RU
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
|
Re: Спидометр атмега 8
makakus, нехочу китайчу ))) У нас по 90 грн продаются цифровые спидометры. Я обычный цифровой и сам сделал давно. Раз в секунду обновляется. Сравнивая со стрелочным - было всё точно. Но хочу чтобы работал как-то пореальнее но без сумашествия )) Ну как на видео в ютубе. Квазианалоговый тахометр. Спидометр работает. Проехал уже 600 км примерно. Всё четко работает параллельно с механическим. Увидел что на фиатовской коробке спидометр родной скорость больше на 7% примерно показывает чем цифровой. Но при этом киллометраж одинаковый на обоих счетчиках.
|
|
|
|
05.08.2016, 19:30
|
#72
|
Почётный гражданин KAZUS.RU
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
|
Re: Спидометр атмега 8
Сообщение от МВА
|
Всем привет. Не нравится мне этот алгоритм. Очень большие вычисления делаются в прерывании. Я бы попробовал другие.
1). Прерывание по захвату. Это значит прошел импульс, забираешь содержимое счетчика, обнуляешь его и подсчет делаешь в главной программе. При следующем прерывании по захвату у тебя буде в счетчике значение соответствующее интервалу между импульсами. Однако есть возможность того, что программа не успеет посчитать, если частота входных импульсов будет высокой и предделитель таймера маленький или 1. Тогда следующий алгоритм.
2). В прерывании по захвату инвертируем какую-то переменную bool и по ней ореентируемся четное или не четное прерывание.
|
Это я попутно описываю что пронаблюдал.
Получается при тактировании 125000 Гц таймера первого(16битного) на холостых оборотах(у меня примерно 750 об/мин) разницав регистре ICR1 между первым входом в прерывание и вторым получается 700-1000 единиц(или 7000-10000, я много раз делил на 10 чтобы выводить на индикаторную шкалу). Ну и при повышении оборотов эта цифра уменьшается.
|
|
|
|
05.08.2016, 20:11
|
#73
|
Гражданин KAZUS.RU
Регистрация: 15.08.2010
Адрес: Днепр
Сообщений: 842
Сказал спасибо: 74
Сказали Спасибо 199 раз(а) в 174 сообщении(ях)
|
Re: Спидометр атмега 8
Сообщение от miwutka
|
Это я попутно описываю что пронаблюдал.
Получается при тактировании 125000 Гц таймера первого(16битного) на холостых оборотах(у меня примерно 750 об/мин) разницав регистре ICR1 между первым входом в прерывание и вторым получается 700-1000 единиц(или 7000-10000, я много раз делил на 10 чтобы выводить на индикаторную шкалу). Ну и при повышении оборотов эта цифра уменьшается.
|
miwutka, что-то я не пойму твоих расчетов. Там намного все проще. Привожу пример для спидометра.
1) Ты находишь количество тиков между импульсами. Неважно как, или разница, или сбросом счетчика после каждого раза.
2) Вычисляешь длительность между импульсами:
длительность такта таймера * кол. тиков = Т(и-и)
3)Ты писал у тебя 6 импульсов на один метр пути или на оборот колеса. Прикинь более точный размер. Это будет влиять на точность тоже. Если L = 1 m:
1m/6имп.=0,1(6). - Это не обязательно делать программно можно посчитать один раз и загнать в константу.
4) У нас есть расстояние в метрах и время в секундах вычисляем скорость в метрах в секунду:
0,1(6)/Т(и-и)=V(сек).
5)И переводим в км/ч. для этого умножаем на 3600 (сек. в часе) и делим на 1000 (метров в километре) или то же самое, что просто умножаем 3,6.
Все сохраняем в переменную, например speed, потом преобазуем в строковую константу и выводим на дисплей.
P.S. То же самое делаем и для спидометра, только вместо количества импульсов и расстояния вставлявем количество импульсов на оборот.
Последний раз редактировалось МВА; 05.08.2016 в 20:15.
|
|
|
|
05.08.2016, 20:25
|
#74
|
Почётный гражданин KAZUS.RU
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
|
Re: Спидометр атмега 8
Сообщение от makakus
|
for (i=0; i‹20; i++) rpm+=tahom[i]; rpm*=16;
|
Незнаю почему, но у меня через FOR почему-то не работало )))) но я делал в cvavr компиляторе. А в студии через фор работает )))
|
|
|
|
05.08.2016, 20:30
|
#75
|
Почётный гражданин KAZUS.RU
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
|
Re: Спидометр атмега 8
МВА, спидометр работает. Вот так... :
PHP код:
|
ISR(TIMER1_OVF_vect) { x_speed++; x=0; y=0; z=0; t=0; speed=0; if (x_speed › 1) {speed_sr=0;x_speed=0;} }
ISR(TIMER1_CAPT_vect) { x_speed=0; count_imp++; if (count_imp==6) {metres++;count_imp=0;} if (metres›999) { kilometres++; metres=0; if (kilometres == 10000) kilometres=0; km1++; if (km1 == 10) { km1 = 0; km10++; if (km10 == 10) { km10 = 0; km100++; if (km100 == 10) { km100 = 0; km1000++; if (km1000 == 10) { km1000 = 0; km10000++; if (km10000 == 10) { km10000 = 0; km100000++; if (km100000 == 10) { km100000 = 0; km10000 = 0; km1000 = 0; km100 = 0; km10 = 0; km1 = 0; } } } } } } } if(x==0) //в первый заход считываем таймер в переменную х { x=ICR1; } else //во второй заход считываем в y, находим разницу { y=ICR1; z=(y-x); x=y; t=125000/z; speed=t*0.6;//умножаю и получаю сразу км/ч speed_temp+=speed; i_speed++; if (i_speed == 10) { i_speed=0; speed_sr=speed_temp*0.1; speed_temp=0; if (speed_sr ›=999) speed_sr = 999; } } }
|
А вот тахометр не захотел почему то. Может тут подскажите что тут изменить...
Если я использую этот алгоритм, то на холостых показывает например 1000 об, а когда повышаются обороты, то отображение пропорционально уменьшается )))
Последний раз редактировалось miwutka; 05.08.2016 в 20:41.
|
|
|
|
05.08.2016, 21:08
|
#76
|
Гражданин KAZUS.RU
Регистрация: 15.08.2010
Адрес: Днепр
Сообщений: 842
Сказал спасибо: 74
Сказали Спасибо 199 раз(а) в 174 сообщении(ях)
|
Re: Спидометр атмега 8
Сообщение от miwutka
|
А вот тахометр не захотел почему то. Может тут подскажите что тут изменить...
Если я использую этот алгоритм, то на холостых показывает например 1000 об, а когда повышаются обороты, то отображение пропорционально уменьшается )))
|
Ох, что-то мозги отказываются понимать. Эти кучи if это такое преобразование в разряды? И почему ты частоту тактирования делишь на количество выборок? И что за магическое число 0,6?
Для того, чтобы перевести int To char и наоборот, есть в библиотеке stdlib.h функции atoi(str) и
void* itoa(int input, char *buffer, int radix)
Последний раз редактировалось МВА; 05.08.2016 в 21:13.
|
|
|
|
05.08.2016, 21:40
|
#77
|
Почётный гражданин KAZUS.RU
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
|
Re: Спидометр атмега 8
Сообщение от МВА
|
Для того, чтобы перевести int To char и наоборот, есть в библиотеке stdlib.h функции atoi(str) и
void* itoa(int input, char *buffer, int radix)
|
Буду знать )))
Сообщение от miwutka
|
t=125000/z;
|
Я наверно не правильно понял работу захвата.....
Сообщение от МВА
|
И что за магическое число 0,6?
|
я его получил когда переводил км/ч в м/с. И чтобы не делить заменил умножением.
я регистр ICR похоже не правильно использую. Я думал что в нем тоже тикает счет как в TCNT1..... Чтото я загнался маленько .....
|
|
|
|
05.08.2016, 22:52
|
#78
|
Гражданин KAZUS.RU
Регистрация: 15.08.2010
Адрес: Днепр
Сообщений: 842
Сказал спасибо: 74
Сказали Спасибо 199 раз(а) в 174 сообщении(ях)
|
Re: Спидометр атмега 8
Сообщение от miwutka
|
Буду знать )))
Я наверно не правильно понял работу захвата.....
я его получил когда переводил км/ч в м/с. И чтобы не делить заменил умножением.
я регистр ICR похоже не правильно использую. Я думал что в нем тоже тикает счет как в TCNT1..... Чтото я загнался маленько .....
|
Я описал алгоритм подсчета. Это задачка максимум для 8 класса. Сегодня уже некогда, а завтра подкину проект в АVR Studio.
|
|
|
|
06.08.2016, 09:55
|
#79
|
Заблокирован
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,220 раз(а) в 1,319 сообщении(ях)
|
Re: Спидометр атмега 8
Сообщение от miwutka
|
Я наверно не правильно понял работу захвата.....
|
Захват - это просто значение таймера, получившееся между двумя фронтами входного сигнала. По одному фронту таймер запускается на счет от 0, по другому фронту значение таймера, до которого он успел досчитать, переписывается в регистры результата и таймер перезапускается заново. Значение результата таймера - численно выражает период между фронтами.
Например, таймер инкрементируется с частотой 1 кГц (каждую 1 мс). Если в результате захвата получилось значение 1000, значит, прошла 1000 х 0,001 = 1 с между фронтами входного сигнала. Всё ведь просто.
|
|
|
|
06.08.2016, 10:56
|
#80
|
Почётный гражданин KAZUS.RU
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
|
Re: Спидометр атмега 8
NewWriter, я в инете скопипастил чужой код. Вроде с радиокота про этот тахометр. Но вот теперь начинаю понимать как оно работает..... У меня генереатора частоты нету, может ща в протеусе сделаю схемку и буду менять частоту чтобы всё отследить..... У меня есть 4кгц шим и 1 кгц с осциллографа. Пока на них проверяю.
Я не дочитал вот этого:
Сообщение от NewWriter
|
По одному фронту таймер запускается на счет
|
Сообщение от NewWriter
|
по другому фронту значение таймера, до которого он успел досчитать, переписывается в регистры результата и таймер перезапускается заново.
|
Выходит что мне таймер на частоте 125000 ГЦ и не нужно запускать. и 7кгц хватит с головой..... На тахометре импульсы выше 1 кгц не будут ити полюбому
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 22:05.
|
|