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




