Код: Выделить всё
unsigned long              timerate=100;
unsigned long             			bufftime;
volatile unsigned int     			th_buff = 0;
volatile unsigned int     			th = 0;
double                    				th_correction = 1;
int                      				th_pin=7;
volatile unsigned int    			sp_buff = 0;
volatile unsigned int     			sp = 0;
double                    				sp_correction = 1;
int                       				sp_pin=4;
unsigned long             			sp_bufftime;
unsigned long             			sp_pulse; 
bool                      				sp_pulse_on=false;
unsigned long             			th_bufftime;
unsigned long             			th_pulse; 
bool                      				th_pulse_on=false;
void setup() 
{
attachInterrupt(1, speedometr, RISING);                    
attachInterrupt(0, tahometr, RISING);
pinMode(th_pin, OUTPUT);
pinMode(sp_pin, OUTPUT);
}
void speedometr(){ sp_buff++; }
void tahometr(){ th_buff++; }
void loop(){ counter(); sp_generate(); th_generate(); }
void counter()
{
  if (millis() - bufftime > timerate)
  { 
    bufftime = millis();
    sp=sp_buff;
    sp_buff=0;
    th=th_buff;
    th_buff=0;
  }
}
void sp_generate()
{
  sp_pulse=timerate/sp*1000*sp_correction/2;
  if ((micros()-sp_bufftime)>= sp_pulse) 
  {
    sp_bufftime = micros();
    if(sp_pulse_on){ digitalWrite(sp_pin, HIGH);  sp_pulse_on=false;}
    else{ digitalWrite(sp_pin, LOW);  sp_pulse_on=true;}
  }
}
void th_generate()
{
  th_pulse=timerate/th*1000*th_correction/2;
  if ((micros()-th_bufftime)>= th_pulse) 
  {
    th_bufftime = micros();
    if(th_pulse_on){ digitalWrite(th_pin, HIGH);  th_pulse_on=false;}
    else{ digitalWrite(th_pin, LOW);  th_pulse_on=true;}
  }
}
Новый экспериментальный код корректора спидометра/тахометра. Схема включения прежняя. 
Код не испытан, но должен быть полностью рабочим.  
Значительно упростил всю логику работы, выбросив весь мусор в виде кучи лишних переменных и совершенно не нужных преобразований в километры в час. 
Я полностью переписал код убрав все заимствования с чужих иностранных исходников (первый скетч я писал на основе исходника, взятого с какого-то иностранного форума).
Новый принцип работы строится в разбиении программы на независимые модули.
Прерывания срабатывая повышают каждая свой счётчик на единицу.
1 модуль - счётчик. В главной функции loop запускается функция counter, которая снимает и обнуляет показания счётчиков каждые 100 милисекунд (за этот период отвечает переменная timerate).
2 и 3 модуль генераторы импульса тахометра и спидометра.
Скважность импульса=Ширина импульса /2
Ширина импульса = Время снятия показаний счётчиков (переменная timerate)  РАЗДЕЛИТЬ НА кол-во импульсов по счётчику УМНОЖИТЬ НА 1000 (конвертация в микросекунды) УМНОЖИТЬ НА поправку.
sp_pulse=timerate/sp*1000*sp_correction/2;
Вычислив длительность импульса передаю это значение  которая сначала включит импульс digitalWrite(sp_pin, HIGH); на эту длительность, а затем выключит digitalWrite(sp_pin, LOW);
У вас нет необходимых прав для просмотра вложений в этом сообщении.