датчик положения дроссельной заслонки
- Сообщения: 201
- Зарегистрирован: Вт июн 01, 2021 22:09:42
давление работает норм. сигнал с трима на вход приходит. проговорю алгоритм работы датчика холла. на валу стоит 2 магнита. один полюс включает датчик (дает верхний фронт) , второй магнит обратным полюсом выключает датчик (дает нижний фронт). получается за оборот датчик 2 раза меняет состояние это нужно использовать для счета.
Последний раз редактировалось ЗАВ Пн июн 15, 2026 14:54:45, всего редактировалось 1 раз.
самое сложно - сделать просто
- Реклама
- Сообщения: 393
- Зарегистрирован: Чт май 07, 2026 00:30:38
тогда убедиться, что это соответствие верно:
#define CH_ADC_TRIM 7 // Канал АЦП датчика "ТРИМ".
#define CH_ADC_PRESSURE 2 // Канал АЦП датчика "ДАВЛЕНИЕ".
#define CH_ADC_COUNT 0 // Канал АЦП датчика "СЧЁТЧИК".
#define CH_ADC_TRIM 7 // Канал АЦП датчика "ТРИМ".
#define CH_ADC_PRESSURE 2 // Канал АЦП датчика "ДАВЛЕНИЕ".
#define CH_ADC_COUNT 0 // Канал АЦП датчика "СЧЁТЧИК".
- Сообщения: 201
- Зарегистрирован: Вт июн 01, 2021 22:09:42
загрузил 21 скеч - трим работает, 22 и 23 трим стоит на нуле.
самое сложно - сделать просто
- Сообщения: 393
- Зарегистрирован: Чт май 07, 2026 00:30:38
в 21:
#define CH_ADC_TRIM 1 // Канал АЦП датчика "ТРИМ".
Но потом было:
#define CH_ADC_TRIM 7 // Канал АЦП датчика "ТРИМ".
На последней схеме тоже А7
#define CH_ADC_TRIM 1 // Канал АЦП датчика "ТРИМ".
Но потом было:
поэтому сейчас стоитЗАВ писал(а): Вт июн 09, 2026 11:12:21 схема не соответствует распайки . проверил, по факту трим подключен к А7.
#define CH_ADC_TRIM 7 // Канал АЦП датчика "ТРИМ".
На последней схеме тоже А7
- Сообщения: 201
- Зарегистрирован: Вт июн 01, 2021 22:09:42
трим стоит на А7. у меня 7 нога работает в 21 скетче. на 55 строке. помниться мне у трима в 21 скетче не было ноля. сейчас стоит ноль и не на что не реагирует.(в21 скетче с пустым пином значения бегали хаотично). я подозреваю, что в ТРИМ были внесены изменения для стабилизации ноля?
самое сложно - сделать просто
- Реклама
- Сообщения: 393
- Зарегистрирован: Чт май 07, 2026 00:30:38
Да, нашёл: при тесте настройки диапазонов поставил
#define LOW_VOLTAGE_TRIM 800 // Минимальное напряжение (в значениях АЦП), при котором отображается LOW_DISPLAY_TRIM
и забыл вернуть
сделайте
#define LOW_VOLTAGE_TRIM 0
(или какое-то иное значение, если 0 должен отображаться при некотором ненулевом напряжении)
#define LOW_VOLTAGE_TRIM 800 // Минимальное напряжение (в значениях АЦП), при котором отображается LOW_DISPLAY_TRIM
и забыл вернуть
сделайте
#define LOW_VOLTAGE_TRIM 0
(или какое-то иное значение, если 0 должен отображаться при некотором ненулевом напряжении)
- Сообщения: 201
- Зарегистрирован: Вт июн 01, 2021 22:09:42
ТРИМ заработал, однако вместо нуля показания 0,25. и хотя скетче выставлено ТРИМ - 1 знак после запятой, а давление 2 знака, по факту все наоборот. у трима -2 знака , у давления 1 знак. почему в комментариях наоборот ? поменял местами. разрядность восстановилась. ТРИМ нормально считает до 10, потом показывает галиматью. то 24, то 37. ошибка какая то.
счетчик не работает от слова совсем, только переключается при размотки с индикатор ТРИМА (а должен с давления - нужно исправить) и на индикаторе стоит ноль.
счетчик не работает от слова совсем, только переключается при размотки с индикатор ТРИМА (а должен с давления - нужно исправить) и на индикаторе стоит ноль.
самое сложно - сделать просто
- Сообщения: 393
- Зарегистрирован: Чт май 07, 2026 00:30:38
счётчик я не тестировал.
Диапазон отображения и диапазон фактического напряжения на датчике регулируются с помощью:
#define LOW_DISPLAY_TRIM 0 // Минимальное отображаемое значение "ТРИМ"
#define LOW_VOLTAGE_TRIM 0 // Минимальное напряжение (в значениях АЦП), при котором отображается LOW_DISPLAY_TRIM
#define HIGH_DISPLAY_TRIM 800 // Максимальное отображаемое значение "ТРИМ"
#define HIGH_VOLTAGE_TRIM 952 // Минимальное напряжение (в значениях АЦП), при котором отображается HIGH_DISPLAY_TRIM
АЦП выдаёт 0 при 0 В и 1024 при 5 В.
Комментарии писались методом "копи-пасте", где-то мог забыть исправить. В случае подобных ошибок следует ориентироваться на имена определений.
У меня на первом дисплее показывается 0...80 на втором 0...4 и счётчик переключает второй.
ранее было:
#define CH_ADC_TRIM 7 // Канал АЦП датчика "ТРИМ".
#define CH_ADC_PRESSURE 2 // Канал АЦП датчика "ДАВЛЕНИЕ".
#define CH_ADC_COUNT 0 // Канал АЦП датчика "СЧЁТЧИК".
volatile uint8_t adcChannels[3] = { CH_ADC_TRIM, CH_ADC_PRESSURE, CH_ADC_COUNT }; // Каналы АЦП для датчиков 1...3 индикаторов 0...2

Диапазон отображения и диапазон фактического напряжения на датчике регулируются с помощью:
#define LOW_DISPLAY_TRIM 0 // Минимальное отображаемое значение "ТРИМ"
#define LOW_VOLTAGE_TRIM 0 // Минимальное напряжение (в значениях АЦП), при котором отображается LOW_DISPLAY_TRIM
#define HIGH_DISPLAY_TRIM 800 // Максимальное отображаемое значение "ТРИМ"
#define HIGH_VOLTAGE_TRIM 952 // Минимальное напряжение (в значениях АЦП), при котором отображается HIGH_DISPLAY_TRIM
АЦП выдаёт 0 при 0 В и 1024 при 5 В.
Комментарии писались методом "копи-пасте", где-то мог забыть исправить. В случае подобных ошибок следует ориентироваться на имена определений.
У меня на первом дисплее показывается 0...80 на втором 0...4 и счётчик переключает второй.
ранее было:
притом, каналы:ЗАВ писал(а): Ср июн 03, 2026 08:56:45 на первом индикаторе "ТРИМ" значение должно быть 0-80,0. на втором индикаторе "ДАВЛЕНИЕ" 0-4,00.
#define CH_ADC_TRIM 7 // Канал АЦП датчика "ТРИМ".
#define CH_ADC_PRESSURE 2 // Канал АЦП датчика "ДАВЛЕНИЕ".
#define CH_ADC_COUNT 0 // Канал АЦП датчика "СЧЁТЧИК".
volatile uint8_t adcChannels[3] = { CH_ADC_TRIM, CH_ADC_PRESSURE, CH_ADC_COUNT }; // Каналы АЦП для датчиков 1...3 индикаторов 0...2
- Сообщения: 201
- Зарегистрирован: Вт июн 01, 2021 22:09:42
в 6 строке #define LOW_VOLTAGE_TRIM 50 . поставил 50 вместо 0, однако минимальное значение все равно осталось 2,5.
в 19 строке стоит #define HIGH_DISPLAY_PRESSURE 245 // Максимальное отображаемое значение "ДАВЛЕНИЕ". значит выше 2,45 не может быть значение, а показывает боллее 3,00 при 1,6 в.
Я что то не понимаю ? градуировка вторично, с начало нужно отладить функционал. почему ТРИМ после значения 10 начинает подвисать и боллее 16 показывает ерунду
в 19 строке стоит #define HIGH_DISPLAY_PRESSURE 245 // Максимальное отображаемое значение "ДАВЛЕНИЕ". значит выше 2,45 не может быть значение, а показывает боллее 3,00 при 1,6 в.
Я что то не понимаю ? градуировка вторично, с начало нужно отладить функционал. почему ТРИМ после значения 10 начинает подвисать и боллее 16 показывает ерунду
самое сложно - сделать просто
- Сообщения: 393
- Зарегистрирован: Чт май 07, 2026 00:30:38
Минимальное показание ограничено нулём, но максимальные - 999
То есть, если HIGH_VOLTAGE_DISPLAY 245 при HIGH_VOLTAGE_PRESSURE 1024 тогда да, показания не должны превышать 245.
Но если HIGH_VOLTAGE_PRESSURE 800 - то 245 будет показано при 3,9 В (5 В/1024 * 800 = 3.9). Если датчик выдаст более 3.9 - на дисплее отобразится и большее значение.
То есть, определения LOW_DISPLAY_... HIGH_DISPLAY... и LOW_VOLTAGE_... HIGH_VOLTAGE_... позволяют отмасштабировать реальный диапазон напряжений на датчике к диапазону отображения индикатора.
Это как раз первично, позволяет исключить несоответствия, особенно когда я не знаю, какое напряжение, и фактически:
Предыдущий программист мог применять какой-то цифровой фильтр.
То есть, причиной может быть помеха на сигнале датчика или на питании Ардуино.
Оба канала (давление и трим) в программе обрабатываются совершенно одинаково. Просто подставляются те самые LOW_DISPLAY_... HIGH_DISPLAY... и LOW_VOLTAGE_... HIGH_VOLTAGE_...
То есть, если HIGH_VOLTAGE_DISPLAY 245 при HIGH_VOLTAGE_PRESSURE 1024 тогда да, показания не должны превышать 245.
Но если HIGH_VOLTAGE_PRESSURE 800 - то 245 будет показано при 3,9 В (5 В/1024 * 800 = 3.9). Если датчик выдаст более 3.9 - на дисплее отобразится и большее значение.
То есть, определения LOW_DISPLAY_... HIGH_DISPLAY... и LOW_VOLTAGE_... HIGH_VOLTAGE_... позволяют отмасштабировать реальный диапазон напряжений на датчике к диапазону отображения индикатора.
Это как раз первично, позволяет исключить несоответствия, особенно когда я не знаю, какое напряжение, и фактически:
Почему может скакать: сейчас логика работы очень проста: АЦП делает тридцать две выборки и получает среднее арифметическое из них. Также предполагается, что сигнал стабильный. У меня в качестве сигнал используется переменный резистор, и всё это на столе - ни помех, ни каких-то нестабильностей от датчика. Индикаторы работают без рывков и зависаний. Но как только я вытаскиваю провод от резистора, даже на столе Ардуино "сходит с ума" и отображает ахинею.
Предыдущий программист мог применять какой-то цифровой фильтр.
То есть, причиной может быть помеха на сигнале датчика или на питании Ардуино.
Оба канала (давление и трим) в программе обрабатываются совершенно одинаково. Просто подставляются те самые LOW_DISPLAY_... HIGH_DISPLAY... и LOW_VOLTAGE_... HIGH_VOLTAGE_...
- Сообщения: 201
- Зарегистрирован: Вт июн 01, 2021 22:09:42
помехи отсутствую. мотор не запущен. датчики аналоговые НЕ резистивные (ТРИМ - датчик холла ) у него сигнал чище, чем резистор. думаю проблема в ПО
загрузил 21 скетч - все считает нормально. в нем нужна только калибровка
загрузил 21 скетч - все считает нормально. в нем нужна только калибровка
Последний раз редактировалось ЗАВ Пн июн 15, 2026 20:18:50, всего редактировалось 1 раз.
самое сложно - сделать просто
- Сообщения: 393
- Зарегистрирован: Чт май 07, 2026 00:30:38
тогда проблема была бы на обоих каналах... перепроверю сегодня.
--------------------
нашёл пару странностей, и счётчик считает, но не так, как бы хотелось... через пару дней выдам пробное. Надо причесать всё, а то код стал неудобным и нелогичным.
--------------------
нашёл пару странностей, и счётчик считает, но не так, как бы хотелось... через пару дней выдам пробное. Надо причесать всё, а то код стал неудобным и нелогичным.
- Сообщения: 393
- Зарегистрирован: Чт май 07, 2026 00:30:38
Новый вариант. У меня на стенде считает, показывает... вроде, всё нормально.
Настройки:
пользователя в файле user.h
ардуины, дисплея и каналов АЦП - device.h
Сейчас счётчик настроен на прибавление, запоминание и уменьшение.
Меньше нуля не делается (поэтому, если пороги напряжения выбраны так, что первое вращение будет уменьшать - счётчик останется 0).
Для режима со сбросом счётчика убрать // перед TURN_RESET. В этом случае счётчик обнуляется при исчезновении с индикатора, любое направление прибавляет его.
Настройки:
пользователя в файле user.h
ардуины, дисплея и каналов АЦП - device.h
Сейчас счётчик настроен на прибавление, запоминание и уменьшение.
Меньше нуля не делается (поэтому, если пороги напряжения выбраны так, что первое вращение будет уменьшать - счётчик останется 0).
Для режима со сбросом счётчика убрать // перед TURN_RESET. В этом случае счётчик обнуляется при исчезновении с индикатора, любое направление прибавляет его.
- Вложения
-
- sketch_30.zip
- (19.5 КБ) 10 скачиваний
- Сообщения: 201
- Зарегистрирован: Вт июн 01, 2021 22:09:42
опробовал. есть проблемы
давление норм. (изменил на 2 атм).
ТРИМ работает, но не могу разобраться с индикацией. в настройках 1- индицирует один знак перед запятой. 2- все уходит в сотые. 0- норм - десятки 70-0, но нет третьего знака после запятой.
счетчик все плохо. с вашими настройками считал только в + , при намотке - 999 и висит. изменил на свои намотка есть , - при размотке 0. с последними настройками вообще отказался считать.что не так делаю ? или проблема со скетчем ...
ставил так-
#define DIR1_LOW 500 // минимальное напряжение (в значениях АЦП) первого направления 3,7в- 757
#define DIR1_HIGH 830 // максимальное напряжение (в значениях АЦП) первого направления
// увеличение счётка
#define DIR2_LOW 860 // минимальное напряжение (в значениях АЦП) второго направления 4,45-911
#define DIR2_HIGH 1024 // максимальное напряжение (в значениях АЦП) второго направления
давление норм. (изменил на 2 атм).
ТРИМ работает, но не могу разобраться с индикацией. в настройках 1- индицирует один знак перед запятой. 2- все уходит в сотые. 0- норм - десятки 70-0, но нет третьего знака после запятой.
счетчик все плохо. с вашими настройками считал только в + , при намотке - 999 и висит. изменил на свои намотка есть , - при размотке 0. с последними настройками вообще отказался считать.что не так делаю ? или проблема со скетчем ...
ставил так-
#define DIR1_LOW 500 // минимальное напряжение (в значениях АЦП) первого направления 3,7в- 757
#define DIR1_HIGH 830 // максимальное напряжение (в значениях АЦП) первого направления
// увеличение счётка
#define DIR2_LOW 860 // минимальное напряжение (в значениях АЦП) второго направления 4,45-911
#define DIR2_HIGH 1024 // максимальное напряжение (в значениях АЦП) второго направления
самое сложно - сделать просто
- Сообщения: 393
- Зарегистрирован: Чт май 07, 2026 00:30:38
Да, с погасшим разрядом это моя ошибка, пока возился со счётчикам, оптимизировал отображение его и где-то нарушил основные, и не заметил. Прошу прощения. Сегодня вечером исправлю.
А вот то, что счётчик считает не очень - мне тут очень сложно понять. На макетке я делаю вроде даже в относительно худших условиях - касаюсь проводом двух источников напряжения. Тут и дребезг, и сопротивления. И он иногда на дребезге делает ложные срабатывания, проскакивая фильтр. Но он всё равно считает. Датчики Холла здесь в более выигрышном положении: у них гистерезис, исключающий подобное.
Но всё же хотелось бы видеть осциллограмму сигнала от них на входе Ардуино. Без этого я не могу сказать, почему такое различное поведение.
Если доходит до 999 - это значит, что сделано 999 подсчётов. Больше отображать он не сможет, если не растягивать на два дисплея.
У счётчика есть делитель: #define TURN_IMPULS 1 // Количество импульсов, изменяющих счётчик на единицу.
А вот то, что счётчик считает не очень - мне тут очень сложно понять. На макетке я делаю вроде даже в относительно худших условиях - касаюсь проводом двух источников напряжения. Тут и дребезг, и сопротивления. И он иногда на дребезге делает ложные срабатывания, проскакивая фильтр. Но он всё равно считает. Датчики Холла здесь в более выигрышном положении: у них гистерезис, исключающий подобное.
Но всё же хотелось бы видеть осциллограмму сигнала от них на входе Ардуино. Без этого я не могу сказать, почему такое различное поведение.
Если доходит до 999 - это значит, что сделано 999 подсчётов. Больше отображать он не сможет, если не растягивать на два дисплея.
У счётчика есть делитель: #define TURN_IMPULS 1 // Количество импульсов, изменяющих счётчик на единицу.
- Сообщения: 201
- Зарегистрирован: Вт июн 01, 2021 22:09:42
немного не так.
счетчик на сбросе досчитал до 0-106 (должно быть 30). начинаю подъем - на дисплее 999. реакции нет.
по поведению я подозреваю, что счетчик использует для счета один фронт снижая дискретность. есть возможность использовать оба фронта ? ( ПОДЪЕМ/СПАД)
завтра сделаю видео осциолограмму
счетчик на сбросе досчитал до 0-106 (должно быть 30). начинаю подъем - на дисплее 999. реакции нет.
по поведению я подозреваю, что счетчик использует для счета один фронт снижая дискретность. есть возможность использовать оба фронта ? ( ПОДЪЕМ/СПАД)
завтра сделаю видео осциолограмму
самое сложно - сделать просто
- Сообщения: 393
- Зарегистрирован: Чт май 07, 2026 00:30:38
Если использовать оба фронта, то на один пролёт магнита мимо датчика будет два импульса и 212 вместо 30.
И это особо ничего не меняет, можно выставить деление на 2 и считать о одному фронту, как сейчас.
Если при 106 должно быть 30, то надо выставить делитель #define TURN_IMPULS (106/30)
Дробные числа не используются, поэтому результат будет округлён.
Алгоритм реализован просто:
есть напряжение - анализируется, что было раньше: ноль или такое же напряжение. Если такое же - состояние не изменилось. Если ноль - значит, сейчас импульс.
По уровню и выбранной логике (всегда сбрасывать счётчик или сохранять и потом уменьшать) определяется, в какую сторону импульс.
Учитывая скачок от 106 до 999, возможно, было какое-то переполнение, но вообще странно. Попробую увидеть.
И это особо ничего не меняет, можно выставить деление на 2 и считать о одному фронту, как сейчас.
Если при 106 должно быть 30, то надо выставить делитель #define TURN_IMPULS (106/30)
Дробные числа не используются, поэтому результат будет округлён.
Алгоритм реализован просто:
есть напряжение - анализируется, что было раньше: ноль или такое же напряжение. Если такое же - состояние не изменилось. Если ноль - значит, сейчас импульс.
По уровню и выбранной логике (всегда сбрасывать счётчик или сохранять и потом уменьшать) определяется, в какую сторону импульс.
Учитывая скачок от 106 до 999, возможно, было какое-то переполнение, но вообще странно. Попробую увидеть.
- Сообщения: 201
- Зарегистрирован: Вт июн 01, 2021 22:09:42
хотелось бы в счете видеть один знак после запятой.
самое сложно - сделать просто
- Сообщения: 393
- Зарегистрирован: Чт май 07, 2026 00:30:38
с ошибкой ТРИМ нашёл:
#define HIGH_DISPLAY_TRIM 80 // Максимальное отображаемое значение "ТРИМ"
я сам забыл, что здесь надо показывать с учётом точки, то есть, правильно надо так:
#define HIGH_DISPLAY_TRIM 800 // Максимальное отображаемое значение "ТРИМ", с учётом десятичной точки, например:
// желаемое отображение 34.5 или 3.45 - HIGH_DISPLAY_TRIM одинаково 345, изменяется только местоположение точки в #define DOT_TRIM
#define HIGH_DISPLAY_TRIM 80 // Максимальное отображаемое значение "ТРИМ"
я сам забыл, что здесь надо показывать с учётом точки, то есть, правильно надо так:
#define HIGH_DISPLAY_TRIM 800 // Максимальное отображаемое значение "ТРИМ", с учётом десятичной точки, например:
// желаемое отображение 34.5 или 3.45 - HIGH_DISPLAY_TRIM одинаково 345, изменяется только местоположение точки в #define DOT_TRIM
- Сообщения: 201
- Зарегистрирован: Вт июн 01, 2021 22:09:42
трим заработал норм, давление тоже норм.
счетчик при первом включении и размотке - считает в + норм. намотку ( счет в минус с амплитудой 3,7в) не видит на индикаторе 0. повторяю размотку - не реагирует - на индикаторе ноль.
осциолограму смотрел , ввиду низкой частоты , происходит показ постоянного напряжения с разным уровнем .
счетчик при первом включении и размотке - считает в + норм. намотку ( счет в минус с амплитудой 3,7в) не видит на индикаторе 0. повторяю размотку - не реагирует - на индикаторе ноль.
осциолограму смотрел , ввиду низкой частоты , происходит показ постоянного напряжения с разным уровнем .
самое сложно - сделать просто


