
Описание функции 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
(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; }