Корректор электронного (стрелочного) спидометра на ARDUINO
Корректор электронного (стрелочного) спидометра на ARDUINO
Что то я не увидел там про спидометр,тахометр.
Разве тупо подавать на вход сигнал. Должно быть некий код дописан
Разве тупо подавать на вход сигнал. Должно быть некий код дописан
- Артур
- Друг клуба
- Сообщения: 1622
- Зарегистрирован: 12 ноя 2009, 22:38
- Бус: T3 2.8 VR6
- Откуда: Ессентуки
Корректор электронного (стрелочного) спидометра на ARDUINO
Ну это уже самостоятельно надо изобретать. По ссылке там этот драйвер подключен к ардуино и рулит мотором, кусок кода с примером как им рулить. Остальное сам изобретай, скетч пиши.
8(928)376-99-75
- Андрюха Бух
- Сообщения: 9
- Зарегистрирован: 18 апр 2017, 22:29
- Бус: Volkswagen Caravelle T-3
- Откуда: Луганск (ЛНР)
Корректор электронного (стрелочного) спидометра на ARDUINO
Ребята всем привет,может у кого есть эскиз с размерами диска на шрус для индуктивного датчика.Не знаю как он правильно называется.
- Андрюха Бух
- Сообщения: 9
- Зарегистрирован: 18 апр 2017, 22:29
- Бус: Volkswagen Caravelle T-3
- Откуда: Луганск (ЛНР)
Корректор электронного (стрелочного) спидометра на ARDUINO
У вас нет необходимых прав для просмотра вложений в этом сообщении.
- Артур
- Друг клуба
- Сообщения: 1622
- Зарегистрирован: 12 ноя 2009, 22:38
- Бус: T3 2.8 VR6
- Откуда: Ессентуки
Корректор электронного (стрелочного) спидометра на ARDUINO
UPDATE:
Для тех, у кого не заработал корректор тахометра - сделайте подтяжку 12 вольт через резистор 10кОм к проводу на тахометр после транзистора кс238. Опробовано на приборке от Golf 3.
Приборка не видит сигнал, т.к. фактически ардуино просто отключает-включает массу, уровень сигнала 0 вольт, а должно быть 12 вольт. УАЗ приборы работают, фольц не хочет. Резистор устраняет проблему.
Для тех, у кого не заработал корректор тахометра - сделайте подтяжку 12 вольт через резистор 10кОм к проводу на тахометр после транзистора кс238. Опробовано на приборке от Golf 3.
Приборка не видит сигнал, т.к. фактически ардуино просто отключает-включает массу, уровень сигнала 0 вольт, а должно быть 12 вольт. УАЗ приборы работают, фольц не хочет. Резистор устраняет проблему.
8(928)376-99-75
- Артур
- Друг клуба
- Сообщения: 1622
- Зарегистрирован: 12 ноя 2009, 22:38
- Бус: T3 2.8 VR6
- Откуда: Ессентуки
Корректор электронного (стрелочного) спидометра на ARDUINO
Отправлено спустя 34 минуты 42 секунды:
Подключение тахометра
У вас нет необходимых прав для просмотра вложений в этом сообщении.
8(928)376-99-75
- Артур
- Друг клуба
- Сообщения: 1622
- Зарегистрирован: 12 ноя 2009, 22:38
- Бус: T3 2.8 VR6
- Откуда: Ессентуки
Корректор электронного (стрелочного) спидометра на ARDUINO
Новая схема подключения датчика скорости. (или сигнала тахометра)
По такой же схеме нужно подключать и тахометр, только на 2 pin.
Была проблема, что сигнал не мог пройти через оптопару, в итоге ничего не работало. Исправил.
По такой же схеме нужно подключать и тахометр, только на 2 pin.
Была проблема, что сигнал не мог пройти через оптопару, в итоге ничего не работало. Исправил.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
- Артур
- Друг клуба
- Сообщения: 1622
- Зарегистрирован: 12 ноя 2009, 22:38
- Бус: T3 2.8 VR6
- Откуда: Ессентуки
Корректор электронного (стрелочного) спидометра на ARDUINO
Резистор R7 на схеме делает притяжку к 5 вольтам.
Для тахометра гольф 3 притяжка к 12 вольтам.
R8 для спидометра гольф 3 отсутствует.
Для тахометра гольф 3 притяжка к 12 вольтам.
R8 для спидометра гольф 3 отсутствует.
8(928)376-99-75
- Артур
- Друг клуба
- Сообщения: 1622
- Зарегистрирован: 12 ноя 2009, 22:38
- Бус: T3 2.8 VR6
- Откуда: Ессентуки
Корректор электронного (стрелочного) спидометра на ARDUINO
ОБНОВЛЕННЫЙ СКЕТЧ.
- Убран баг с танцами стрелок во время запуска.
- Убран баг с танцами стрелок во время запуска.
ПОКАЗАТЬ ИСХОДНЫЙ КОД
Код: Выделить всё
//ТАХОМЕТР
volatile unsigned long micros_th1 = 0;
volatile boolean sttaho = false; //триггер тахометра
volatile byte sztaho = 0; //счетчик обнуления
volatile unsigned int sptaho = 0; //кол-во оборотов
//КОРРЕКЦИЯ ТАХОМЕТРА
volatile unsigned int InputTaho = 0;
volatile unsigned int OutputTaho = 0;
double popravkaTaho = 0.667; //ДЛЯ двигателя 4ц приборка от 6ц - коэффициент 1.5
//СПИДОМЕТР
volatile unsigned long micros_sp = 0;
volatile byte sz = 0; //счетчик обнуления
volatile unsigned int sp = 0; //скорость
volatile boolean st = false; //триггер
//КОРРЕКЦИЯ СПИДОМЕТРА
volatile unsigned int InputSpeed = 0;
volatile unsigned int OutputSpeed = 0;
double popravka = 1;
//ВРЕМЯ РАБОТЫ ОСНОВНОЙ ПРОГРАММЫ (каждые 50 миллисекунд - указано в loop)
unsigned long timing;
//ГЕНЕРАТОР ИМПУЛЬСОВ СПИДОМЕТРА
unsigned long timing2;
unsigned long Period;
unsigned long Skvajnost;
bool Status=0;
//ГЕНЕРАТОР ИМПУЛЬСОВ ТАХОМЕТРА
unsigned long timing3;
unsigned long PeriodTaho=0;
unsigned long SkvajnostTaho=0;
bool StatusTaho=0;
//ПИНЫ
int OUTSPEEDPIN=4; //ПИН ВЫХОДА - НА СПИДОМЕТР
int OUTTAHOPIN=7; //ПИН ВЫХОДА - НА ТАХОМЕТР
#define PIN_POT A0 //ПИН СИГНАЛА ОТ ПОТЕНЦИОМЕТРА ПОПРАВКИ
//********************************************************************
void setup(){
Serial.begin(115200); //инициализация ком порта
attachInterrupt(1, speedometr, RISING); //прерывание спидометра по фронту импульса
attachInterrupt(0, tahometr, RISING); //прерывание тахометр по фронту импульса
pinMode(PIN_POT, INPUT);
pinMode(OUTSPEEDPIN, OUTPUT);
pinMode(OUTTAHOPIN, OUTPUT);
digitalWrite(OUTSPEEDPIN, LOW);
digitalWrite(OUTTAHOPIN, LOW);
}
//********************************************************************
void loop()
{
if (millis() - timing > 50)
{
timing = millis();
//Считаем спидометр:
if (sz != 0)
{
sz--;
}
else
{
sp = 0;
}
InputSpeed=sp; //Можно задать для проверки любую скорость
popravka=map(analogRead(PIN_POT),0,1023,0,200)*0.01; //Коэффициент умножения входящего сигнала от 0.00 до 2.00.
OutputSpeed=InputSpeed*popravka; //Вычисление правильной скорости
if((OutputSpeed>1)&&(OutputSpeed<220))
{
Period=600000/OutputSpeed;
}
else
{
Period=0; //Вычисление периода импульса
}
//Считаем тахометр
if (sztaho != 0)
{
sztaho--;
}
else
{
sptaho = 0;
}
InputTaho=sptaho;
OutputTaho=InputTaho*popravkaTaho; //Вычисление правильной скорости
int MPHfromSEC=OutputTaho*50;
if((OutputTaho>1) && (OutputTaho<200))
{
PeriodTaho=600000/OutputTaho;
}
else{
PeriodTaho=0; //Вычисление периода импульса
}
Serial.println("");
Serial.print("Скорость: ");
Serial.print(OutputSpeed);
Serial.print("км/ч; Коэффициент: ");
Serial.println(popravka);
Serial.print("Обороты ДВС: ");
Serial.print(MPHfromSEC);
Serial.print("об/сек; Коэффициент: ");
Serial.println(popravkaTaho);
Serial.println("");
}
//Генерируем импульсы для СПИДОМЕТРА
Skvajnost= Period/2 ; //такая скважность называется меандр
if (Status==0) {
if ( (micros()-timing2)>= Skvajnost) {
timing2 = micros();
digitalWrite(OUTSPEEDPIN, HIGH);
Status=1;
}
}
if (Status==1) {
if ( (micros()-timing2)>= (Period-Skvajnost) ){
timing2 = micros();
digitalWrite(OUTSPEEDPIN, LOW);
Status=0;
}
}
//Генерируем импульсы для ТАХОМЕТРА
SkvajnostTaho=PeriodTaho/2 ;
if (StatusTaho==0) {
if ( (micros()-timing3)>= SkvajnostTaho) {
timing3 = micros();
digitalWrite(OUTTAHOPIN, HIGH);
StatusTaho=1;
}
}
if (StatusTaho==1) {
if ( (micros()-timing3)>= (PeriodTaho-SkvajnostTaho) ){
timing3 = micros();
digitalWrite(OUTTAHOPIN, LOW);
StatusTaho=0;
}
}
}
//********************************************************************
void speedometr(){ //измеряем частоту на входе спидометра по прерыванию
if(!st){micros_sp = micros();}
else {sp = (600000/(micros() - micros_sp));}
st = !st;
sz = 30;
}
void tahometr(){ //измеряем частоту на входе тахометра по прерыванию
if(!sttaho){micros_th1 = micros();}
else {sptaho = (600000/(micros() - micros_th1));}
sttaho = !sttaho;
sztaho = 30;
}
У вас нет необходимых прав для просмотра вложений в этом сообщении.
8(928)376-99-75
- Артур
- Друг клуба
- Сообщения: 1622
- Зарегистрирован: 12 ноя 2009, 22:38
- Бус: T3 2.8 VR6
- Откуда: Ессентуки
Корректор электронного (стрелочного) спидометра на ARDUINO
Во время первой настройки, вышлел первый сюрприз. Оказывается некоторые спидометры имеют разные коээфиициенты поправок при разных скоростях. Причем нелинейным образом.
Т.е. условно при 20км поправка равна 0.6, при 40кмч поправка 0.51, а при 120кмч, вообще 0.75.
Я вношу сейчас изменения в код, чтобы была возможность калибровать прибор на разных скоростях. Чтобы стрелка показывала точные показания в сравнении с GPS
Т.е. условно при 20км поправка равна 0.6, при 40кмч поправка 0.51, а при 120кмч, вообще 0.75.
Я вношу сейчас изменения в код, чтобы была возможность калибровать прибор на разных скоростях. Чтобы стрелка показывала точные показания в сравнении с GPS
8(928)376-99-75
- Артур
- Друг клуба
- Сообщения: 1622
- Зарегистрирован: 12 ноя 2009, 22:38
- Бус: T3 2.8 VR6
- Откуда: Ессентуки
Корректор электронного (стрелочного) спидометра на ARDUINO
Видео работы нового скетча с картой поправок:
Объяснение каким образом откатать поправки при помощи GPS в смартфоне.
Отправлено спустя 16 минут 21 секунду:
СВЕЖИЙ СКЕТЧ от 21 июля 2021г с картой поправок для спидометра
Теперь можно очень точно установить для каждой скорости отдельную поправку. Я внёс плавное изменение поправки от точки до точки, т.е. не ступенчато. Себе я выкатал скорости 0, 20, 40, 60, 80, 100, 120, 140 км/ч. Вы можете откатать другие. Причём количество точек может быть произвольным, их число вносится в скетч. Чтобы скетч скомпилировался, вы должны не просто поменять число точек Lengthkalibr, но и внести такое же количество элементов в массивах "kalibrsp"(скорость от датчика) и массив поправок kalibrporv (коэффициенты на что умножить, чтобы прибор показал нужную скорость):
У меня вот такие значения при датчике на 11 импульсов на оборот колеса резина R16/215, спидометр Golf3 (с максималкой 220кмч)
у вас могут быть другие значения, в зависимости от резины и используемого датчика
СКАЧАТЬ СКЕТЧ
Объяснение каким образом откатать поправки при помощи GPS в смартфоне.
Отправлено спустя 16 минут 21 секунду:
СВЕЖИЙ СКЕТЧ от 21 июля 2021г с картой поправок для спидометра
Теперь можно очень точно установить для каждой скорости отдельную поправку. Я внёс плавное изменение поправки от точки до точки, т.е. не ступенчато. Себе я выкатал скорости 0, 20, 40, 60, 80, 100, 120, 140 км/ч. Вы можете откатать другие. Причём количество точек может быть произвольным, их число вносится в скетч. Чтобы скетч скомпилировался, вы должны не просто поменять число точек Lengthkalibr, но и внести такое же количество элементов в массивах "kalibrsp"(скорость от датчика) и массив поправок kalibrporv (коэффициенты на что умножить, чтобы прибор показал нужную скорость):
У меня вот такие значения при датчике на 11 импульсов на оборот колеса резина R16/215, спидометр Golf3 (с максималкой 220кмч)
у вас могут быть другие значения, в зависимости от резины и используемого датчика
Код: Выделить всё
const int Lengthkalibr=8;
int kalibrsp[Lengthkalibr]={0, 19, 37, 55, 73, 92, 112, 133}; //ТАБЛИЦА КАЛИБРОВОК - ВХОДЯЩАЯ СКОРОСТЬ
int kalibrporv[Lengthkalibr]={38, 38, 52, 60, 65, 67, 69, 70}; //ТАБЛИЦА КАЛИБРОВОК - ПОПРАВКА
//(в функции GetKalibr это число умножается на 0.01 на выходе имеем коэффициент умножения по таблице скорости)
У вас нет необходимых прав для просмотра вложений в этом сообщении.
8(928)376-99-75
-
- Сообщения: 4
- Зарегистрирован: 16 мар 2021, 18:55
- Бус: Фольксваген транспортер 3
Корректор электронного (стрелочного) спидометра на ARDUINO
Очень круто!
На старой прошивке и на старой схеме с оптопарой накатал уже 2500км, всё отлично! Штрафов с камер нет!☺ Сменил главную пару, посчитал коффициент для новой пары, и просто записал его, не откатывая по gps потом проверил с gps 2500об/мин =100км/ч и всё совподает! Рад как удав.
На старой прошивке и на старой схеме с оптопарой накатал уже 2500км, всё отлично! Штрафов с камер нет!☺ Сменил главную пару, посчитал коффициент для новой пары, и просто записал его, не откатывая по gps потом проверил с gps 2500об/мин =100км/ч и всё совподает! Рад как удав.
Последний раз редактировалось genzemarta 31 июл 2021, 00:08, всего редактировалось 1 раз.
Корректор электронного (стрелочного) спидометра на ARDUINO
Здравствуйте. Я повторил схему. Ардуино Нано. Вход на оптроне транзистор 3102, выход на одном резисторе и транзисторе кт315. Питание - регулируемое на 5В.
Есть проблемы. Их две.
1. Количество герц (сигнал) учитывается приборкой в 2 раза больше. Скорость указана в скетче, скажем 50, на спидометре 100.
2. Стрелка дергается. От "туда-сюда" до "ложится". Все это на столе, конечно.
Видео этого дела:
https://youtu.be/_R6ii7nAo7w
Что-то посоветуете в этой ситуации, плиз?
Есть проблемы. Их две.
1. Количество герц (сигнал) учитывается приборкой в 2 раза больше. Скорость указана в скетче, скажем 50, на спидометре 100.
2. Стрелка дергается. От "туда-сюда" до "ложится". Все это на столе, конечно.
Видео этого дела:
https://youtu.be/_R6ii7nAo7w
Что-то посоветуете в этой ситуации, плиз?
- Артур
- Друг клуба
- Сообщения: 1622
- Зарегистрирован: 12 ноя 2009, 22:38
- Бус: T3 2.8 VR6
- Откуда: Ессентуки
Корректор электронного (стрелочного) спидометра на ARDUINO
По первой проблеме: в мониторе порта отображается скорость которую ардуино приняла от датчика скорости. Это условное значение, ни с прибором спидометра, ни с реальной скоростью никак не связано. Вычисляется по формуле СКОРОСТЬ=600000/ВХОДЯЩИЕ ИМПУЛЬСЫ.
Т.е. так и должно быть.
По второй проблеме. Тут есть варианты. Давай через ватсап или вконтакте. Номер мой в подписи к сообщению написан.
В скетче в разделе кода СЧИТАЕМ СПИДОМЕТР, найди строку:
И ЗАМЕНИ НА
Отцепи потенциометр. (можно и не отцеплять, после изменения кода он просто не учитывается)
залей скетч в ардуино.
У тебя должна стрелка стать на какую либо отметку как вкопанная, без колебаний. Это изменение отключит вход и ардуинка вместо корректора станет простым генератором импульсов. тем самым можно проверить хорошо ли работает выход
Нужно выцепить, откуда появляются помехи (на входе, ошибка в скетче или на выходе).
Попробуй эту схему выхода Кроме того, я не пробовал КТ315 в качестве выходного. КС238 немного мощнее, немного другие параметры. Некоторые спидометры начинают так глючить из-за не правильного напряжения подтяжки (т.е. 5 вольт вместо 12), прибор от гольф 3 отказался работать, если включить в разрыв резистор больше чем 0,7кОм, в пограничном режиме прыгал, на 1кОм не работал вовсе.
Проверял работу датчика скорости светодиодной лентой. Минус сегмента светодиодной ленты на сигнал от датчика, Плюс на +12вольт.
Нужно проверить не прыгает ли у тебя сигнал от потенциометра. Что очень может быть.
Т.е. так и должно быть.
это ты уже будешь потенциометр крутить в дороге, по GPS искать нужный коэффициент поправки. Оно и не должно совпадать.
По второй проблеме. Тут есть варианты. Давай через ватсап или вконтакте. Номер мой в подписи к сообщению написан.
В скетче в разделе кода СЧИТАЕМ СПИДОМЕТР, найди строку:
Код: Выделить всё
InputSpeed=sp;
popravka=popravka=GetKalibr(InputSpeed);
Код: Выделить всё
InputSpeed=100;
popravka=1;
залей скетч в ардуино.
У тебя должна стрелка стать на какую либо отметку как вкопанная, без колебаний. Это изменение отключит вход и ардуинка вместо корректора станет простым генератором импульсов. тем самым можно проверить хорошо ли работает выход
Нужно выцепить, откуда появляются помехи (на входе, ошибка в скетче или на выходе).
Попробуй эту схему выхода Кроме того, я не пробовал КТ315 в качестве выходного. КС238 немного мощнее, немного другие параметры. Некоторые спидометры начинают так глючить из-за не правильного напряжения подтяжки (т.е. 5 вольт вместо 12), прибор от гольф 3 отказался работать, если включить в разрыв резистор больше чем 0,7кОм, в пограничном режиме прыгал, на 1кОм не работал вовсе.
Проверял работу датчика скорости светодиодной лентой. Минус сегмента светодиодной ленты на сигнал от датчика, Плюс на +12вольт.
Нужно проверить не прыгает ли у тебя сигнал от потенциометра. Что очень может быть.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
8(928)376-99-75
Корректор электронного (стрелочного) спидометра на ARDUINO
По проблеме прыганья стрелки разобрался. Это скакал потенциометр. ЕГо надо подключать как RC-фильтр, то есть сигнал через 10 ком, и мелкая (0.1) емкость с сигнала после резистора на GND, тогда дребезжание будет фильтроваться. Я его отключил совсем, и все стало гут.
Проблема не тех показаний разбилась на две проблемы:
1. Я экспериментирую на мильной приборке с переразметкой шкалы под километры. Пробег считается в милях, поэтому подсчет импульсов будет в 1.7 раза ниже (выше). А стоит рабочая приборка - километровая. Хз, короче. Придется возить ноут рядом с километровой приборкой и смотреть все это на экране с отработкой на месте.
2. ввиду брехания приборки на фиксированное количество километров, не получилось ввести коэффициент-множитель. Пришлось тупо применить поправку суммирующую. Вроде показывает, но опять-таки мили брешут, скорее всего.
Короче, всё подошло к тому, что надо отсекать по GPS на ходу поправки на спидометр и на действительную скорость и вычислять либо множитель (что представляется проблематичным), либо делать массив граничных значений.
Проблема не тех показаний разбилась на две проблемы:
1. Я экспериментирую на мильной приборке с переразметкой шкалы под километры. Пробег считается в милях, поэтому подсчет импульсов будет в 1.7 раза ниже (выше). А стоит рабочая приборка - километровая. Хз, короче. Придется возить ноут рядом с километровой приборкой и смотреть все это на экране с отработкой на месте.
2. ввиду брехания приборки на фиксированное количество километров, не получилось ввести коэффициент-множитель. Пришлось тупо применить поправку суммирующую. Вроде показывает, но опять-таки мили брешут, скорее всего.
Короче, всё подошло к тому, что надо отсекать по GPS на ходу поправки на спидометр и на действительную скорость и вычислять либо множитель (что представляется проблематичным), либо делать массив граничных значений.
Корректор электронного (стрелочного) спидометра на ARDUINO
А вот еще вопрос.
Вот этот момент:
//Генерируем импульсы для СПИДОМЕТРА
Skvajnost= Period/2 ; //такая скважность называется меандр
if (Status==0) {
if ( (micros()-timing2)>= Skvajnost) {
timing2 = micros();
digitalWrite(OUTSPEEDPIN, HIGH);
Status=1;
Serial.println("out High");
}
}
if (Status==1) {
if ( (micros()-timing2)>= (Period-Skvajnost) ){
timing2 = micros();
digitalWrite(OUTSPEEDPIN, LOW);
Status=0;
Serial.println("out Low");
}
}
Это должно писаться попеременно после каждого вычисления скорости? Или должно писаться сразу друг за другом, сперва High, потом Low?
У меня получается так:
Speed=70Скорость 1=70Скорость 2=78
out High
Speed=70Скорость 1=70Скорость 2=78
out Low
Вычисляется сперва одна скорость, пишется High, потом вычисляется вторая скорость, пишется Low. У меня идет смена скоростей через 1.5 секунды, опрос идет раз в 50 миллисек.
Собственно вот скетч без опроса спидометра, только поправка:
//СПИДОМЕТР
volatile unsigned long micros_sp = 0;
volatile byte sz = 0; //счетчик обнуления
volatile unsigned int sp = 0; //скорость
volatile boolean st = false; //триггер
//КОРРЕКЦИЯ СПИДОМЕТРА
volatile unsigned int InputSpeed = 0;
volatile unsigned int Speed = 0;
volatile unsigned int OutputSpeed = 0;
double popravka = 1;
//ВРЕМЯ РАБОТЫ ОСНОВНОЙ ПРОГРАММЫ (каждые 50 миллисекунд - указано в loop)
unsigned long timing,timer;
//ГЕНЕРАТОР ИМПУЛЬСОВ СПИДОМЕТРА
unsigned long timing2;
unsigned long Period;
unsigned long Skvajnost;
bool Status=0;
int rotator,rotaprev, promro;
String ss;
//ПИНЫ
int OUTSPEEDPIN=4; //ПИН ВЫХОДА - НА СПИДОМЕТР
int INPEEDPIN=7; //ПИН ВЫХОДА - имитатор датчика скорости
#define PIN_POT A7 //ПИН СИГНАЛА ОТ ПОТЕНЦИОМЕТРА ПОПРАВКИ
//********************************************************************
void speedometr(){ //измеряем частоту на входе спидометра по прерыванию
if(!st){micros_sp = micros();}
else {sp = (600000/(micros() - micros_sp));}
st = !st;
sz = 30;
}
//********************************************************************
void setup(){
Serial.begin(115200); //инициализация ком порта
attachInterrupt(1, speedometr, RISING); //прерывание спидометра по фронту импульса
pinMode(PIN_POT, INPUT);
pinMode(OUTSPEEDPIN, OUTPUT);
digitalWrite(OUTSPEEDPIN, LOW);
}
//********************************************************************
void loop()
{
if (millis() - timing > 50)
{
timing = millis();
if (millis() - timer > 1500) //циклическое изменение скорости
{
timer = millis();
Speed=Speed+10;
InputSpeed=Speed;
}
OutputSpeed=InputSpeed+8; //*popravka; //Вычисление правильной скорости
if (OutputSpeed>110 ) //зацикливание вывода скорости
{
Speed=0;
OutputSpeed=0;
InputSpeed=0;
}
else
{
if (OutputSpeed>1) //если скорость положительная, то делаются все вычисления и вывод в монитор
{
Period=600000/OutputSpeed;
ss="Speed="+String(Speed)+" Скорость 1="+String(InputSpeed)+" Скорость 2="+String(OutputSpeed);
Serial.println(ss);
//Генерируем импульсы для СПИДОМЕТРА с периодичностью 50 мсек
Skvajnost= Period/2 ; //такая скважность называется меандр
if (Status==0) {
if ( (micros()-timing2)>= Skvajnost) {
timing2 = micros();
digitalWrite(OUTSPEEDPIN, HIGH);
Status=1;
Serial.println("out High");
}
}
if (Status==1) {
if ( (micros()-timing2)>= (Period-Skvajnost) ){
timing2 = micros();
digitalWrite(OUTSPEEDPIN, LOW);
Status=0;
Serial.println("out Low");
}
}
}
else
{
Period=0; //Вычисление периода импульса
}
}
}
}
Вот этот момент:
//Генерируем импульсы для СПИДОМЕТРА
Skvajnost= Period/2 ; //такая скважность называется меандр
if (Status==0) {
if ( (micros()-timing2)>= Skvajnost) {
timing2 = micros();
digitalWrite(OUTSPEEDPIN, HIGH);
Status=1;
Serial.println("out High");
}
}
if (Status==1) {
if ( (micros()-timing2)>= (Period-Skvajnost) ){
timing2 = micros();
digitalWrite(OUTSPEEDPIN, LOW);
Status=0;
Serial.println("out Low");
}
}
Это должно писаться попеременно после каждого вычисления скорости? Или должно писаться сразу друг за другом, сперва High, потом Low?
У меня получается так:
Speed=70Скорость 1=70Скорость 2=78
out High
Speed=70Скорость 1=70Скорость 2=78
out Low
Вычисляется сперва одна скорость, пишется High, потом вычисляется вторая скорость, пишется Low. У меня идет смена скоростей через 1.5 секунды, опрос идет раз в 50 миллисек.
Собственно вот скетч без опроса спидометра, только поправка:
//СПИДОМЕТР
volatile unsigned long micros_sp = 0;
volatile byte sz = 0; //счетчик обнуления
volatile unsigned int sp = 0; //скорость
volatile boolean st = false; //триггер
//КОРРЕКЦИЯ СПИДОМЕТРА
volatile unsigned int InputSpeed = 0;
volatile unsigned int Speed = 0;
volatile unsigned int OutputSpeed = 0;
double popravka = 1;
//ВРЕМЯ РАБОТЫ ОСНОВНОЙ ПРОГРАММЫ (каждые 50 миллисекунд - указано в loop)
unsigned long timing,timer;
//ГЕНЕРАТОР ИМПУЛЬСОВ СПИДОМЕТРА
unsigned long timing2;
unsigned long Period;
unsigned long Skvajnost;
bool Status=0;
int rotator,rotaprev, promro;
String ss;
//ПИНЫ
int OUTSPEEDPIN=4; //ПИН ВЫХОДА - НА СПИДОМЕТР
int INPEEDPIN=7; //ПИН ВЫХОДА - имитатор датчика скорости
#define PIN_POT A7 //ПИН СИГНАЛА ОТ ПОТЕНЦИОМЕТРА ПОПРАВКИ
//********************************************************************
void speedometr(){ //измеряем частоту на входе спидометра по прерыванию
if(!st){micros_sp = micros();}
else {sp = (600000/(micros() - micros_sp));}
st = !st;
sz = 30;
}
//********************************************************************
void setup(){
Serial.begin(115200); //инициализация ком порта
attachInterrupt(1, speedometr, RISING); //прерывание спидометра по фронту импульса
pinMode(PIN_POT, INPUT);
pinMode(OUTSPEEDPIN, OUTPUT);
digitalWrite(OUTSPEEDPIN, LOW);
}
//********************************************************************
void loop()
{
if (millis() - timing > 50)
{
timing = millis();
if (millis() - timer > 1500) //циклическое изменение скорости
{
timer = millis();
Speed=Speed+10;
InputSpeed=Speed;
}
OutputSpeed=InputSpeed+8; //*popravka; //Вычисление правильной скорости
if (OutputSpeed>110 ) //зацикливание вывода скорости
{
Speed=0;
OutputSpeed=0;
InputSpeed=0;
}
else
{
if (OutputSpeed>1) //если скорость положительная, то делаются все вычисления и вывод в монитор
{
Period=600000/OutputSpeed;
ss="Speed="+String(Speed)+" Скорость 1="+String(InputSpeed)+" Скорость 2="+String(OutputSpeed);
Serial.println(ss);
//Генерируем импульсы для СПИДОМЕТРА с периодичностью 50 мсек
Skvajnost= Period/2 ; //такая скважность называется меандр
if (Status==0) {
if ( (micros()-timing2)>= Skvajnost) {
timing2 = micros();
digitalWrite(OUTSPEEDPIN, HIGH);
Status=1;
Serial.println("out High");
}
}
if (Status==1) {
if ( (micros()-timing2)>= (Period-Skvajnost) ){
timing2 = micros();
digitalWrite(OUTSPEEDPIN, LOW);
Status=0;
Serial.println("out Low");
}
}
}
else
{
Period=0; //Вычисление периода импульса
}
}
}
}
- Артур
- Друг клуба
- Сообщения: 1622
- Зарегистрирован: 12 ноя 2009, 22:38
- Бус: T3 2.8 VR6
- Откуда: Ессентуки
Корректор электронного (стрелочного) спидометра на ARDUINO
Ну позвони мне, или напиши.
Блин, ну зачем ты тронул код генерации импульсов, это вообще не так работает. Я не пойму зачем ты написал вывод в порт смену hight и low. Что ты хочешь этим посмотреть? Этот код генерирует шим с 50% скважности от периода. Период вычисляется по формуле 600000/входящую скорость. Его вообще не трогай. И убери вывод в порт. Hight low формирует импульс. Вычисляется период, сколько времени длится импульс, допустим 2 милисекунды. Значит 1 миллисекунду надо подавать +12 вольт ( hight) и 1 миллисекунду НОЛЬ (low).
Позвони, обьясню.
Отправлено спустя 13 минут 29 секунд:
Зачем ты сделал сдвиг +8. ?
Отправлено спустя 2 минуты 16 секунд:
Зачем это?
Блин, ну зачем ты тронул код генерации импульсов, это вообще не так работает. Я не пойму зачем ты написал вывод в порт смену hight и low. Что ты хочешь этим посмотреть? Этот код генерирует шим с 50% скважности от периода. Период вычисляется по формуле 600000/входящую скорость. Его вообще не трогай. И убери вывод в порт. Hight low формирует импульс. Вычисляется период, сколько времени длится импульс, допустим 2 милисекунды. Значит 1 миллисекунду надо подавать +12 вольт ( hight) и 1 миллисекунду НОЛЬ (low).
Позвони, обьясню.
Отправлено спустя 13 минут 29 секунд:
Зачем ты сделал сдвиг +8. ?
Отправлено спустя 2 минуты 16 секунд:
Код: Выделить всё
if (OutputSpeed>110 ) //зацикливание вывода скорости
{
Speed=0;
OutputSpeed=0;
InputSpeed=0;
}
else
8(928)376-99-75
Корректор электронного (стрелочного) спидометра на ARDUINO
Немного не понял трагизма ситуации.
Вывод в порт вывел просто посмотреть как исполняются команды записи импульса. Получилось, что длительность импульса устанавливается в цикле опроса спидометра в строке
if (millis() - timing > 50) //ведь это цикл опроса?
{
timing = millis();
Потому как пишется сперва 12 в, потом ввиду того, что Status изменился, уходит на новый цикл и только потом пишется low.
чтобы писать именно импульс, надо делать delay на длину импульса.
Зацикливание вывода скорости - чтобы менялась скорость на выводе. Доводилась до предельной и опять обнулялась. Чисто тестовый параметр, чтобы не перезаливать прогу с заменой скорости каждый раз.
Сдвиг 8 это и есть постоянная поправка, чтобы не умножать, а тупо прибавлять. Тестовый параметр.
-------------------
Это простые тестовые решения для теста работы скетча, ничего глобального они не делают. А вот исполнение полупериода реального импульса это странно. Или я чего-то не понимаю.
Вывод в порт вывел просто посмотреть как исполняются команды записи импульса. Получилось, что длительность импульса устанавливается в цикле опроса спидометра в строке
if (millis() - timing > 50) //ведь это цикл опроса?
{
timing = millis();
Потому как пишется сперва 12 в, потом ввиду того, что Status изменился, уходит на новый цикл и только потом пишется low.
чтобы писать именно импульс, надо делать delay на длину импульса.
Зацикливание вывода скорости - чтобы менялась скорость на выводе. Доводилась до предельной и опять обнулялась. Чисто тестовый параметр, чтобы не перезаливать прогу с заменой скорости каждый раз.
Сдвиг 8 это и есть постоянная поправка, чтобы не умножать, а тупо прибавлять. Тестовый параметр.
-------------------
Это простые тестовые решения для теста работы скетча, ничего глобального они не делают. А вот исполнение полупериода реального импульса это странно. Или я чего-то не понимаю.
Корректор электронного (стрелочного) спидометра на ARDUINO
digitalWrite(OUTSPEEDPIN, HIGH);
delayMicroseconds(Skvajnost);
digitalWrite(OUTSPEEDPIN, LOW);
delayMicroseconds(Skvajnost);
digitalWrite(OUTSPEEDPIN, LOW);