Скажи, ты раньше на чем-то програмил? Уж слишком быстро разбираешься!
Теперь ответы :-)
У самого микроконтроллера AtMega168 три таймера. Но насколько я понял, как минимум один, и может два из используется встроенными структурами, которые обеспечивают работу систем Arduino. Итого - старайся выкрутиться одним таймером. Кстати, при грамотной его обработке его хватит в 90% не очень сложных случаев.
К примеру, есть функции, которые надо вызывать каждые 50мс, а есть такие, которые надо вызывать каждую секунду. Ставишь таймер на 50мс и каждый 20 вызов таймера вызываешь ежесекундную функцию.
По поводу переменной EngineCurrentVentPWM: Если ты объявил переменную глобальной (вне каких-либо функций) она существует все время выполнения программы. Соответственно, она хранит значение все время, пока программа выполняется.
Если ты объявил переменную внутри функции, то эта переменная существует только внутри функции (либо еще меньше). Как код только из функции вышел, переменная исчезла и не занимает память. Когда произойдет следующий вход в функцию, переменная будет заново создана и будет иметь случайное значение, если ты ее не проинициализируешь.
Соответственно, твоя функция loop вызывается постоянно. Но при каждом вызове все объявленные внутри переменные создаются заново! И их надо инициализировать, прежде чем из них что-то считать. Кстати, компилятор тебе наверняка выдавал предупреждения на счет чтения неинициализированных переменных.
Когда ты перенес переменную EngineCurrentVentPWM вне loop, ты создал ее глобальной - она существует все время выполнения программы (т.е. вечность, поскольку loop вызывается вечно).