Помогите с разработкой устройства тахометр+вольтметр+таймер
- gonzales06
- Встал на лапы
- Сообщения: 87
- Зарегистрирован: Сб сен 01, 2007 18:32:42
- Откуда: Санкт-Петербург
- Контактная информация:
Ну вот устройство готово на на 50%.
Тикает таймер, показывая на ЖК минуты и секунды.
Ниже высвечиваятся обороты( Сигнал падается от другог МК с заданной частотй, испытания на двигателе запланированы на выходные ).
При значении таймера более 10 минут высвечивается (!!!)-время исхода топлива.
При оборотах более 10000 тоже самое.
При оборотах менее 12/мин-на ЖК надпись DAVAY ZAVODI
Выкладываю прогу на си.
Еще раз убедился пока сам не разберешся ничего не получится.
Тикает таймер, показывая на ЖК минуты и секунды.
Ниже высвечиваятся обороты( Сигнал падается от другог МК с заданной частотй, испытания на двигателе запланированы на выходные ).
При значении таймера более 10 минут высвечивается (!!!)-время исхода топлива.
При оборотах более 10000 тоже самое.
При оборотах менее 12/мин-на ЖК надпись DAVAY ZAVODI
Выкладываю прогу на си.
Еще раз убедился пока сам не разберешся ничего не получится.
- Вложения
-
- 1.doc
- (28 КБ) 777 скачиваний
- gonzales06
- Встал на лапы
- Сообщения: 87
- Зарегистрирован: Сб сен 01, 2007 18:32:42
- Откуда: Санкт-Петербург
- Контактная информация:
Делаю вольтметр.
Правильно ли понял:
-Подаем на ножку AREF +5В от VCC (читал что надо через конденсатор на "-")
-На ножку ADC1 подаём измеряемое напряжение (Я дал от Vcc +5в)
-Прошиваем таку прогу
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
// Reinitialize Timer 0 value
TCNT0=0x83;
// Place your code here
ADCSRA.6 = 1;
}
// ADC interrupt service routine
interrupt [ADC_INT] void adc_isr(void)
{
unsigned int adc_data;
// Read the AD conversion result
adc_data=ADCW;
}
void main(void)
{
TCCR0=0x03;
TCNT0=0x83;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x01;
ADMUX=0b11000010;
ADCSRA=0x8E;
// LCD module initialization
lcd_init(16);
// Global enable interrupts
#asm("sei")
while (1);
}
Получаем результат 1023, судя по формуле этому значеню равно напряжение +5 вольт,которое подали на ARFE, ставим резистор получаем меньше.
Но, задача стоит измерить состояние питающего аккумулятора 12,5-10,0 вольта.
Тоесть поставить резистор, получить на выходе +5 вольт и это значение 1023 прировнять к 12,5 или есть другой способ + измерения прыгают с большим разбросом.
С этим все понятно,
Правильно ли понял:
-Подаем на ножку AREF +5В от VCC (читал что надо через конденсатор на "-")
-На ножку ADC1 подаём измеряемое напряжение (Я дал от Vcc +5в)
-Прошиваем таку прогу
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
// Reinitialize Timer 0 value
TCNT0=0x83;
// Place your code here
ADCSRA.6 = 1;
}
// ADC interrupt service routine
interrupt [ADC_INT] void adc_isr(void)
{
unsigned int adc_data;
// Read the AD conversion result
adc_data=ADCW;
}
void main(void)
{
TCCR0=0x03;
TCNT0=0x83;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x01;
ADMUX=0b11000010;
ADCSRA=0x8E;
// LCD module initialization
lcd_init(16);
// Global enable interrupts
#asm("sei")
while (1);
}
Получаем результат 1023, судя по формуле этому значеню равно напряжение +5 вольт,которое подали на ARFE, ставим резистор получаем меньше.
Но, задача стоит измерить состояние питающего аккумулятора 12,5-10,0 вольта.
Тоесть поставить резистор, получить на выходе +5 вольт и это значение 1023 прировнять к 12,5 или есть другой способ + измерения прыгают с большим разбросом.
С этим все понятно,
- ua9ssa
- Встал на лапы
- Сообщения: 120
- Зарегистрирован: Чт ноя 08, 2007 12:12:41
- Откуда: г.Оренбург
- Контактная информация:
Посмотри в курсе AVR 9 задачу http://avr123.nm.ru/z09.htm Там как раз описано как при помощи АЦП измерять постоянное напряжение...
Т.е. создание вольтметра...
Т.е. создание вольтметра...
Истина где-то рядом...
-
AndryG
- Открыл глаза
- Сообщения: 76
- Зарегистрирован: Сб ноя 10, 2007 14:28:04
- Откуда: UA
- Контактная информация:
Дабы измерять напряжение больше Vcc нужно его подать через делитель напряжения на резисторах. Для того, чтобы напряжение не скакало нужно его "усреднить" - поставьте небольшой конденсатор от ноги ацп на землю и в расчетах попробуйте применить "скользящее среднее" -- среднее арифметическое последних N измерений (N удобно выбирать в степени двойки - удобно делить сдвигом)
Использование в виде ИОН (источника опорного напряжения) само питание -- плохая идея -- потому и скачет. Переключитесь на внутренний ион контроллера.
Использование в виде ИОН (источника опорного напряжения) само питание -- плохая идея -- потому и скачет. Переключитесь на внутренний ион контроллера.
- gonzales06
- Встал на лапы
- Сообщения: 87
- Зарегистрирован: Сб сен 01, 2007 18:32:42
- Откуда: Санкт-Петербург
- Контактная информация:
- gonzales06
- Встал на лапы
- Сообщения: 87
- Зарегистрирован: Сб сен 01, 2007 18:32:42
- Откуда: Санкт-Петербург
- Контактная информация:
- ua9ssa
- Встал на лапы
- Сообщения: 120
- Зарегистрирован: Чт ноя 08, 2007 12:12:41
- Откуда: г.Оренбург
- Контактная информация:
Нашел аналогичную тему по тахометру. Код написан на Си. Есть несколько вариантов использования таймера.
http://electronix.ru/forum/index.php?sh ... 32119&st=0
Единственная проблема в том, что код писался в AVR Studio и соответственно компилироваться в CVAVR не хочет. Может кто-нибудь поможет?
P.S. Исходный код во вложении
http://electronix.ru/forum/index.php?sh ... 32119&st=0
Единственная проблема в том, что код писался в AVR Studio и соответственно компилироваться в CVAVR не хочет. Может кто-нибудь поможет?
P.S. Исходный код во вложении
- Вложения
-
- тахометр.txt
- (1.04 КБ) 456 скачиваний
Истина где-то рядом...
- ua9ssa
- Встал на лапы
- Сообщения: 120
- Зарегистрирован: Чт ноя 08, 2007 12:12:41
- Откуда: г.Оренбург
- Контактная информация:
Нашел в конференции ixbt
Для измерения частоты повторяющихся событий (сигналов) применяют 2 метода (есть, правда, еще третий, как комбинация этих двух).
1. Подсчитывают количество импульсов за эталонный отрезок времени. Разделив их число на отрезок времени получают частоту. Обычно таким способом удобно измерять достаточно высокие частоты. Также это - основной метод, используемый в электронносчетных частотомерах. Если взять эталонное время равное 1 секунде или ее долям степени 10, легко получить числовые значения частоты без дополнительных вычислений.
2. Поскольку частота - величина обратная периоду следования импульсов, ее можно определить (вычислить), измерив время одиного или нескольких периодов. Для этого считаются импульсы с источника эталонной частоты за период между двумя (или несколькими) измеряемыми импульсами. Потом эталонная частота делится на это число (если периодов было несколько, еще и умножается на их число) и получается измеряемая частота. Обычно так измеряют низкие частоты.
У каждого из этих 2-х методов есть свои достоинства и недостатки, поэтому существует несколько более сложный 3-й комбинированный метод, позволяющий эти недостатки обойти, но его рассматривать сейчас не буду.
Для твоего случая как раз подходит 2-й метод.
Как он реализуется? А вот так:
Предположим, что ты хочешь воспользоваться 16-битным счетчиком. Т.е. его разрядной сетки вполне хватает для обеспечения требуемой точности измерений. Тогда полный цикл его счета должен длиться не менее максимального периода измеряемых импульсов. Допустим для твоих условий это - 60мс. В таком случае минимальный период эталонных импульсов должен быть не менее 60/2^16 = 0,000916мс, что соответствует частоте 1,0923МГц. У тебя кварц на 7МГц, поэтому ее на счетчик напрямую не подашь, но, выбрав предварительное деление на 8, вполне красиво вписываешься, получается 0,875МГц. Тогда полный цикл счетчика выполнится за 74,9мс, что твоим условиям вполне удовлетворит.
После того, как со счетчиком устаканились, рассмотрим алгоритм измерения.
Выбираем для обработки внешнего события (прихода измеряемого импульса), например, прерывание INT0. В этом случае по приходу каждого импульса происходит обработка этого прерывания, причем момент начала выполнения подпрограммы будет иметь одинаковую задержку по отношению к моменту прихода каждого импульса, что обеспечит точную временнУю привязку.
Запускаем счетчик. Он инкрементируется с вышеуказанной частотой. В какой-то момент приходит первый измеряемый импульс, в п/п обработки прерывания запоминаем текущее значение счетчика таймера, потом приходит второй импульс, запоминаем значение счетчика таймера в этот момент и из него вычитаем предыдущее запомненое (если оно большее, т.е. счетчик между импульсами перевалил через максимум и начал считать с нуля, вычитаем с заемом), дальше вычисляем частоту измеряемых импульсов делением опорной частоты (Tclk/8) на полученную разность (для получения скорости вращения вала в об/мин нужно еще умножить на 30), по приходу третьего и последующих импульсов - та же история. Таким образом можешь получать мгновенное значение скорости вращения вала за период между двумя импульсами с трамблера. Можно, если в этом есть нужда, численно усреднять значения 2-х и более смежных импульсов и т.п.
Не знаю, какое максимальное число оборотов может быть у двигателя, но, предположим оно - не более 8000об/мин. Тогда минимальный период между двумя прерываниями и, соответственно, вычислениями будет 3,75мс, а это при твоих 7МГц кварца - 26250 тактов. За такое число тактов и чёрта можно обсчитать , поэтому не стоит беспокоиться, что не успеешь.
Теперь я понял как правильно считать. Осталось это все реализовать на Си
Для измерения частоты повторяющихся событий (сигналов) применяют 2 метода (есть, правда, еще третий, как комбинация этих двух).
1. Подсчитывают количество импульсов за эталонный отрезок времени. Разделив их число на отрезок времени получают частоту. Обычно таким способом удобно измерять достаточно высокие частоты. Также это - основной метод, используемый в электронносчетных частотомерах. Если взять эталонное время равное 1 секунде или ее долям степени 10, легко получить числовые значения частоты без дополнительных вычислений.
2. Поскольку частота - величина обратная периоду следования импульсов, ее можно определить (вычислить), измерив время одиного или нескольких периодов. Для этого считаются импульсы с источника эталонной частоты за период между двумя (или несколькими) измеряемыми импульсами. Потом эталонная частота делится на это число (если периодов было несколько, еще и умножается на их число) и получается измеряемая частота. Обычно так измеряют низкие частоты.
У каждого из этих 2-х методов есть свои достоинства и недостатки, поэтому существует несколько более сложный 3-й комбинированный метод, позволяющий эти недостатки обойти, но его рассматривать сейчас не буду.
Для твоего случая как раз подходит 2-й метод.
Как он реализуется? А вот так:
Предположим, что ты хочешь воспользоваться 16-битным счетчиком. Т.е. его разрядной сетки вполне хватает для обеспечения требуемой точности измерений. Тогда полный цикл его счета должен длиться не менее максимального периода измеряемых импульсов. Допустим для твоих условий это - 60мс. В таком случае минимальный период эталонных импульсов должен быть не менее 60/2^16 = 0,000916мс, что соответствует частоте 1,0923МГц. У тебя кварц на 7МГц, поэтому ее на счетчик напрямую не подашь, но, выбрав предварительное деление на 8, вполне красиво вписываешься, получается 0,875МГц. Тогда полный цикл счетчика выполнится за 74,9мс, что твоим условиям вполне удовлетворит.
После того, как со счетчиком устаканились, рассмотрим алгоритм измерения.
Выбираем для обработки внешнего события (прихода измеряемого импульса), например, прерывание INT0. В этом случае по приходу каждого импульса происходит обработка этого прерывания, причем момент начала выполнения подпрограммы будет иметь одинаковую задержку по отношению к моменту прихода каждого импульса, что обеспечит точную временнУю привязку.
Запускаем счетчик. Он инкрементируется с вышеуказанной частотой. В какой-то момент приходит первый измеряемый импульс, в п/п обработки прерывания запоминаем текущее значение счетчика таймера, потом приходит второй импульс, запоминаем значение счетчика таймера в этот момент и из него вычитаем предыдущее запомненое (если оно большее, т.е. счетчик между импульсами перевалил через максимум и начал считать с нуля, вычитаем с заемом), дальше вычисляем частоту измеряемых импульсов делением опорной частоты (Tclk/8) на полученную разность (для получения скорости вращения вала в об/мин нужно еще умножить на 30), по приходу третьего и последующих импульсов - та же история. Таким образом можешь получать мгновенное значение скорости вращения вала за период между двумя импульсами с трамблера. Можно, если в этом есть нужда, численно усреднять значения 2-х и более смежных импульсов и т.п.
Не знаю, какое максимальное число оборотов может быть у двигателя, но, предположим оно - не более 8000об/мин. Тогда минимальный период между двумя прерываниями и, соответственно, вычислениями будет 3,75мс, а это при твоих 7МГц кварца - 26250 тактов. За такое число тактов и чёрта можно обсчитать , поэтому не стоит беспокоиться, что не успеешь.
Теперь я понял как правильно считать. Осталось это все реализовать на Си
Истина где-то рядом...
- gonzales06
- Встал на лапы
- Сообщения: 87
- Зарегистрирован: Сб сен 01, 2007 18:32:42
- Откуда: Санкт-Петербург
- Контактная информация:
Я считал так:
- каждый раз когда на ножке icp появлялся низпадающий фронт, происходило прерывание к переменно прибовлялся 1
- таймер1 тикает каждую секунду и подсчитывается значение переменной за 10с и её значение сбрасывается в ноль
- выводится на экран
Проблема возникла следующая- из-за сильных помех от катушки и высоковольтного провода значения скакали и МК виснул
Попробую плату поместить в пластиковый корпус и использовать экранированые провода, плюс экранирую плату фальгой а детали запаяю поверхносныим монтажом.
Если получится попробую другой способ измерения оборотов.
- каждый раз когда на ножке icp появлялся низпадающий фронт, происходило прерывание к переменно прибовлялся 1
- таймер1 тикает каждую секунду и подсчитывается значение переменной за 10с и её значение сбрасывается в ноль
- выводится на экран
Проблема возникла следующая- из-за сильных помех от катушки и высоковольтного провода значения скакали и МК виснул
Попробую плату поместить в пластиковый корпус и использовать экранированые провода, плюс экранирую плату фальгой а детали запаяю поверхносныим монтажом.
Если получится попробую другой способ измерения оборотов.