AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
17.07.2016, 11:50
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
|
Спидометр атмега 8
Добрый день. Сделал спидометр на ЖК. Работает, но показания плавают. Если едешь 80 то показывает 72-80... километраж считает четко.
PHP код:
|
long x=0,y=0,metres;
double t,z=0;
float speed;
int rpm;
ISR(TIMER1_OVF_vect)
{
x=0;
y=0;
z=0;
t=0;
speed=0;
rpm=0;
}
ISR(TIMER1_CAPT_vect)
{
count_imp++;
if (count_imp==6) {metres++;count_imp=0;}
if(x==0) //в первый заход считываем таймер в переменную х
{
x=ICR1;
}
else //во второй заход считываем в y, находим разницу
{
y=ICR1;
//ICR1=0;
//TCNT1=0;
z=(y-x);
x=y;
t=125000/z;
speed=t*0.6;
rpm=speed;
}
}
в майне таймер так настроен:
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 125,000 kHz
// Mode: Normal top=0xFFFF
// OC1A output: Disconnected
// OC1B output: Disconnected
// Noise Canceler: Off
// Input Capture on Rising Edge
// Timer Period: 0,52429 s
// Timer1 Overflow Interrupt: On
// Input Capture Interrupt: On
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=(0‹‹COM1A1) | (0‹‹COM1A0) | (0‹‹COM1B1) | (0‹‹COM1B0) | (0‹‹WGM11) | (0‹‹WGM10);
TCCR1B=(0‹‹ICNC1) | (1‹‹ICES1) | (0‹‹WGM13) | (0‹‹WGM12) | (0‹‹CS12) | (1‹‹CS11) | (1‹‹CS10);
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
ну и в вайле:
eeprom_update_word(&eeprom_metres,metres);
eeprom_update_word(&eeprom_kilometres,kilometres);
//TODO:: Please write your application code
if (clear==0) {clear=1;lcd_clear();};
sprintf(lcd_buffer, "%3i %5i %5i ",metres,x,y); //t0
sprintf(lcd_buffer2,"s=%2.2f %2.2f",speed,t);
lcd_gotoxy(0,0);
lcd_putstring(lcd_buffer);
lcd_gotoxy(0,1);
lcd_putstring(lcd_buffer2);
|
Я чтото не так считаю. Подскажите плиз. Если на вход захвата завожу шим сигнал то всё идеально показывает.....
|
|
|
|
17.07.2016, 16:01
|
|
Гражданин KAZUS.RU
Регистрация: 13.06.2005
Адрес: РК г.Павлодар
Сообщений: 866
Сказал спасибо: 99
Сказали Спасибо 216 раз(а) в 140 сообщении(ях)
|
Re: Спидометр атмега 8
Во первых исключить дребезг при захвате.
Во вторых погуглите что такое скользящие среднее.
__________________
Не ошибается лишь тот, кто ни чего не делает!
Последний раз редактировалось woroba; 17.07.2016 в 16:04.
|
|
|
|
17.07.2016, 18:02
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
|
Re: Спидометр атмега 8
Сообщение от woroba
|
скользящие среднее.
|
Я так понял что это не интегрирование...?
|
|
|
|
17.07.2016, 18:24
|
|
Прописка
Регистрация: 05.12.2008
Адрес: Россия, Омск
Сообщений: 145
Сказал спасибо: 39
Сказали Спасибо 29 раз(а) в 22 сообщении(ях)
|
Re: Спидометр атмега 8
Простейший фильтр Калмана:
Значение = Измерение * (1 - N) + СтароеЗначение * N
Где N = 0...1 (вещественное).
Например, при 0.5 результат придёт к точному значению за 4-5 выборок.
При N = 0.25 - более чем за 8, зато скачки показаний будут очень незначительными.
|
|
|
|
17.07.2016, 18:40
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: Спидометр атмега 8
Не нужен ему Калман. Оно и так должно работать.
|
|
|
|
18.07.2016, 23:04
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
|
Re: Спидометр атмега 8
Есть вопрос. Подскажите как вот такое решить как опишу ниже.
Вот имеем число со спидометра. Создаем массив speed[10] и переменную где будет значение для индикации speed_ind=0.
Получаем первое значение speed[0]=10. speed_ind=speed[0]/1;
Получаем второе значение speed[1]=10. speed_ind=speed[0]+speed[1]/2;
Получаем третье значение speed[2]=10. speed_ind=speed[0]+speed[1]+speed[2]/3;
...............
И так до десяти. (эту часть через оператор for можно сделать по идее)
Потом чтобы 11-ое значение записалось в 10-ый массив то есть чтобы весь массив на один сдвинулся вниз и самый последний вылетел.
Это наверно как-то через указатель нужно? Я думаю так будет хороший фильтр и без особой задержки.....
|
|
|
|
18.07.2016, 23:40
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
|
Re: Спидометр атмега 8
-Alan-, Вот на последней странице оно?? https://kazus.ru/forums/showthread.php?t=18861&page=6
А то проинтегрировав 0.1 сек то всеравно плавают показания каждые 3-5 сек
|
|
|
|
20.07.2016, 11:26
|
|
Гражданин KAZUS.RU
Регистрация: 16.06.2005
Сообщений: 943
Сказал спасибо: 25
Сказали Спасибо 174 раз(а) в 123 сообщении(ях)
|
Re: Спидометр атмега 8
Для начала следует установить Noise Canceler в on.
|
|
|
|
20.07.2016, 12:26
|
|
Вид на жительство
Регистрация: 11.08.2015
Сообщений: 408
Сказал спасибо: 17
Сказали Спасибо 37 раз(а) в 28 сообщении(ях)
|
Re: Спидометр атмега 8
Сообщение от miwutka
|
ISR(TIMER1_OVF_vect)
{
****x=0;
****y=0;
****z=0;
****t=0;
****speed=0;
****rpm=0;
}
|
- зачем инициализацию переменных проводить в ISR(Interrupt Service Routine) по переполнению таймера 1? По-моему это делается в функции InitVariables()(можно вообще функцию не делать) в начале Maina.
|
|
|
|
20.07.2016, 14:39
|
|
Вид на жительство
Регистрация: 11.08.2015
Сообщений: 408
Сказал спасибо: 17
Сказали Спасибо 37 раз(а) в 28 сообщении(ях)
|
Re: Спидометр атмега 8
Чуваки, за какое время колесо совершает один оборот?
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 15:07.
|
|