I've looked through your code, and I have a few suggestions.

First of all, consider loosing Arduino IDE in favor of raw C code in Atmel Studio. I know that INO is easier at first, but has many flaws that make it virtually useless for any real-time, professional use.
To make the project up to industry standards, C code should be used along with MISRA rule checking.
Arduino libraries are great for testing, as they are very universal, but as anything that is universal, they are slow and too complicated for this use. Especially USART functions, which are blocking, and port control functions which are slow.

I can help with porting the code to C and creating a project in Atmel Studio. This would have other benefits than smaller and more optimal code - you could use smaller ATtiny microprocessor.

The Interrupt service routines can be optimized as well, and that's where the timing is critical at high RPM.

Second, all the "populate" functions are unnecessary - all that work should be done by precompiler resulting with ready table in code, without unnecessary initialization routines. Also, such tables should be in program memory, to save RAM.

Third, I'm considered with the table lookup method. The switch-case lookup is far from optimal, but that's not the real issue. Right now, the integer conversion on voltage causes looked up dwell to be the same for 13V and 13.99V. Optimally there should be a interpolation function for lookup. Unfortunately AVRs don't have TBLU instructions, which are so great on Motorolas, but that's not a big problem.

Anyway, I don't want to criticise you in any way, quite the opposite in fact, as this project is growing very fast and looks very promising! If I'll find some time in the evening, I will upload some modifications to the code for you to consider.