Тахометр на AVR...

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
BARS_
Открыл глаза
Сообщения: 44
Зарегистрирован: Вт июн 14, 2011 18:01:10
Откуда: г. Таганрог

Re: Тахометр на AVR...

Сообщение BARS_ »

Что-то никак не могу до конца разобраться с тахометром. Надо его еще как-то связать с динамической индикацией. Этой самой индикацией занят таймер TCNT1. Как сделать тахометр на таймере TCNT0 или TCNT2 ? Можете написать кусочек кода с пояснениями, а то я что-то совсем завис... :cry:

P.S.
Контроллер Mega16, тактируется от внутреннего генератора на 8 Мгц.
Аватара пользователя
МитяРа
Модератор
Сообщения: 11492
Зарегистрирован: Чт дек 11, 2008 14:52:26
Откуда: град Нижний

Re: Тахометр на AVR...

Сообщение МитяРа »

akl писал(а):Вы не учли тактность двигателя
А мя и не учитывал..
Просто ответил на вопрос, как перевести обороты в частоту.. :))
[img]http://radiokot.ru/forum/download/file.php?id=93376[/img][i][color=#000080][size=85]Между людьми возникает напряжение, если у них разный потенциал...[/size][/color][/i]
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: Тахометр на AVR...

Сообщение akl »

BARS_ писал(а):Что-то никак не могу до конца разобраться с тахометром. Надо его еще как-то связать с динамической индикацией. Этой самой индикацией занят таймер TCNT1. Как сделать тахометр на таймере TCNT0 или TCNT2 ? Можете написать кусочек кода с пояснениями, а то я что-то совсем завис... :cry:

P.S.
Контроллер Mega16, тактируется от внутреннего генератора на 8 Мгц.

Тема тахометров с завидной периодичностью вскакивает на форумах, поэтому проще дать ссылку, где есть и схемы и исходники, правда на ассемблере
viewtopic.php?f=20&t=24703
Несколько советов
- динамическую индикацию организовать на Т0 в режиме работы по переполнению с предделителем 64. При этом период индикации 4-х разрядов будет 8'000'000/(64*256)~488/4~122Гц
-тактирование лучше делать от кварца, причем, не обязательно с круглой частотой резонанса
- нарисуйте схему
Аватара пользователя
BARS_
Открыл глаза
Сообщения: 44
Зарегистрирован: Вт июн 14, 2011 18:01:10
Откуда: г. Таганрог

Re: Тахометр на AVR...

Сообщение BARS_ »

Вот схема, в которой я пытаюсь сделать тахометр. DS1307 и DS1820 пока из программы исключены.

1.JPG
(78.35 КБ) 618 скачиваний
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: Тахометр на AVR...

Сообщение pyzhman »

Куда столько индикаторов? :shock:
И при наличии стольких ног у мк начерта еще дополнительные микросхемы?
И где сигнал о вращении?
Docendo discimus
Аватара пользователя
BARS_
Открыл глаза
Сообщения: 44
Зарегистрирован: Вт июн 14, 2011 18:01:10
Откуда: г. Таганрог

Re: Тахометр на AVR...

Сообщение BARS_ »

Я просто хотел на первый индикатор вывести время, на второй температуру. (это мне удалось сделать) А потом сделать переключение на тахометр, либо в автомате, либо кнопку поставить. А микросхемы поставил, чтобы научиться с ними работать, да и свободные выводы никогда не помешают :)

Сигнал о вращении будет приходить на один из выводов внешних прерываний, только пока не решил на какой. Тахометр пока проходит испытания в Протеусе. Точнее будет проходить, когда кто-нибудь с кодом поможет разобраться :)

P.S.
Возможно добавится измерение напряжение, АЦП уже пробовал запускать, работает :))
clawham
Поставщик валерьянки для Кота
Сообщения: 1957
Зарегистрирован: Пт окт 31, 2008 09:38:55
Откуда: Одесса
Контактная информация:

Re: Тахометр на AVR...

Сообщение clawham »

а чем не нравятся экранчики на 44780? тоесть символьные?
например 20 столбцов 4 строки? там можно будет все параметры сразу выводить :)
и всятаки у меня вот есть частотомер с задаваемым с меню коэффициентом
и в общий пробег записываться будет то что зададите другим коэффициентом...всё в еепроме сохраняется....деталей внешних минимум....частота входа от 1 импульса в 10 минут и до 20 мегагерц....с соответствующей высокой точностью!
плюс есть меню выставления порога предупреждения о превышении максимальной частоты/оборотов в минуту/мощности :)
температуру и прочие игрушки дописать как бы совсем не проблема помоему...только нужно будет чтото выкинуть....или базу данных 20-ти раздельных расходов или ещё чтото...
зато всё влезает в мегу8

viewtopic.php?f=20&t=46464&start=160
Что нас не убило сделало нас осторожней
Не доверяйте русским лужам - это может быть вход в метро.
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: Тахометр на AVR...

Сообщение pyzhman »

BARS_ писал(а):Возможно добавится измерение напряжение

Не возможно, а надо делать! Очень удобно.
Docendo discimus
Аватара пользователя
BARS_
Открыл глаза
Сообщения: 44
Зарегистрирован: Вт июн 14, 2011 18:01:10
Откуда: г. Таганрог

Re: Тахометр на AVR...

Сообщение BARS_ »

Экран очень нравится, и работать с ним проще. Но хотелось бы когда-нибудь засунуть данное устройство в машину, а экран мне там поставить некуда. Поэтому решил сделать на маленьких индикаторах. :)

А вы не могли бы помочь мне разобраться с кодом? Особо большая точность измерений не нужна...
Аватара пользователя
BARS_
Открыл глаза
Сообщения: 44
Зарегистрирован: Вт июн 14, 2011 18:01:10
Откуда: г. Таганрог

Re: Тахометр на AVR...

Сообщение BARS_ »

pyzh_man писал(а):
BARS_ писал(а):Возможно добавится измерение напряжение

Не возможно, а надо делать! Очень удобно.

С измерением напряжения проблем не возникло, там все понятно :) А вот тахометр...
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: Тахометр на AVR...

Сообщение pyzhman »

Отписал в лс. Не судите строго. :)
Docendo discimus
clawham
Поставщик валерьянки для Кота
Сообщения: 1957
Зарегистрирован: Пт окт 31, 2008 09:38:55
Откуда: Одесса
Контактная информация:

Re: Тахометр на AVR...

Сообщение clawham »

мог бы и помочь....что именно у Вас не получается?
вообще-то я категорически ненавижу эти 7-мисегментники и динамическую индикацию в частности....ибо с этой индикацией да на такое большое кол-во экранов вы получите никакую яркость и не сможете с термометром работать нормально!
для себя я купил сдвиговиков с инверсными силовыми 1 амперными 40-вольтовыми выходами(когда в него записана 1 - то выход посадился на землю) и в сдвиговике ровно байт этих выходов...получается козле каждого одного сегмента по этому сдвиговику, 8 смд резюков и всё
их паровозиком друг за другом цепляеш по 3-м проводам....4-й вход енабле оут - одщий для всей линейки идёт сразу на ногу PWM проца - яркость регулируется...неимоверно удобно
экранчик 20х4 всегда есть куда вставить - вместо пепельницы например встаёт на ура в 90% случаев....или в торпеду врезается просто окошком...тоже не беда...

динамическая индикация(как самогон) эт зло...гоните её :)

в общем частоты до 1 килогерца разумнее измерять длительностью импульса...
по прерыванию перезапускать счетчик любой с переполнением на 16 мегагерцах работающий и запоминать его значения...а в основном цикле на основании значений счетчика запомненных расчитывать частоту делением....а дальне умножаем на коэффициент перевода 1 герца в 1 км/ч и на экран...
только как дойдёт до реализации повылазиет туча неприятностей в виде ограничений разрядности переменных в точности флоатов а особенно в попытке вывести влоат на экран...эт просто АД...но....можете брать мой исходничек и смотреть если что надо...именно измерительная часть там просто супер...по крайней мере ваттметр(принцип - 1 герц=100 ватт) прекрасно рабоатет и 0.3 ватта показывает и изменения красиво отслеживаются и 7 киловатт чудесно отрабатываает...кроме того ещё туча расходомеров есть(для вас - моточасы/номинальное кол-во млн оборотов до смены масла и т.д.)
впрочем атк же само можно ловить и импульсы от оборота колеса и тут уже скорость машины и общий пробег....в общем полёт фантазии...
моя аська 2914128 - если что - обращайтесь
Что нас не убило сделало нас осторожней
Не доверяйте русским лужам - это может быть вход в метро.
Аватара пользователя
МитяРа
Модератор
Сообщения: 11492
Зарегистрирован: Чт дек 11, 2008 14:52:26
Откуда: град Нижний

Re: Тахометр на AVR...

Сообщение МитяРа »

Вместо динамической индикации можно применить статическую на сдвиговых регистрах..
Наращивать разрядность можно до бесконечности.. Да и индикация не будет мешаться при измерениях..
[img]http://radiokot.ru/forum/download/file.php?id=93376[/img][i][color=#000080][size=85]Между людьми возникает напряжение, если у них разный потенциал...[/size][/color][/i]
Аватара пользователя
BARS_
Открыл глаза
Сообщения: 44
Зарегистрирован: Вт июн 14, 2011 18:01:10
Откуда: г. Таганрог

Re: Тахометр на AVR...

Сообщение BARS_ »

clawham писал(а):мог бы и помочь....что именно у Вас не получается?
вообще-то я категорически ненавижу эти 7-мисегментники и динамическую индикацию в частности....ибо с этой индикацией да на такое большое кол-во экранов вы получите никакую яркость и не сможете с термометром работать нормально!


Яркость как раз получилась отличная, даже пришлось ШИМ регулировку сделать, а то ночью слепит. Только вот подергиваются при работе с термодатчиками...

Всё таки хотелось бы сделать на динамической индикации, т.к. индикаторы становятся в приборную панель... Если не получится, то с дисплеем буду делать...

Можете дать ту часть кода, которая измеряет обороты и настройки таймеров? :)
Аватара пользователя
МитяРа
Модератор
Сообщения: 11492
Зарегистрирован: Чт дек 11, 2008 14:52:26
Откуда: град Нижний

Re: Тахометр на AVR...

Сообщение МитяРа »

Мяу, clawham а модельку своих мощных "сдвиговиков" подскажи, пожалуйста.. :)
[img]http://radiokot.ru/forum/download/file.php?id=93376[/img][i][color=#000080][size=85]Между людьми возникает напряжение, если у них разный потенциал...[/size][/color][/i]
clawham
Поставщик валерьянки для Кота
Сообщения: 1957
Зарегистрирован: Пт окт 31, 2008 09:38:55
Откуда: Одесса
Контактная информация:

Re: Тахометр на AVR...

Сообщение clawham »

Сдвиговики из этой серии http://focus.ti.com/paramsearch/docs/pa ... STRY_PGE_T
я уже не помню точно модель tpic6a595 помоему....сдвиговик + защелка + выходные драйвера + диоды....я на них и релюшки 24 вольтовые вешаю напрямую...крутая весч...

а по поводу кода....кхм....тяжелый вопрос....когда дело касается на 99.9% заполненного процессора все тексты которого вынесены в еепром с целью сэкономить хотя бы байт....

ну в общем вот....некоторые фрагменты....

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

#define TimerStop   TCCR1B=0x00;
#define TimerStart  TCCR1B=0x01;
bit intenabled  = 1;

unsigned long int   g1     = 0;
unsigned int        g2     = 0;

unsigned int        Time    =0;
unsigned char       SecTmp  = 0;
unsigned long int   Sec     = 0;
unsigned long int   OldSec = 0;

unsigned long int PeriodA = 0;
unsigned char     PeriodB = 0;

bit PeriodUpdated = 0;

interrupt [EXT_INT1] void ext_int1_isr(void)
{
// Place your code here
    PeriodB = TCNT1;
    TCNT1   = 0;
    #pragma optsize++
    PeriodA = counter;
    counter = 0;
    PeriodUpdated = 1;   
}

interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
// Place your code here
counter+=1;
}

// Timer/Counter 1 initialization
    // Clock source: System Clock
    // Clock value: 8000,000 kHz
    // Mode: Normal top=FFFFh
    // OC1A output: Discon.
    // OC1B output: Discon.
    // Noise Canceler: Off
    // Input Capture on Falling Edge
    // Timer1 Overflow Interrupt: On
    // Input Capture Interrupt: Off
    // Compare A Match Interrupt: Off
    // Compare B Match Interrupt: Off
//    TCCR1A=0x00;
    TCCR1B=0x01;
//    TCNT1H=0x00;
//    TCNT1L=0x00;
//    ICR1H=0x00;
//    ICR1L=0x00;
//    OCR1AH=0x00;
//    OCR1AL=0x00;
//    OCR1BH=0x00;
//    OCR1BL=0x00;


    // Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK=0x85;

float GetPeriod(unsigned long int H_f, unsigned int L_f)
{
    float t;           
    if(H_f<MaxOverflows)
    {   
        tmp=H_f;
        tmp=65536*tmp;
        tmp=tmp+L_f+11;

        t = ClocksPerSec;
        t = t / tmp;
        t = t * WattsPerHz;
        return t;
    }
    else
    {
        // наверное перебор по счетчику...это минимум...перезапустим а на экран ноль
        PeriodB = PeriodA = 0;
        TCNT1   = 0;
        counter = 0;
        PeriodUpdated = 1;
        return 0;
    }

}

// если текущее положение - конец конверсии то...
                if(PeriodUpdated)                                     
                {
                    //#asm("wdr");
                    // считаем что наконвертировали по периоду
                    ByPeriod = GetPeriod(PeriodA, PeriodB);
                       
                    LastPeriod = ByPeriod;
                       
                    // разрешаем новую конверсию
                    PeriodUpdated = 0;
                }

                        // если не нажата то отрабатываем стандартный экран
                        // посчитаем минимальную мощность для метода замера длительности
                        // она равна ваттам в герц поделить на время таймаута
                        MinPeriodedWatts = maxawg*WattsPerHz;
                           
                        // смотрим а не перевалило ли нас за 10000 ватт(тоесть

                            // считаем вывод на экран
                            // считаем по кол-ву импульсов
                            ToDisplay=0;
                            //summawg = 0;
                                   
                            // суммируем кол-во тиков за всё время
                            //lcd_gotoxy(0,1);
                            for(a=0;a<maxawg;a++)
                            {
                                    ToDisplay += awg[a];
                                    //lcd_putchar(' ');
                            }
                                       
                            // считаем кол-во тиков в секунду

                            ToDisplay = ToDisplay / maxawg;
                            ToDisplay = ToDisplay * 8.0 * WattsPerHz;
                            //ToDisplay = ToDisplay ;
                               
                            // теперь смотрим... если прерывания были выключены
                            if(intenabled!=1)
                            {
                                //проверяем а не малова-то ли импульсов натикало
                                if(ToDisplay<MinPeriodedWatts)
                                {
                                    // а натикало меньше 100 ватт ....
                                    // включаем прерывание - будем мерять по длине                               
                                    intenable();
                                    intenabled = 1;
                                    //clearawg();
                                    // теперь считаем последние вычисленные мощности в длительность
                                    //LastPeriod = ToDisplay;
                                }
                                // если натикало достаточно не меняем ничего - выведем результат
                                LastPeriod = ToDisplay;
                            }
                            else
                            {
                                // если же прерывание было включено
                                // проверим не слишком ли мал период
                                if(ByPeriod>MinPeriodedWatts)
                                {
                                    // мал... выключаем прерывание а на экран выведется мощность
                                    // исходя из колличества импульсов
                                    //intdisable();
                                   
                                    #asm("cli");
                                    GICR|=0x40;
                                    GIFR=0x40; 
                                    #asm("sei");
                                   
                                    intenabled = 0;
                                }
                                else
                                {
                                    // малая мощность - выводим данные из длительности периода
                                    CurrentPeriod = GetPeriod(counter, TCNT1);
                                    if(LastPeriod>CurrentPeriod)
                                        ToDisplay = CurrentPeriod;
                                    else                     
                                        ToDisplay = LastPeriod;
                                }
                            } 
                           





вот как-то так....суть от этого не меняется....таймер 16-тибитный рабоатет на 16 мегагерцах и прерывание по переполнению....каждый раз по прерыванию внешнего источника я снимаю показания этого таймера записывая в пром-переменную а его обнуляю....и пошел он дальше...а потом в основном цикле смотрю не превысили ли мы допустимую частоту для этого режима...если превысили - переходим к измерению частоты по колличеству импульсов за определенный период..для повышения плавности и точности применен ФИФО буффер .... в который 8 раз в секунду попадает результат колличества наклацанных аппаратным таймером тиков...таймер тактуется внешним источником без предделителей......

вот в принципе и всё....

а динамическая индикация это ужос...на неё лучше выделить отдельный МК типа тиньки 2313 и связать с основным мк через SPI ... наверное только так....хотя можно конечно 1-wire заставить не сбивать динам индикацию...но....тогда из 100-200 замеров только пара будет достоверные...
Что нас не убило сделало нас осторожней
Не доверяйте русским лужам - это может быть вход в метро.
Аватара пользователя
МитяРа
Модератор
Сообщения: 11492
Зарегистрирован: Чт дек 11, 2008 14:52:26
Откуда: град Нижний

Re: Тахометр на AVR...

Сообщение МитяРа »

clawham писал(а):tpic6a595 помоему
Благодарствую, пушистый..
Походу это сильноточный вариант 595-го регистра.. :))
[img]http://radiokot.ru/forum/download/file.php?id=93376[/img][i][color=#000080][size=85]Между людьми возникает напряжение, если у них разный потенциал...[/size][/color][/i]
clawham
Поставщик валерьянки для Кота
Сообщения: 1957
Зарегистрирован: Пт окт 31, 2008 09:38:55
Откуда: Одесса
Контактная информация:

Re: Тахометр на AVR...

Сообщение clawham »

ну как бы да но распиновка вообще другая и .... он же инверсный!!! 1-ка прижимает выход к нулю :) а так то да...очень удобно...
кстати они есть сразу с 10-оммным резистором....можно навешивать светики вообще без резюков...главное питание подобрать чтоб не перевалить за допустимый ток....
Что нас не убило сделало нас осторожней
Не доверяйте русским лужам - это может быть вход в метро.
Аватара пользователя
BARS_
Открыл глаза
Сообщения: 44
Зарегистрирован: Вт июн 14, 2011 18:01:10
Откуда: г. Таганрог

Re: Тахометр на AVR...

Сообщение BARS_ »

Спасибо, сегодня вечером буду разбираться :))
Аватара пользователя
Serjinio
Родился
Сообщения: 6
Зарегистрирован: Чт мар 03, 2011 14:29:43

Re: Тахометр на AVR...

Сообщение Serjinio »

Уважаемые Коты! Нужны ваши советы и знания, задача следующая: на электродвигателе установлен вал, (диаметром 30 см.), который через ремень приводит в движение насос. Нужно сделать тахометр для регулировки оборотов электродвигателя. Можно ли использовать в качестве датчика, не датчик хола, а геркон? А ещё большая проблема как всегда в коде, перешарил много вариантов и сдесь на форуме и на других, понравился вот этот вариант http://samou4ka.net/page/spidometr-taho ... avr-chast1 он для мня показался более простым, но сдесь автор измерял скорость.


unsigned int temp=0;
unsigned int speed=0;
unsigned int Koeff=200;//значение калибровочного коэффициента в сантиметрах
unsigned long int Distance;

//прерывание по переполнению ТС1
ISR(TIMER1_OVF_vect)
{
//обнуляем значения
TCNT1 = 0;
speed=0;
}


//прерывание по захвату
ISR(TIMER1_CAPT_vect)
{
TCNT1 = 0;
temp=ICR1;//считываем значение регистра
if(temp!=0)
speed=((160000/temp)*Koeff)/100;//считаем скорость, делим на 100, чтобы перевести сантиметры в метры. 160000 вместо 16000, т.к. хочу учитывать и десятые скорости, а не только целое значение.
Distance+=Koeff;//увеличиваем расстояние на значение Koeff
}

Как изменить эту формулу чтобы измерять обороты а не скорость?

Буду рад любым советам и ответам

С уважением
Последний раз редактировалось Serjinio Вс апр 21, 2013 09:50:06, всего редактировалось 2 раза.
Ответить

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