Функция pulseIn()

arduino-logo

Описание функции pulseIn

Функция pulseIn возвращает длительность сигнала на цифровом контакте платы Arduino при изменении состояния высокого HIGH на низкое LOW или наоборот.

Работает с импульсами от 3 микросекунд до 3 минут. Функцию необходимо вызывать, как минимум, за несколько десятков микросекунд до начала импульса. Лучше всего функция работает с короткими импульсами вместе с функцией noInterrupt().

Синтаксис

pulseIn(pin, state) 
pulseIn(pin, state, timeout)

Параметры

  • pin — номер пина, на котором должен появится сигнал.
  • state — тип сигнала: HIGH (переход c низкого на высокий) или LOW (переход с высокого на низкий).
  • timeout — время ожидания сигнала в микросекундах. По умолчанию 1 секунда.

Что возвращает

Длительность сигнала в микросекундах либо 0, если сигнал не появился в течении времени тайм-аут.

Пример для функции pulseIn

Подадим на входы 2 и 8 сигналы длительностью 250 мс и 125 мс соответственно, считаем их функцией pulseIn и выведем в последовательный монитор полученные значения длительности импульсов:

unsigned long d;          // Переменная для хранения длины импульса

void setup() {
  Serial.begin(9600);     
  pinMode(2, INPUT);
  pinMode(8, INPUT);
}

void loop() {
  d = pulseIn(2, HIGH);   // Считываем длину сигнала на 2 цифровом входе (длительность импульса в состоянии логической 1)
  Serial.print("D2=");
  Serial.println(d);      // Выводим в порт
  d = pulseIn(8, LOW);    // Считываем длину сигнала на 8 цифровом входе (длительность импульса в состоянии логического 0, в данном конкретном примере они одинаковы)
  Serial.print("D8=");
  Serial.println(d);      // Выводим в порт
}
Функция pulseIn в Ардуино

Код функции pulseIn

(hardware/arduino/avr/cores/arduino/wiring_pulse.c 1.8.10)

unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeout)
{
	uint8_t bit = digitalPinToBitMask(pin);
	uint8_t port = digitalPinToPort(pin);
	uint8_t stateMask = (state ? bit : 0);

	unsigned long maxloops = microsecondsToClockCycles(timeout)/16;

	unsigned long width = countPulseASM(portInputRegister(port), bit, stateMask, maxloops);

	if (width)
		return clockCyclesToMicroseconds(width * 16 + 16);
	else
		return 0;
}
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии