программная реализация тахометра для atmega8
- Сообщения: 10
- Зарегистрирован: Вт янв 15, 2013 17:52:48
доброго времени суток. решил создать проект: управление хх карбюраторного двигателя. создать схему и спаять для меня совсем не проблема. так как манипуляции с аналоговыми цеппями приведут к созданию громоздкой и ненадежной схемы, то решил создать схему на микроконтроллере, и, так как я часто возился с 8мегой, то и решил собрать на ней. но как всегда бывает, всякий лучший путь создает свои проблемы, потому что я почти не умею программы, ввиду очень малой практики в написании. поэтому нужна помощь одаренных светлыми знаниями языка си. нужна программа для подсчета оборотов коленвала с подробными комментариями без вывода результата на какой либо индикатор, для изучения и реализации в проекте. достаточно будет получить переменную с записанной в нее результатом. немного о схеме: вход микроконтроллера 6 (таймер 0) подключен к датчику холла через опторазвязку. 4 импульса датчика холла за 1 оборот коленвала. заранее спасибо.
- Реклама
- Сообщения: 10
- Зарегистрирован: Вт янв 15, 2013 17:52:48
спасибо за ссылки, все просмотрел, но там алгоритмы замудренные: по первой ссылке для кого-то комментарии были лишними, из-за чего в программе месяц разбираться с переводчиками; по второй - прекрасная формула для подсчета, но алгоритм написан кусками, из-за чего тоже ничего для меня не понятно, да и везде присутствует вывод на индикатор, алгоритм из-за этого опять же в кусках, мне их с моими знаниями как минимум неделю безвылазно сидеть разбирать, чего конечно я не могу позволить изза семейного положения(дети не дадут, да и жена через какое-то время меня вместе с компом выкинет на улицу(образно выражаясь)).
- Сообщения: 502
- Зарегистрирован: Чт фев 16, 2012 19:00:11
заведите сигнал с датчика на вход ICP1. запустите таймер 1.
в прерывании переполнения увеличивайте старшую половину счетчика, в прерывании T1 capture в ICR1 получите младшую половину.
суммарно получится 32-битное значение счетчика.
обороты можно посчитать по формуле F_CPU * 60 / cnt.
в прерывании переполнения увеличивайте старшую половину счетчика, в прерывании T1 capture в ICR1 получите младшую половину.
суммарно получится 32-битное значение счетчика.
обороты можно посчитать по формуле F_CPU * 60 / cnt.
- Сообщения: 10
- Зарегистрирован: Вт янв 15, 2013 17:52:48
спасибо за подсказку, а нельзя ли это в виде куска программы предоставить, просто я все понял,вроде, но написать именнно это пока сам не смогу, сам же прошу чтоб ктото мне написал с комментариями для того чтоб я наглядно на примере все разобрал, сложновато мне по пальцам понимать такое.zöner писал(а):заведите сигнал с датчика на вход ICP1. запустите таймер 1.
в прерывании переполнения увеличивайте старшую половину счетчика, в прерывании T1 capture в ICR1 получите младшую половину.
суммарно получится 32-битное значение счетчика.
обороты можно посчитать по формуле F_CPU * 60 / cnt.
- Реклама
- Сообщения: 502
- Зарегистрирован: Чт фев 16, 2012 19:00:11
как-то так:
Код: Выделить всё
volatile uint16_t rpm; //об/мин
volatile uint32_t rpm_cnt; //счетчик таймера времени оборота
volatile uint16_t rpm_high_cnt; //старшая половина счетчика
//настройка таймеров
void rpm_setup() {
TCCR1A = 0;
TCCR1B = (1<<ICNC1)|(1<<CS10); //включить Timer1 capture, и подать сист.частоту на таймер
TIMSK |= (1<<TICIE1)|(1<<TOIE1); //включить прерывания от ICP и переполнения таймера 1
}
//прерывание захвата ICP1
ISR(TIMER1_CAPT_vect) {
//значение счетчика за 1 оборот
uint32_t cnt = ((uint32_t)rpm_high_cnt << 16) | ICR1;
//обнулить мл. и ст. счетчики таймера 1
TCNT1 = rpm_high_cnt = 0;
//пересчитать счетчик в обороты
rpm = (F_CPU * 60UL) / rpm_cnt;
}
//прерыавние переполнения Т1
ISR(TIMER1_OVF_vect) {
//увеличить старшую половину счетчика
if (rpm_high_cnt < 1000) {
rpm_high_cnt++;
}
}
- Сообщения: 10
- Зарегистрирован: Вт янв 15, 2013 17:52:48


