Использование millis() вместо delay()

SpearMint
SpearMint аватар
Offline
Зарегистрирован: 23.11.2015

Доброго времени суток. У меня имеется работающая функция для измерение питающего напряжения микроконтроллера, хотел использовать millis() вместо delay() (currentTime>=loopTime+Timer){...}), но ничего не выходит. Помогите пожалуйста разобраться, так как из за слабого понимания работы функции не могу правильно выставить паузы.

float readVcc(){
	float result = 0.0;
	float tmp = 0.0;
	ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
	delay(1);//Здесь пауза
	ADCSRA |= _BV(ADSC);//Start conversion
	while (bit_is_set(ADCSRA,ADSC));//measuring
	uint8_t low  = ADCL;//must read ADCL first - it then locks ADCH
	uint8_t high = ADCH;//unlocks both
	tmp = (high<<8) | low;
	tmp = (typVbg * 1023.0) / tmp;
	result = result + tmp;
	curV=result;
	return result;
}

 

SpearMint
SpearMint аватар
Offline
Зарегистрирован: 23.11.2015
curV=result;

лишняя строка, забыл удалить.

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

SpearMint, этот delay(1) можно вообще убрать, это пауза навсякий случай. Или сделать раз в 100 меньше. В функции analogRead например паузы нет.  Если вы в скече не производите измерения с других аналоговых входов, то настройку мультиплексора можно убрать в секцию setup()

SpearMint
SpearMint аватар
Offline
Зарегистрирован: 23.11.2015

Я тоже так думал, но как только убрал паузу почему то функция начала показывать вместо ~4.8 около 1.2v

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

SpearMint, значит не успевает зарядиться конденсатор на выводе Aref. Ну тогда подбирайте поменьше паузу, или настройку ADMUX  перенести в setup()

SpearMint
SpearMint аватар
Offline
Зарегистрирован: 23.11.2015

 Действительно, в пустом скетче всё работает. Проблема оказалось в том что у меня на аналоговом выходе висят кнопки, они и мешают работе функции. Буду думать что делать с этим, спасибо.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Одно не понял, при чем тут millis?

SpearMint
SpearMint аватар
Offline
Зарегистрирован: 23.11.2015

использование millis позволяет не использовать delay(), благодаря этому можно не отвлекать МК на паузы и в "свободное" время продолжать выполнять программу

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Вижу скетч с delay, а с millis нет. Потому и спрашиваю.