Здравствуйте. Подскажите как организовать подсчет импульсов датчика скорости ? Хочу вывести отображение скорости на семи сегментном индикаторе для проверки эбу. На датчике скорости написано 6 импульсов = 1метр. Сами имульсы будут или на таймере NE555. Или ,если возможно, на самом ардуино. Надо как-то подсчитать импульсы и перевести все в скорость. Сам в программировании не особо. Пните в нужном направлении.
Видимо, направлять нужно в раздел “Ищу исполнителя”
Подождите. Может кто подскажет. Дальше сам начну.
Пожалейте ЭБУ !!!
Датчик скорости связан с его оборотами, но никак не связан с метрами !!!
V=S/t, (V- скорость, t- время , S- расстояние) в мое случае S=6*i (где i-импульсы). Получается V=6*i/t. Как подсчитать импульсы?
На датчике скорости написано 6 импульсов на 1 метр.
На датчике скорости написано 6 импульсов на 1 метр.
Прекрасно! 1 импульс 1/6. Классно.
не начнете…
Благодарю.
Спасибо.
6 импульсов на метр означает, что частота импульсов вряд ли превысит 400-500 импульсов в секунду. Это вообще не о чем, для любого МК это черепашья скорость.
Тут подойдет практически любой метод подсчета, хотя бы даже тупой опрос пина в цикле…
Вот примерный код от ИИ Яндекса
const int inputPin = 8; // Пин для входа импульсов
unsigned long previousMillis = 0;
const unsigned long interval = 1000; // интервал измерения в миллисекундах
volatile unsigned long pulseCount = 0;
int lastPinState = LOW;
int currentPinState;
void setup() {
Serial.begin(9600);
pinMode(inputPin, INPUT);
}
void loop() {
unsigned long currentMillis = millis();
// Опрашиваем состояние пина
int pinState = digitalRead(inputPin);
// Если пришел фронт импульса (т.е. изменение с LOW на HIGH)
if (lastPinState == LOW && pinState == HIGH) {
pulseCount++;
}
lastPinState = pinState;
// Проверяем, пришло ли время выводить результат
if (currentMillis - previousMillis >= interval) {
Serial.print("Импульсов за ");
Serial.print(interval);
Serial.print(" мс: ");
Serial.println(pulseCount);
pulseCount = 0; // сброс счётчика
previousMillis = currentMillis;
}
}
Пожелание ТС - сейчас вокруг столько вариантов ИИ, что стыдно напрягать подобной ерундой живых людей. Учитесь пользоваться новой технологией, она просто спасение для лентяев и неучей
Спасибо.
Когда с ии сталкиваюсь или пользуюсь, почему то вот этот рассказ в журнале Пионер из деЦтва вспоминается. Ссылку и название Алиса подсказала.
Вам нужно считать импульсы в течении, скажем, секунды. Начитали 12 импульсов, например. Это означает 2 метра в секунду. Если скорость предполагается большой - возьмите интервал времени поменьше, например, 200 мсек. Если скорость супер маленькая, наОборот возьмите интервал в несколько секунд.
Чтобы посчитать скорость нужно и расстояние и время. Время выдумайте себе сами.
Направление пинка: прерывания, обработчик прерывания от пина, таймер.
Можно делать и наоборот: измерять время, в течение которого придет заранее заданное количество импульсов.
С чем столкнулся я в своё время с датчиком скорости:
Датчик а/м Subaru - 12 импульсов на один оборот датчика.
Время между двумя соседними импульсами ОЧЕНЬ сильно отличается !!!
Пришлось организовать кольцевой буфер на 12 значений и суммировать время полного оборота …
Измерял число тактов через Input Capture таймера с учётом возможных переполнений на малой скорости вращения.
Всем спасибо. Направление понял.
Здравствуйте. Возвращаюсь к своей теме. Подскажите, что делаю не так. По кускам слепил скетч. Импульсы с 9-го вывода ардуино идут на 4-ый. С помощью потенциометра меняю частоту(проверил осцилом). Подцеплял щиток приборов от ваз 2115 - стрелка спидометра подымается. Но 7-ми сег.индикатор TM1637 не отображает цифры. Сам индикатор проверял с другим скетчем работает. Заранее спасибо.
#include <TM1637.h>
// Определяем пины для подключения дисплея TM1637
#define CLK 2
#define DIO 3
#define BUZ_PIN 9
#define POT_PIN A0
// Определяем пин для подключения датчика импульсов
#define PULSE_PIN 4
// Определяем количество импульсов на метр
#define PULSES_PER_METER 6.0
float S = 0;
// Создаем объект дисплея TM1637
TM1637 tm1637(CLK, DIO);
// Переменные для подсчета импульсов и времени
volatile unsigned long pulse_count = 0;
unsigned long last_time = 0;
void setup() {
// Инициализируем дисплей
{
tm1637.init();
tm1637.set( 7 );
} // Устанавливаем яркость дисплея (0-7)
// Настраиваем пин датчика как вход
pinMode(PULSE_PIN, INPUT_PULLUP); // Используем внутренний подтягивающий резистор
// Подключаем прерывание для подсчета импульсов
attachInterrupt(digitalPinToInterrupt(PULSE_PIN), pulse_count, RISING);
}
void loop() {
// Получаем текущее время
unsigned long current_time = millis();
{
int hz = analogRead(POT_PIN)* 0.7; // до 700 Гц
tone(BUZ_PIN, hz);
}
// Проверяем, прошло ли достаточно времени для расчета скорости (например, 1 секунда)
if (current_time - last_time >= 1000) {
// Вычисляем скорость в метрах в секунду
float S = ((float)pulse_count / PULSES_PER_METER * 3,6); //Вычисляем скорость в км/ч
unsigned int RAWtemp = S * 100; // переводим в целое число
int8_t Digits[ ]= {0x00,0x00,0x00,0x00}; // буфер для цифр LED-индикатора
Digits[0] = (byte)(RAWtemp / 1000) % 10; // раскидываем 4-значное число на цифры
Digits[1] = (byte)(RAWtemp / 100) % 10;
Digits[2] = (byte)(RAWtemp / 10) % 10;
Digits[3] = (byte)(RAWtemp) % 10;
tm1637.display(Digits);
tm1637.point(false);
tm1637.display(0, Digits[0]);
tm1637.point(false);
tm1637.display(1, Digits[1]);
tm1637.point(false);
tm1637.display(2, Digits[2]);
tm1637.point(false);
tm1637.display(3, Digits[3]);
delay(500);
} // Отображаем скорость на дисплее
// Выводим скорость, умноженную на 100 (для отображения десятых и сотых долей)
// Сбрасываем счетчик импульсов и обновляем время
pulse_count = 0;
last_time = current_time;
}
// Функция прерывания для подсчета импульсов
void countPulse() {
pulse_count++;
}