но тогда я не смогу проверить последовательность фаз.
в трёхфазнике каждая фаза сдвинута на треть периода, было бы неплохо следить ещё и за этим параметром, помимо напряжения. хотя может это и не интересно никому
но тогда я не смогу проверить последовательность фаз.
в трёхфазнике каждая фаза сдвинута на треть периода, было бы неплохо следить ещё и за этим параметром, помимо напряжения. хотя может это и не интересно никому
как раз сможете. Когда у вас сработает прерывание вы прочтете содержимое тех трех портов которые подключены индивидуально к каждой фазе и поймете какая фаза вызвала прерывание
то что описал простой вариант - даже не надо даташит открывать, достаточно ардуиновских функций
но если откроете даташит и прочитаете 10 раздел External Interrupts, особенно описание битов PCIE и регистров PCMCK, то сможете получать прерывание от каждой из трех фаз индивидуально
Есть вопрос когда мы настраиваем прерывание по счетчику Т2 мы берем тактовую частоту 16Мгц и затем с помощью делителя на 8 32 64 128 и так до 1024 выбираем к примеру 1024 и у нас получается что прерывание будет обрабатывать код с частотой 15625 Гц?
Есть вопрос когда мы настраиваем прерывание по счетчику Т2 мы берем тактовую частоту 16Мгц и затем с помощью делителя на 8 32 64 128 и так до 1024 выбираем к примеру 1024 и у нас получается что прерывание будет обрабатывать код с частотой 15625 Гц?
По сути происходит два деления частоты
Первое происходит на так называемом prescaler - это делитель частоты источника перед тем как эта частота будет использована таймером. Если мы предполагаме частоту МК 16 и у нас в качестве источника частоты для МК выбрана его же частота, то получаем частоту на входе в счетчик как 16 / X, где X - коэффициент prescaler
После этого счетчик таймера начинает отсчитывать +1 или -1 (смотря как настроили таймер) с частотой 16 / X.
Но прерывание по timer overflow происходит только тогда когда сработало условие прерывания. Чаще всего таким условием выбирается равенство счетчика (TCNT0 на примере 0-го таймера) и регистров OCR0A/B.
тогда частота вызова обработчика прерываний будет как частоты на входе таймера 16 / x деленная на число записанное в OCR0A/B. Я описал вариант, когда прерывание срабатывает по равенству счетчика и OCR0A/B. Есть другие режимы (например прерывание срабатывает по равенству TCNT0 0xFF) - смотрите описание управляющиех регистров, там все достаточно просто
забыл сказать - все это на примере нулевого таймера, такой же подход к двум другим, нужно только учесть, что 0 и 2 таймера 8 битные (счетчик TCNT), а таймер 1 - 16-ти битный. Они отличаются еще рядом специфичных режимов. Для вашей задачи любой подойдет, лучше 1 или 2-й как я понял 0-1 использован для библиотек ардуино (в это не погружался, могу ошибиться)
после подачи опорного напряжения мы получаем синусоиду относительно 2 В
Теперь мы запускаем прерывание по таймеру примеру Т2
вот расчеты по калькулятору
если мы берем средне квадратическое напряжение получается
то запуская таймер каждые 10 мсек (наверно)е измеряем напряжение на аналоговых входах в обработчике прерывания сохраняем эти значения в массив!!! поправте пожалуйста есля что напутал!
можно и реже запускать, в моменты когда вам нужны значения(вы же не забывайте вам еще математику считать)... главное для интегрирования ети 10 или 20 мс точно выдерживать.
Кстати, есть два способа замера. Первый как я предлагаю - таймером отсекаем 10-20мс, ацп в режиме автозапуска, а второй вариант настроить ацп на запуск по переполнению таймера, т.е настроили таймер на 1мс, сняли 10-20 показаний, посчитали(единстенное тут с временм интегрирования не очень), но как вариант(пример такой расматривали в теме "Измеряем Ток")
так, с математикой у меня вдруг возник вопрос, если на переменке один такт - это от максимального до минимального, то напряжение снимать надо не на 10-той мс, а на 5-той? ну это если считать от нуля.
ссори, дуплюсь с прерываниями, тема для меня новая, большая нагрузка на неокрепший подростковый 37-ми летний мозг, туплю...
та все равно на какой секунде... главное сколько.... если весь период Т снимаете получаете искомый результат(после степеней и корней), если пол периода, то результат на 2 умножаете и т.д.
Т.е. к примеру запускаем таймер через каждые 0.5 секунд и снимаем к примеру 10 показаний чрез 1 мсек
сохраняем в векторе прерывания эти данные массив и и усредняем, потом в основной программе умножаем на два и возводим в квадрат, и извлекаем корень, ну и потом дальнейшие математические преобразования!!
да по времени съема да... а по математике смотрите свой пост #44, действующее значение на 2 умножаем....
т.е. каждое значение в массиве в квадрат, потом все сложить, взять корень из суммы, поделить на кол-во измерений и для получения в вольтах умножить на коэф. пересчета и умножить на 2... кажись так :)
Ну так вот что мне удалось узнать по поводу прерывания по счетчику!!!
1.счетчик Т1 считает до FF это примерно 256 следовательно при частоте 16 МГц он переполнится через 16 мксек это слишком быстро для моей программы даже введя предделитель на 1024 переполнение будет происходить каждые 16,3мсек , т.е опять же слишком часто!
int LEDPIN = 13;
volatile int cntr;
void setup()
{
cntr=0;
TIMSK2 &= ~(1<<OCIE2A); // запрещение прерывания по совпадению таймера/счетчика Т2
TCCR2B = (1<<CS22)|(1<<CS21)|(0<<CS20); // прескалер на 256
TCCR2A &= ~((1<<WGM22) | (1<<WGM20)); // Режим работы таймера/счетчика устанавливаю в
TCCR2B |= (1<<WGM22); // Режим работы таймера/счетчика
ASSR &= ~(1<<AS2); // Выбор источника синхронизации таймера если
// AS2=0 от системного генератора
OCR2A = 250; // срабатывание таймера 16000000/256/250=250 раз в секунду
TIMSK2 |= (1<<OCIE2A); //Разрешение прерывания по совпадению.
pinMode(LEDPIN, OUTPUT);
}
void loop()
{
}
//****************обработчик прерывания********************
ISR(TIMER2_COMPA_vect)
{
cntr++;
if (cntr>124) { // через каждые 125 вызовов прерывания перекидываем состояние светодиода
digitalWrite(LEDPIN, !digitalRead(LEDPIN));
cntr=0;
}
}
в основной програмее нужно чо то типа такого сделать (файлы не сохранил, давно ето было)
while (1)
{
k=0;
TOIE0_bit = 1; //запустили Т0 на maxp преобразований
while(k<=maxp); //ждем пока не набьется массив значениями
далше работа с массивом, вывод и т.п.
}
ну я просто для АВР пишу в microC, но вы можете попробовать в прерывании по таймеру использовать ардуиновскую analogread()
а мне понравился режим преобразования по переполнению таймера, когда не нужно самому инициировать измерения - зачетная штука, правда в этом случае таймер должет срабатывать уже с нужными интервалами для замеров. Мы ничего не пишем в функции обработки прерывания по таймеру (для этих нужд обработчик по таймеру совсем не нужен), а только собираем как готовые пирожки готовые измерения в прерывании по готовности ADC. Это наверно один из примеров когда средствами ардуино нельзя грамотно сделать то, что умеет atmega если ею управлять напрямую без всяких analogRead. Кстати если и время преобразования через analogRead будет дольше, если почитать даташит, то там различается время первого преобразования и время последующего. analogread каждый раз переключает канал на ADC, а это значит, что она каждый раз инициирует первое измерение - самое длинное. Разница почти в два раза - 25 циклов против 13. Когда мы измеряем всего один канал у нас нет потребности в переключении. Но конечно не всегда эта разница в скорости критична, но стоит все просчитать. Что не маловажно - по даташиту требуется, чтобы для 10 битного режима ADC если мы хотим качественное преобразование то частота работы ADC не должна превышать 200кГц, а это как раз уже может наложить ограничения на скорость измерений
п.с. обнаружил интересную вещь в mega328 - встроенный в чип датчик температуры, почему-то нив одной конструкции не видел его использования
Ну так вот что мне удалось узнать по поводу прерывания по счетчику!!!
1.счетчик Т1 считает до FF это примерно 256 следовательно при частоте 16 МГц он переполнится через 16 мксек это слишком быстро для моей программы даже введя предделитель на 1024 переполнение будет происходить каждые 16,3мсек , т.е опять же слишком часто!
вы про mega328? т.е. про arduino UNO? у нее счетчик T1 16-ти разрядный, это значит, что считать может до 65535, а с учетом prescaler максимальный счет будет 65535 * 1024 = 67107840, 16 мгц превратятся в 0,24 Гц
Ну так вот что мне удалось узнать по поводу прерывания по счетчику!!!
1.счетчик Т1 считает до FF это примерно 256 следовательно при частоте 16 МГц он переполнится через 16 мксек это слишком быстро для моей программы даже введя предделитель на 1024 переполнение будет происходить каждые 16,3мсек , т.е опять же слишком часто!
вы про mega328? т.е. про arduino UNO? у нее счетчик T1 16-ти разрядный, это значит, что считать может до 65535, а с учетом prescaler максимальный счет будет 65535 * 1024 = 67107840, 16 мгц превратятся в 0,24 Гц
Ну так вот что мне удалось узнать по поводу прерывания по счетчику!!!
1.счетчик Т1 считает до FF это примерно 256 следовательно при частоте 16 МГц он переполнится через 16 мксек это слишком быстро для моей программы даже введя предделитель на 1024 переполнение будет происходить каждые 16,3мсек , т.е опять же слишком часто!
вы про mega328? т.е. про arduino UNO? у нее счетчик T1 16-ти разрядный, это значит, что считать может до 65535, а с учетом prescaler максимальный счет будет 65535 * 1024 = 67107840, 16 мгц превратятся в 0,24 Гц
диапазон для выбора более чем достаточный
Я просто сразу не разобрался и кинулся в панику!!!
Я то думал настроить счетчик Т2 на прерывания через каждые о.4 - 0.5 секунд, потом догнал что он же восьмибитный а это значит что считает он всего навсего до 255, т.е о половине минуты и разговора не какого не может идти!!!
Т1 замечательно подйдет на эту роль!! Возникает вопрос если я настрою прерывание к примеру через каждые 0.3 секунды, и в обработчике прерывания буду использовать
analogRead(ADC0)
и сохранять значения в переменную, то как писал Michal мы должны будем измерять либо весь период либо половину, к примеру весь период будет составлять 20 мсек, а при частоте 16МГц мы сделаем примерно320000 измерений!!!
Объясните ине не грамотному в обработчике прерывания скорость какая будет 16МГц или же мы сможем настроиками выбрать любую скорость обработки ?
лениво вечером лезть в даташит... на тактирование АЦП есть делитель... у меня он 100 показаний шлепал за 20 мс... я же настроил ацп на одиночное преобразование и запускал по таймеру....вон ахилл тоже хороший способ подсказал, там таже процедура как и у меня толко все аппаратно. Я то программку лет 5 назад ваял :)
лениво вечером лезть в даташит... на тактирование АЦП есть делитель... у меня он 100 показаний шлепал за 20 мс... я же настроил ацп на одиночное преобразование и запускал по таймеру....вон ахилл тоже хороший способ подсказал, там таже процедура как и у меня толко все аппаратно. Я то программку лет 5 назад ваял :)
вопрос лишь в том можно ли предложенный axill вариант реализовать на Arduino?
или все тот же codevision возьмите и в помощнике настройки оборудования врубите нужный способ работы АЦП... CV выдаст код настройки
точно!)) для начала можно и так, посмотрел сейчас - если в codewisard включить ADC то там в списке auto trigger source есть Timer0/1 overflow - это то о чем я писал
но кстати можно использовать и FreeRunning mode - в этом режиме новое измерение начинается как только закончилось предыдущее. Если потребление нас не волнует - запускаем пусть измеряет, а значения из ADCW берем так часто, как нам нужно
Michal пробовал ваш вариант кода, спасибо что несколько подкоректировали его!!! Но расчет с 9 по 13 строку не выполняется.
наверное это связанно что в основной программе в 6 строке мы обнуляем cntr = 0;! следовательно в 9 строке if выражение никогда не выполнится!!! нужно как то грамотно обнулять cntr?
вот пример использования таймера
Unreturned скажите у вас есть информация рускоязычная по таймерам Atmega328?
Берете даташит http://www.atmel.com/Images/Atmel-8271-8-bit-AVR-Microcontroller-ATmega4...
Открываете раздел
И смотрите описание битов буквально трех регистров (или двух, если не настраивать прерывания)
Не знаете английский - google поможетTimer/Register Description
например для 0-го таймера секция 15.9, для настройки вам нужны TCCR0A и TCCR0B, влаги прерываний TIMSK0
у 328 камня 2 внешних прерывания, как же тогда мониторить трёхфазное напряжение?...
Напрашивается только один ответ по очереди, одним прерыванием.
как это только 2... у него можно прерывание по иземенению состояния назначить на почти все свободные лапы
Напрашивается только один ответ по очереди, одним прерыванием.
согласен
ставим оптопары на три фазы, заводим на три обычных пина без прерываний, а суммировав через три диода на INT0/1
но тогда я не смогу проверить последовательность фаз.
в трёхфазнике каждая фаза сдвинута на треть периода, было бы неплохо следить ещё и за этим параметром, помимо напряжения. хотя может это и не интересно никому
но тогда я не смогу проверить последовательность фаз.
в трёхфазнике каждая фаза сдвинута на треть периода, было бы неплохо следить ещё и за этим параметром, помимо напряжения. хотя может это и не интересно никому
как раз сможете. Когда у вас сработает прерывание вы прочтете содержимое тех трех портов которые подключены индивидуально к каждой фазе и поймете какая фаза вызвала прерывание
прошу прощения, не сообразил сразу. теперь всё понятно
то что описал простой вариант - даже не надо даташит открывать, достаточно ардуиновских функций
но если откроете даташит и прочитаете 10 раздел External Interrupts, особенно описание битов PCIE и регистров PCMCK, то сможете получать прерывание от каждой из трех фаз индивидуально
не хотит народ читать :)...нынче ето немодно :)
не хотит народ читать :)...нынче ето немодно :)
читаю, только.... даже опросов не возникает - тёмный лес
читаю, только.... даже опросов не возникает - тёмный лес
глаза боятся руки делают )) так на руси говорили
ничего там сложного - выставляете нужные вам битики в регистрах и все заработает
сделайте мигалку, используя таймер, а не Delay().. и все станет ясно :)
вот вам идеи по подключению
читаю, только.... даже опросов не возникает - тёмный лес
Вот хорошая книжка, все очень подробно разжеванно на русском: Евстифеев А.В. Микроконтроллеры AVR семейств Tiny и Mega фирмы ATMEL, 5-е изд (2008).
Много хорошей и полезной информации!!!!
Есть вопрос когда мы настраиваем прерывание по счетчику Т2 мы берем тактовую частоту 16Мгц и затем с помощью делителя на 8 32 64 128 и так до 1024 выбираем к примеру 1024 и у нас получается что прерывание будет обрабатывать код с частотой 15625 Гц?
Много хорошей и полезной информации!!!!
Есть вопрос когда мы настраиваем прерывание по счетчику Т2 мы берем тактовую частоту 16Мгц и затем с помощью делителя на 8 32 64 128 и так до 1024 выбираем к примеру 1024 и у нас получается что прерывание будет обрабатывать код с частотой 15625 Гц?
По сути происходит два деления частоты
Первое происходит на так называемом prescaler - это делитель частоты источника перед тем как эта частота будет использована таймером. Если мы предполагаме частоту МК 16 и у нас в качестве источника частоты для МК выбрана его же частота, то получаем частоту на входе в счетчик как 16 / X, где X - коэффициент prescaler
После этого счетчик таймера начинает отсчитывать +1 или -1 (смотря как настроили таймер) с частотой 16 / X.
Но прерывание по timer overflow происходит только тогда когда сработало условие прерывания. Чаще всего таким условием выбирается равенство счетчика (TCNT0 на примере 0-го таймера) и регистров OCR0A/B.
тогда частота вызова обработчика прерываний будет как частоты на входе таймера 16 / x деленная на число записанное в OCR0A/B. Я описал вариант, когда прерывание срабатывает по равенству счетчика и OCR0A/B. Есть другие режимы (например прерывание срабатывает по равенству TCNT0 0xFF) - смотрите описание управляющиех регистров, там все достаточно просто
основное, что вам нужно
здесь настройка prescaler
здесь выбор режима счета таймера
и здесь настройка прерываний
забыл сказать - все это на примере нулевого таймера, такой же подход к двум другим, нужно только учесть, что 0 и 2 таймера 8 битные (счетчик TCNT), а таймер 1 - 16-ти битный. Они отличаются еще рядом специфичных режимов. Для вашей задачи любой подойдет, лучше 1 или 2-й как я понял 0-1 использован для библиотек ардуино (в это не погружался, могу ошибиться)
я мозг сломал, боюсь дальше блинка дело не пойдёт... :(
найди в инете avrcalc, поможет с настройкой таймеров и др. устройств АВРор
Michal разрешите у вас спросить
Вот мы имеем переменное напряжение
с частотой 50 Гц
после подачи опорного напряжения мы получаем синусоиду относительно 2 В
Теперь мы запускаем прерывание по таймеру примеру Т2
вот расчеты по калькулятору
если мы берем средне квадратическое напряжение получается
то запуская таймер каждые 10 мсек (наверно)е измеряем напряжение на аналоговых входах в обработчике прерывания сохраняем эти значения в массив!!! поправте пожалуйста есля что напутал!
да все так
можно и реже запускать, в моменты когда вам нужны значения(вы же не забывайте вам еще математику считать)... главное для интегрирования ети 10 или 20 мс точно выдерживать.
Кстати, есть два способа замера. Первый как я предлагаю - таймером отсекаем 10-20мс, ацп в режиме автозапуска, а второй вариант настроить ацп на запуск по переполнению таймера, т.е настроили таймер на 1мс, сняли 10-20 показаний, посчитали(единстенное тут с временм интегрирования не очень), но как вариант(пример такой расматривали в теме "Измеряем Ток")
так, с математикой у меня вдруг возник вопрос, если на переменке один такт - это от максимального до минимального, то напряжение снимать надо не на 10-той мс, а на 5-той? ну это если считать от нуля.
ссори, дуплюсь с прерываниями, тема для меня новая, большая нагрузка на неокрепший подростковый 37-ми летний мозг, туплю...
та все равно на какой секунде... главное сколько.... если весь период Т снимаете получаете искомый результат(после степеней и корней), если пол периода, то результат на 2 умножаете и т.д.
Т.е. к примеру запускаем таймер через каждые 0.5 секунд и снимаем к примеру 10 показаний чрез 1 мсек
сохраняем в векторе прерывания эти данные массив и и усредняем, потом в основной программе умножаем на два и возводим в квадрат, и извлекаем корень, ну и потом дальнейшие математические преобразования!!
да по времени съема да... а по математике смотрите свой пост #44, действующее значение на 2 умножаем....
т.е. каждое значение в массиве в квадрат, потом все сложить, взять корень из суммы, поделить на кол-во измерений и для получения в вольтах умножить на коэф. пересчета и умножить на 2... кажись так :)
Ну так вот что мне удалось узнать по поводу прерывания по счетчику!!!
1.счетчик Т1 считает до FF это примерно 256 следовательно при частоте 16 МГц он переполнится через 16 мксек это слишком быстро для моей программы даже введя предделитель на 1024 переполнение будет происходить каждые 16,3мсек , т.е опять же слишком часто!
даже введя предделитель на 1024 переполнение будет происходить каждые 16,3мсек , т.е опять же слишком часто!
Слишком часто для чего?
вот кусок с программы, тут таймера настраиваются (кварц 16Мгц)
а это п/прораммы обработчиков перерываний
в основной програмее нужно чо то типа такого сделать (файлы не сохранил, давно ето было)
я думал что разобрался в этом оказывается нисколечки(((
Ладно продолжу изучать даташит, особенно строки 21-23 где настроики для аналогового компаратора!!
ну я просто для АВР пишу в microC, но вы можете попробовать в прерывании по таймеру использовать ардуиновскую analogread()
ну я просто для АВР пишу в microC, но вы можете попробовать в прерывании по таймеру использовать ардуиновскую analogread()
а мне понравился режим преобразования по переполнению таймера, когда не нужно самому инициировать измерения - зачетная штука, правда в этом случае таймер должет срабатывать уже с нужными интервалами для замеров. Мы ничего не пишем в функции обработки прерывания по таймеру (для этих нужд обработчик по таймеру совсем не нужен), а только собираем как готовые пирожки готовые измерения в прерывании по готовности ADC. Это наверно один из примеров когда средствами ардуино нельзя грамотно сделать то, что умеет atmega если ею управлять напрямую без всяких analogRead. Кстати если и время преобразования через analogRead будет дольше, если почитать даташит, то там различается время первого преобразования и время последующего. analogread каждый раз переключает канал на ADC, а это значит, что она каждый раз инициирует первое измерение - самое длинное. Разница почти в два раза - 25 циклов против 13. Когда мы измеряем всего один канал у нас нет потребности в переключении. Но конечно не всегда эта разница в скорости критична, но стоит все просчитать. Что не маловажно - по даташиту требуется, чтобы для 10 битного режима ADC если мы хотим качественное преобразование то частота работы ADC не должна превышать 200кГц, а это как раз уже может наложить ограничения на скорость измерений
п.с. обнаружил интересную вещь в mega328 - встроенный в чип датчик температуры, почему-то нив одной конструкции не видел его использования
Ну так вот что мне удалось узнать по поводу прерывания по счетчику!!!
1.счетчик Т1 считает до FF это примерно 256 следовательно при частоте 16 МГц он переполнится через 16 мксек это слишком быстро для моей программы даже введя предделитель на 1024 переполнение будет происходить каждые 16,3мсек , т.е опять же слишком часто!
вы про mega328? т.е. про arduino UNO? у нее счетчик T1 16-ти разрядный, это значит, что считать может до 65535, а с учетом prescaler максимальный счет будет 65535 * 1024 = 67107840, 16 мгц превратятся в 0,24 Гц
диапазон для выбора более чем достаточный
Ну так вот что мне удалось узнать по поводу прерывания по счетчику!!!
1.счетчик Т1 считает до FF это примерно 256 следовательно при частоте 16 МГц он переполнится через 16 мксек это слишком быстро для моей программы даже введя предделитель на 1024 переполнение будет происходить каждые 16,3мсек , т.е опять же слишком часто!
вы про mega328? т.е. про arduino UNO? у нее счетчик T1 16-ти разрядный, это значит, что считать может до 65535, а с учетом prescaler максимальный счет будет 65535 * 1024 = 67107840, 16 мгц превратятся в 0,24 Гц
диапазон для выбора более чем достаточный
Да я теперь понял о чем был разговор!!!
Ну так вот что мне удалось узнать по поводу прерывания по счетчику!!!
1.счетчик Т1 считает до FF это примерно 256 следовательно при частоте 16 МГц он переполнится через 16 мксек это слишком быстро для моей программы даже введя предделитель на 1024 переполнение будет происходить каждые 16,3мсек , т.е опять же слишком часто!
вы про mega328? т.е. про arduino UNO? у нее счетчик T1 16-ти разрядный, это значит, что считать может до 65535, а с учетом prescaler максимальный счет будет 65535 * 1024 = 67107840, 16 мгц превратятся в 0,24 Гц
диапазон для выбора более чем достаточный
Я просто сразу не разобрался и кинулся в панику!!!
Я то думал настроить счетчик Т2 на прерывания через каждые о.4 - 0.5 секунд, потом догнал что он же восьмибитный а это значит что считает он всего навсего до 255, т.е о половине минуты и разговора не какого не может идти!!!
Т1 замечательно подйдет на эту роль!! Возникает вопрос если я настрою прерывание к примеру через каждые 0.3 секунды, и в обработчике прерывания буду использовать
и сохранять значения в переменную, то как писал Michal мы должны будем измерять либо весь период либо половину, к примеру весь период будет составлять 20 мсек, а при частоте 16МГц мы сделаем примерно320000 измерений!!!
Объясните ине не грамотному в обработчике прерывания скорость какая будет 16МГц или же мы сможем настроиками выбрать любую скорость обработки ?
лениво вечером лезть в даташит... на тактирование АЦП есть делитель... у меня он 100 показаний шлепал за 20 мс... я же настроил ацп на одиночное преобразование и запускал по таймеру....вон ахилл тоже хороший способ подсказал, там таже процедура как и у меня толко все аппаратно. Я то программку лет 5 назад ваял :)
лениво вечером лезть в даташит... на тактирование АЦП есть делитель... у меня он 100 показаний шлепал за 20 мс... я же настроил ацп на одиночное преобразование и запускал по таймеру....вон ахилл тоже хороший способ подсказал, там таже процедура как и у меня толко все аппаратно. Я то программку лет 5 назад ваял :)
вопрос лишь в том можно ли предложенный axill вариант реализовать на Arduino?
А про снижение скорости работы в обработчике прерывания ничего похожего я не нашел!!
axill Скажите а можно взглянуть на варианты настроек для режим преобразования по переполнению таймера!! я о таком в даташите информации не нашел!!
читайте описание битов конфигурации ADATE и ADTS
или все тот же codevision возьмите и в помощнике настройки оборудования врубите нужный способ работы АЦП... CV выдаст код настройки
или все тот же codevision возьмите и в помощнике настройки оборудования врубите нужный способ работы АЦП... CV выдаст код настройки
точно!)) для начала можно и так, посмотрел сейчас - если в codewisard включить ADC то там в списке auto trigger source есть Timer0/1 overflow - это то о чем я писал
но кстати можно использовать и FreeRunning mode - в этом режиме новое измерение начинается как только закончилось предыдущее. Если потребление нас не волнует - запускаем пусть измеряет, а значения из ADCW берем так часто, как нам нужно
Пробовал на досуге написать программу вольтметра вот что получилось
Но программа работает не коректно!!
выдает напряжение не правильное, и если его изменяешь на входе то в сериал обновляется примерно раз в 5 секунд(((
мб еще чо то причесать надо будет
Michal пробовал ваш вариант кода, спасибо что несколько подкоректировали его!!! Но расчет с 9 по 13 строку не выполняется.
наверное это связанно что в основной программе в 6 строке мы обнуляем cntr = 0;! следовательно в 9 строке if выражение никогда не выполнится!!! нужно как то грамотно обнулять cntr?
если вот так попробовать???
ну я говорил что причесать еще надо :)
Ну вообщем я разобрался просто в обработчике прерывания надо было в строчке
поменять число на 99