Прошу помощи по Arduino
- Войдите на сайт для отправки комментариев
Доброго времени суток! Помогите разобраться с проблемой. На Ардуине собрано устройство, одна из функций которого - замер скорости вращения процессорного кулера по сигналу с таходатчика. Работало и считало нормально. Вот код void rpm () { NbTopsFan++; } void setup() { TCCR1B = TCCR1B & 0b11111000 | 0x05; pinMode (HallSensor, INPUT); // Настраиваем pin на получение прерываний attachInterrupt(1, rpm, RISING); //Привязываем прерывание по номеру 0 к нашей функции, причем высчитываться она будет каждый раз при смене сигнала for (int thisReading = 0; thisReading < numReadings; thisReading++) { readings[thisReading] = 0; } } void RPMCalculate() { int RPMdec; NbTopsFan = 0; // Обнуляем переменную, содержащую обороты delay (500); //Ждем 1 секунду Calc = ((NbTopsFan * 120)/fanspace[fan].fandiv); //Рассчитываем величину оборотов за 60 секунд, поделенную на множитель вентилятора RPMdec = Calc*0.1075; lcd.setCursor(9, 1); lcd.print ("FAN "); lcd.print (RPMdec); //Выводим рассчитанную величину в десятичном виде lcd.print (" %"); } После добавления в скетч следующего куска - перестало считать long readVcc() { long result; // Read 1.1V reference against AVcc ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); delay(2); // Wait for Vref to settle ADCSRA |= _BV(ADSC); // Convert while (bit_is_set(ADCSRA,ADSC)); result = ADCL; result |= ADCH<<8; result = 1062864L / result; // Back-calculate AVcc in mV return result; } Знаний, чтобы разобраться, пока не хватает. Заливал пустой скетч в ардуину, прошивал загрузчик через другую, заливал скетч без последного куска - все равно не высчитывает обороты. Помогите кто чем может
Это код?
Выложите нормально, пожалуйста.
Выложите нормально, пожалуйста.
я запретил.
Прошу прощения, чет криво вставился код. Это та часть, которая поначалу работала, а теперь никак. Такое ощущение, что не срабатывает прерывания
А вот после добавления этого куска кода - первая часть наглухо отказываться что-либо считать. Arduino UNO R3 китай с интерфейсом USB на CH340
Сами мы не местные... Помогите кто чем может. (С)Метро.
Полностью код показать религия не позволяет? Приведённые кусочки в программу не складываются.
Полностью код показать религия не позволяет?
я запретил.
Религия тут не причем, просто впервые обращаюсь за помощью на форум. Полный код под спойлером, после добавления в код выделенного фрагмента - перестало считать обороты в функции RPMCalculate()
сразу в глаза бросилось
delay (500);
//Ждем 1 секунду
Строка 36
Во первых в UNO 13 нога без ШИМ.
Во вторых LOW, оно, конечно, равно 0, но так никто не пишет.
=============
Вывод - ТС - врет, как сивый мерин. Этот код не от УНО и никогда не работал. Нас, господа, разводят на решение курсача ленивому недоумку.
сразу в глаза бросилось
delay (500);
//Ждем 1 секунду
В следующей строке идет умножение на 120, а не на 60 как при задержке в 1000. Времянка.
Да, ошибка, не analogWrite, а digitalWrite - просто гашение встроенного светодиода на Ардуине.
Код от Уно и он работал. И работает все остальное, кроме подсчета оборотов. Универ я давно закончил, но к сожалению по другой специализации. Электроника и Ардуино - хобби, и не о каком курсаче в принципе не идет речь. Спасибо за понимание.
Ок.
Ваш код говорите? И все работало?
1. строка 35 - настройка таймера1 на делитель 256 (частота 62.5 КГц) нахрена?
2. строку 117 объясните. Вот четко объясните.
3. сторока 140. сет курсор и все?
4. строка 004 - датчик Холла на 3 ноге. Это INT1 в UNO
противоречит строке 43 -
attachInterrupt(0, rpm, RISING)
!---------------------
так что налицо т.н. "брехня обыкновенная". Удачи!
Ok!
1. Настройка таймера - только при этом делителе вентилятор не прищал при малом заполнении ШИМ (от 50 до 150).
3. Поначалу после этой строки выводились результаты измерений с аналогового входа А1, после было вынесено в отдельную функцию, забыл убрать.
4. Данная строка вообще нигде не используеться, внесено для наглядности самому себе. Первый вариант считал по 3 цифровому входу, соответственно строка 43 была attachInterrupt(1, rpm, RISING). После того, как перестал работать счетчик оборотов - пробовал считать по 2-му цифровому входу, вот отсюда и attachInterrupt(0, rpm, RISING).
2. А вот с этим и возникла проблема, точнее после добавления этой части кода в скетч. Хотел сделать измерение со входа А1 поточнее, воспользовался статьей Making accurate ADC readings on the Arduino, Majenko's Hardware Hacking Blog. После добавления кода с данной статьи - начались проблемы. Как она работает и изза чего теперь не работают прерывания - я не знаю. В этом и был собственно мой вопрос.
Вопрос больше не актуален, разобрался сам. И да - все заработало. Спасибо всем за то, что не помогали. И лично для wdrakula - отдельное спасибо за оскорбления и обвинения во лжи. Вам вернеться, а мне плевать.