Обнуляются все переменные. и программа стартует заново.
- Войдите на сайт для отправки комментариев
Пнд, 13/11/2017 - 19:55
Доброго времени суток, пытаюсь написать измерение скорости оборотов. есть электромоторчик, на нём диск с прорезями и датчик скорости вращения.
Прошелся по гайдам, написал такой код...
Скорость считывается правильно, и регулировка мощности работает, но через некоторое время, все переменные принимают значение по умолчанию и всё останавливается.
Помогите понять в чём причина.
#define PIN_DO 2
volatile unsigned long pulses; // количество прерываний
float rps; // обороты в секунду
unsigned long timeOld; // время для сравнения
#define HOLES_DISC 8 // количество отвествий в диске
int speedSet; // можность для электромотора
long n = 0; // счетчик "циклов"
void counter()
{
pulses++;
}
void setup()
{
Serial.begin(9600);
pinMode(PIN_DO, INPUT);
speedSet = 0;
pulses = 0;
timeOld = 0;
attachInterrupt(digitalPinToInterrupt(PIN_DO), counter, FALLING);
analogWrite(9, speedSet);
}
void loop()
{
if(Serial.available()){ // здесь задаю мощность для электромотора, с серийного порта
speedSet = Serial.parseInt();
analogWrite(9, speedSet);
}
if (millis() - timeOld >= 1000) // выполняется раз в секунду
{
n++;
detachInterrupt(digitalPinToInterrupt(PIN_DO));
rps = (pulses) / (HOLES_DISC);
Serial.print(n);
Serial.print(" - ");
Serial.print(speedSet);
Serial.print(" - ");
Serial.println(rps);
timeOld = millis();
pulses = 0;
attachInterrupt(digitalPinToInterrupt(PIN_DO), counter, FALLING);
}
}
Для чего вы делаете detachInterrupt()/attachInterrupt() в условии "выполняется раз в секунду"?
Я считаю количество изменений с 1 на 0, который идут с датчика оборотов, во время вычисления RPS я останавливаю прирывание, высчитываю, и запускаю заново.
Ну, это я понял, но для чего вы постоянно деаттачите и аттачите заново?
Читал гайд, где было написано что желательно приостанавливать прирывания во время расчета, для большей точности, если закомментировать detachInterrupt/attachInterrupt , то поведение остаётся таким же, через некоторое время всё перезапускается.
вангую - помеха по питанию, перезапуск ардуино.
Ну, в принципе правильно понимаете, только останавливаете неправильно.
#include <util/atomic.h> ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { // Считываем и обнуляем (если нужно) volatile переменные } // Делаем всё остальное: расчеты, вывод в Serial и пр.А так пока не вижу в скетче ничего такого, что могло бы прямо заваливать МК.
Прописал в сетапе вывод "START" в последовательный порт, что бы было видно перегружается ли он, и таки да, после какого-то времени выводит "START" и всё по новой.
По питанию, подключен по USB плюс 9 вольтовый блок питания подключен.
Даже если выставить изначально 255 на выход моторчика, то наблюдается такая картина...
(START выводится в setup() что бы видить когда перегружается)
Сделайте всё то же самое, но без запитывания моторчика. Диск покрутите рукой.
на ноги мотора электролит 1000х16 (ПОЛЯРНОСТЬ !!) + керамика 0.1
а вообще на схему, хоть одним глазком, посмотреть бы...
Да, мне тоже интересно, связан analogWrite() и моторчик. Думаю, что многое сразу станет ясно.
на ноги мотора электролит 1000х16 (ПОЛЯРНОСТЬ !!) + керамика 0.1
а вообще на схему, хоть одним глазком, посмотреть бы...
Спасибо, сейчас нарисую и скину схему.
Скорее всего не стабильное питание мотора из за этого не полностью открывается полевик, и греется, и падает ток на моторе, может ли это быть причиной перезагрузки ардуино?
Если питание разделено и прямоугольник с кружком - оптопара, то крайне сомнительно, на мой взгляд.
Если питание разделено и прямоугольник с кружком - оптопара, то крайне сомнительно, на мой взгляд.
та, да - питание они разделяют, а земли соединяют - дабы помеха шла на плату дуино. О_О
Ну, может и так. Я бы еще не стал в ардуину кучу питаний тыкать для начала. Если из нагрузки на ней только оптрон, то оставил бы чисто USB.
Разделил землю, и перестал перезагружаться, всем спасибо большое за ответы!
Паралельно двигателю поставить быстрый диод!
5к в затворе полевика может быть мало для полного открытия и если полевик греется советую увеличить подтягивающий резистор до 50к
Спасибо, попробую.