Цифровой одометр на Atmega8

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
Antifritz
Прорезались зубы
Сообщения: 222
Зарегистрирован: Чт июл 08, 2010 01:03:40
Откуда: Украина, Киев

Re: Цифровой одометр на Atmega8

Сообщение Antifritz »

А вот в спидометре лучше замерять интервалы между импульсами (используем внешн. прерывания). Если мерять к-во импульсов за период будет большая погрешность.
Реклама
Аватара пользователя
yur4ik
Вымогатель припоя
Сообщения: 613
Зарегистрирован: Сб окт 17, 2009 18:56:05
Откуда: РФ, Башкортостан г.Сибай
Контактная информация:

Re: Цифровой одометр на Atmega8

Сообщение yur4ik »

Antifritz писал(а):Итак:
Timer/Counter0 может тактироваться только от ножки T0(от Т1 уже не может) и от тактовой МК+ предделитель
Timer/Counter1 может тактироваться только от ножки T1(от Т0 уже не может) и тактовой МК+ предделитель?
Timer/Counter1 может тактироваться только от тактовой МК либо от внешнего кварца на ногах TOSC, при условии что сам МК тактируется внутренним RC генератором.
Можно узнать для чего какой таймер планируется использовать?

Кварц типа сам появляется если выбрано тактирование от внешнего кварца, никаких генераторов и кварцов в протеусе цеплять не нужно все частоты указываются в свойствах МК(тактовая и TOSC)
Timer/Counter1 это TIMER1? блин я в этих названия уже запутался полностью :roll: если да то хотел чтобы считал до 1 секнды и потом выводил на экран скорость и частоту
Нельзя всё знать, достаточно понимать.
Реклама
Аватара пользователя
yur4ik
Вымогатель припоя
Сообщения: 613
Зарегистрирован: Сб окт 17, 2009 18:56:05
Откуда: РФ, Башкортостан г.Сибай
Контактная информация:

Re: Цифровой одометр на Atmega8

Сообщение yur4ik »

Antifritz писал(а):А вот в спидометре лучше замерять интервалы между импульсами (используем внешн. прерывания). Если мерять к-во импульсов за период будет большая погрешность.
то есть использовать захват?
Нельзя всё знать, достаточно понимать.
Аватара пользователя
yur4ik
Вымогатель припоя
Сообщения: 613
Зарегистрирован: Сб окт 17, 2009 18:56:05
Откуда: РФ, Башкортостан г.Сибай
Контактная информация:

Re: Цифровой одометр на Atmega8

Сообщение yur4ik »

Antifritz, вы уж не обижайтесь на меня пожалуйста, прост и так новичек с мк, а еще уже не работал с мк уже с год наверно. че знал забыл уже :(
Нельзя всё знать, достаточно понимать.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Antifritz
Прорезались зубы
Сообщения: 222
Зарегистрирован: Чт июл 08, 2010 01:03:40
Откуда: Украина, Киев

Re: Цифровой одометр на Atmega8

Сообщение Antifritz »

Названия из даташита. Если будет часовой кварц на TOSCах, то думаю можно запустить МК от внутр. RC генератора на 8МГц и использовать таймер2 для отсчета всяких там интервалов или он для SPI нужен? Ну а таймером1 или 0 считать импульсы для тахометра. Для спидометра таймер выделять не нужно: получили прерывание(ноги INT0/INT1)-посмотрели "время" получили еще одно- опять посмотрели и высчитали разницу.
Реклама
Аватара пользователя
yur4ik
Вымогатель припоя
Сообщения: 613
Зарегистрирован: Сб окт 17, 2009 18:56:05
Откуда: РФ, Башкортостан г.Сибай
Контактная информация:

Re: Цифровой одометр на Atmega8

Сообщение yur4ik »

Antifritz писал(а):Названия из даташита. Если будет часовой кварц на TOSCах, то думаю можно запустить МК от внутр. RC генератора на 8МГц и использовать таймер2 для отсчета всяких там интервалов или он для SPI нужен? Ну а таймером1 или 0 считать импульсы для тахометра. Для спидометра таймер выделять не нужно: получили прерывание(ноги INT0/INT1)-посмотрели "время" получили еще одно- опять посмотрели и высчитали разницу.
я поначалу как раз и хотел использовать таймер 2 как таймер на 1 секунду а вот таймер0 как обычный счетчик, а таймер1 режим захвата.
а вот смотри основной цикл и таймеры они отдельно друг от друга работают или совместно?
похожу когда я инцилизирую таймер2 то он работает как от часового кварца потому что когда отрубаю его спи то работает
Нельзя всё знать, достаточно понимать.
Реклама
Аватара пользователя
Antifritz
Прорезались зубы
Сообщения: 222
Зарегистрирован: Чт июл 08, 2010 01:03:40
Откуда: Украина, Киев

Re: Цифровой одометр на Atmega8

Сообщение Antifritz »

Таймеры-это типа вообще отдельные устройства, работают сами по себе, единственное что они не могут работать с частотой, которая выше тактовой(например если такую подать на Т0/Т1/ТОSC), но я думаю - это пока не актуально. Насчет СПИ - без понятия, а может выкинуть его вообще? Перечитал еще раз- не понял, а что со СПИ не так?
Аватара пользователя
yur4ik
Вымогатель припоя
Сообщения: 613
Зарегистрирован: Сб окт 17, 2009 18:56:05
Откуда: РФ, Башкортостан г.Сибай
Контактная информация:

Re: Цифровой одометр на Atmega8

Сообщение yur4ik »

Antifritz писал(а):Таймеры-это типа вообще отдельные устройства, работают сами по себе, единственное что они не могут работать с частотой, которая выше тактовой(например если такую подать на Т0/Т1/ТОSC), но я думаю - это пока не актуально. Насчет СПИ - без понятия, а может выкинуть его вообще? Перечитал еще раз- не понял, а что со СПИ не так?
нее без спи не удобно будет считай на скоко быстрее можно работать с дисплеями :) я ща вот запустил таймер1 в режиме захвата а таймер0 в режиме счетчика захват норм работает а счетчик не очень
все вроде добил частота не скачет бывает на -1Гц а потом норм и то редкий раз
хотя не норм погрешность в 30 об/мин над как то убавить :) хоть я и не буду выводить на 7 сегментик последнюю цифру чтобы ночью не отвлекало, но могут быть и прыжки с 166(1660 об/мин) на 171(1710 об/мин) к примеру

Код: Выделить всё

interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
TCNT0=0xFE;
rp++;
}

interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
TCNT1 = 0;
speed=0;
}

interrupt [TIM1_CAPT] void timer1_capt_isr(void)
{
//2 000 000 Гц / 8 (TCCR1B=0x02;//clk/8) = 250 000 - чтобы досчитать до 1 сек 
TCNT1 = 0; 
brp=ICR1;                //считываем значение регистра
    if(brp!=0){  
       speed=250000/brp; //подготавливаем среднее значение 
}
}

interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
rpw++;
if(rpw==61){
TCCR2=0x00;
  rpw=0;
  rps=rp*30;
  rp=0;
TCCR2=0x06;
}
}

void main(void)
{
PORTB=0; 
DDRB=0x2C; //Настраиваем порт для SPI 

PORTC=0x01;
DDRC=0x00;

PORTC=0x00;
DDRC=0x00;

TCCR0=0x06;
TCNT0=0xFE;

TCCR1A=0x00;
TCCR1B=0x02;

GICR|=0x80;
MCUCR=0x08;
GIFR=0x80;

ASSR=0x00;
TCCR2=0x06;
TCNT2=0x00;
OCR2=0x00;

TIMSK=0x65;

ACSR=0x80; //Отключаем компаратор 
//Включаем SPI 
//Биты будем отправлять LSB-MSB, т.е. от младших к старшим 
SPCR=0x7C;
SPSR=0x00; 
Нельзя всё знать, достаточно понимать.
Аватара пользователя
yur4ik
Вымогатель припоя
Сообщения: 613
Зарегистрирован: Сб окт 17, 2009 18:56:05
Откуда: РФ, Башкортостан г.Сибай
Контактная информация:

Re: Цифровой одометр на Atmega8

Сообщение yur4ik »

как можно улучшить алгоритм чтобы не не было +-1Гц=(целых аж 30об/мин) режим захвата же норм работает(спидометр) может ну этот алгоритм временных ворот? может лучше запустить таймер и пришел сигнал взял значение таймера следующий импульс опять значение таймера отнял и вот он период. или тоже самое будет?
Нельзя всё знать, достаточно понимать.
Аватара пользователя
Antifritz
Прорезались зубы
Сообщения: 222
Зарегистрирован: Чт июл 08, 2010 01:03:40
Откуда: Украина, Киев

Re: Цифровой одометр на Atmega8

Сообщение Antifritz »

ДВС не такой уже и супер-пупер прибор, там и так частота гуляет тем более в большинстве случаев будет не целое число, а например 70,3Гц. Погрешность 1Гц появляется из-за того, что имульсы приходят не синхронно с работой таймера. А там именно и+1Гц и -1Гц (относительно правильной частоты) или только в одну сторону плывет? Когда-то делал частотомер, так там погрешность возникала еще и из-за того, что электронике нужно некоторое время чтобы включить таймер и считать/сбросить значение, решилось путем деления полученного значения на некоторую константу. Но одно дело измерять частоту кварца на 16Мгц, а другое дело ДВС, у которого частота на оооочень много меньшая. На стрелочных тахометрах цена деления 100об/мин, и то стрелка дергается, а вам +/-30 много. Вы же множите частоту на 60, так что цена деления не может быть меньше 60, так что скрывайте две последних цифры, пишите х100 и не парьтесь.
Аватара пользователя
yur4ik
Вымогатель припоя
Сообщения: 613
Зарегистрирован: Сб окт 17, 2009 18:56:05
Откуда: РФ, Башкортостан г.Сибай
Контактная информация:

Re: Цифровой одометр на Atmega8

Сообщение yur4ik »

Antifritz писал(а):ДВС не такой уже и супер-пупер прибор, там и так частота гуляет тем более в большинстве случаев будет не целое число, а например 70,3Гц. Погрешность 1Гц появляется из-за того, что имульсы приходят не синхронно с работой таймера. А там именно и+1Гц и -1Гц (относительно правильной частоты) или только в одну сторону плывет? Когда-то делал частотомер, так там погрешность возникала еще и из-за того, что электронике нужно некоторое время чтобы включить таймер и считать/сбросить значение, решилось путем деления полученного значения на некоторую константу. Но одно дело измерять частоту кварца на 16Мгц, а другое дело ДВС, у которого частота на оооочень много меньшая. На стрелочных тахометрах цена деления 100об/мин, и то стрелка дергается, а вам +/-30 много. Вы же множите частоту на 60, так что цена деления не может быть меньше 60, так что скрывайте две последних цифры, пишите х100 и не парьтесь.
-1Гц допустим 1500 1500 1500 ... 1470 1500 1500 1470
скрывать 2 последние цифры не очень хочется. собираюсь скрыть 1 младший разряд чтобы ночью не мешал. но вот в спидометре использую режим захвата но там все четко работает а тут не очень. щас вот есть свободное время буду пробовать сделать так сигнал поступил считал значение таймера, пришел второй сигнал считал значение таймера и потом уже частоту находить. также работает режим захвата?
Нельзя всё знать, достаточно понимать.
Аватара пользователя
yur4ik
Вымогатель припоя
Сообщения: 613
Зарегистрирован: Сб окт 17, 2009 18:56:05
Откуда: РФ, Башкортостан г.Сибай
Контактная информация:

Re: Цифровой одометр на Atmega8

Сообщение yur4ik »

Antifritz писал(а): Для спидометра таймер выделять не нужно: получили прерывание(ноги INT0/INT1)-посмотрели "время" получили еще одно- опять посмотрели и высчитали разницу.
а как получить значение таймера? использовать доп переменную?
Нельзя всё знать, достаточно понимать.
Аватара пользователя
Antifritz
Прорезались зубы
Сообщения: 222
Зарегистрирован: Чт июл 08, 2010 01:03:40
Откуда: Украина, Киев

Re: Цифровой одометр на Atmega8

Сообщение Antifritz »

yur4ik писал(а):
Antifritz писал(а): Для спидометра таймер выделять не нужно: получили прерывание(ноги INT0/INT1)-посмотрели "время" получили еще одно- опять посмотрели и высчитали разницу.
а как получить значение таймера? использовать доп переменную?
Типа того, сохранять значение таймера во время первого прерывания и сравнивать с тем, что во время следующего. Не забываем учитывать переполнения таймера.
Аватара пользователя
yur4ik
Вымогатель припоя
Сообщения: 613
Зарегистрирован: Сб окт 17, 2009 18:56:05
Откуда: РФ, Башкортостан г.Сибай
Контактная информация:

Re: Цифровой одометр на Atmega8

Сообщение yur4ik »

Antifritz писал(а):
yur4ik писал(а): а как получить значение таймера? использовать доп переменную?
Типа того, сохранять значение таймера во время первого прерывания и сравнивать с тем, что во время следующего. Не забываем учитывать переполнения таймера.
не не не... я похоже не совсем точно поставил вопрос :) возможно ли не заводя новую переменную узнать значение таймера? или значение таймера хранится в TCNTх? и вообще правильно ли я понимаю алгоритм того что нужно организовать. заводим переменную допустим tim и в таймере увеличиваем ее значение на 1 как пришел сигнал допустим на INT0 считываем значение переменной tim и обнуляем tim и второй раз так же и находим разницу. так ли это?
Нельзя всё знать, достаточно понимать.
Аватара пользователя
yur4ik
Вымогатель припоя
Сообщения: 613
Зарегистрирован: Сб окт 17, 2009 18:56:05
Откуда: РФ, Башкортостан г.Сибай
Контактная информация:

Re: Цифровой одометр на Atmega8

Сообщение yur4ik »

аааа я ща повешусь :kill:, сделал так:

Код: Выделить всё

interrupt [EXT_INT0] void ext_int0_isr(void)
{
rp++;
if (rp==1){rp1=TCNT0;TCNT0=0;}
if (rp==2){rp2=TCNT0;TCNT0=0;}
if (rp==3){
rp3=rp1-rp2;
rps=1953/rp3;
rp=0;
}
}
работает, но если подать частоту свыше 200Гц то врет на 25-40Гц но это скорее всего из-за того что не учитываю переполнение, но в таком виде начинает шалить режим захвата timer1, например подавая сигнал частотою 269 Гц он показывает 279 или 289 Гц
если все это выкинуть из EXT_INT0 и засунуть в основной бесконечный цикл

Код: Выделить всё

interrupt [EXT_INT0] void ext_int0_isr(void)
{
rp++;
}
.........
#asm("sei") 
while(1){
if (rp==1){rp1=TCNT0;TCNT0=0;}
if (rp==2){rp2=TCNT0;TCNT0=0;}
if (rp==3){
rp3=rp1-rp2;
rps=1953/rp3;
rp=0;
}
show_dig();
}

Код: Выделить всё


PORTB=0; 
DDRB=0x2C; //Настраиваем порт для SPI 

PORTC=0x01;
DDRC=0x00;

PORTC=0x00;
DDRC=0x00;

TCCR0=0x05;
TCNT0=0x00;

TCCR1A=0x00;
TCCR1B=0x02;

ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

GICR|=0x40;
MCUCR=0x02;
GIFR=0x40;

TIMSK=0x25;

ACSR=0x80; //Отключаем компаратор 
//Включаем SPI 
//Биты будем отправлять LSB-MSB, т.е. от младших к старшим 
SPCR=0x7C;
SPSR=0x00; 
тогда вот захват timer1 работает нормально, а мой так скажем режим захвата показывает какую то белеберду что то типа 5499, 8888,20,1020 и т.п. подавая разную частоту на вход числа уже другие . ЧТО ЭТО МОЖЕТ БЫТЬ И КАК ЭТО РЕШИТЬ?
Нельзя всё знать, достаточно понимать.
Аватара пользователя
yur4ik
Вымогатель припоя
Сообщения: 613
Зарегистрирован: Сб окт 17, 2009 18:56:05
Откуда: РФ, Башкортостан г.Сибай
Контактная информация:

Re: Цифровой одометр на Atmega8

Сообщение yur4ik »

ааа вроде понял свой касяк зав попробую исправить :)
Нельзя всё знать, достаточно понимать.
Le_Fleurs
Встал на лапы
Сообщения: 101
Зарегистрирован: Ср май 09, 2012 23:32:22
Откуда: Культурная столица

Re: Цифровой одометр на Atmega8

Сообщение Le_Fleurs »

Ребята ну что как успехи запустить смогли? А схемку в lay не подкинете? И фото готового устройства?
Аватара пользователя
CyberVad
Встал на лапы
Сообщения: 142
Зарегистрирован: Сб дек 24, 2011 12:39:03

Re: Цифровой одометр на Atmega8

Сообщение CyberVad »

Le_Fleurs писал(а):Ребята ну что как успехи запустить смогли? А схемку в lay не подкинете? И фото готового устройства?
А вот зацените-ка моё творение, делал сыну на велек: http://vk.com/album19027586_159160096
Вышел из себя.
Пришел в себя.
Ушел в себя.
И решил больше сегодня никуда не ходить
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: Цифровой одометр на Atmega8

Сообщение vitalik_1984 »

Нифига себе бортовой компьютер, я вот тоже думал с дисплеем 16х2 сделать только сомневался, что большеват будет.


Тема так то вообще супер.Ухохотался над кодом.Как чувак код в протеусе гоняет, когда у него прерывание в майне оформлено.Как только вообще компиляция прошла?
Ржал над тем, что 1000 импульсов в секунду *60 это 1000оборотов в минуту для одноцилиндрового двигателя. Похоже еще и двухтактного :)))
В поисках истины человек развивается.
Аватара пользователя
yur4ik
Вымогатель припоя
Сообщения: 613
Зарегистрирован: Сб окт 17, 2009 18:56:05
Откуда: РФ, Башкортостан г.Сибай
Контактная информация:

Re: Цифровой одометр на Atmega8

Сообщение yur4ik »

vitalik_1984 писал(а):Нифига себе бортовой компьютер, я вот тоже думал с дисплеем 16х2 сделать только сомневался, что большеват будет.


Тема так то вообще супер.Ухохотался над кодом.Как чувак код в протеусе гоняет, когда у него прерывание в майне оформлено.Как только вообще компиляция прошла?
Ржал над тем, что 1000 импульсов в секунду *60 это 1000оборотов в минуту для одноцилиндрового двигателя. Похоже еще и двухтактного :)))
ну посоветуй тогда как надо :)
Нельзя всё знать, достаточно понимать.
Ответить

Вернуться в «AVR»