Sparkfun Pro-Micro stuck on uploading
Uno's Mega's and so on have a separate MCU (u3) that contains the boot loader and is responsible for the USB connection and for driving the virtual serial port. Micros ( and also Leonardos and Esploras ) have built in USB support in the main MCU (u4). So if your program does something that breaks the USB part of the MCU the communication breaks also. This  happens for instance if you disable the interrupts. 

The only thing you use in your program that might cause a problem is the Serial connection. The blink example has no serial output. 

If you add a Serial.begin(115200) and a Serial.println("Hello") to the blink example, I guess the problem occurs also. 

The IDE establishes the programming connection by connection to the selected com port at 1200 Baud. The boot loader recognizes that, performs an auto reset and opens a second (programming port) from then the IDE has access to this port and uses it to communicate with the boot loader. On a UNO this is handled by the separate MCU and on the Micro the main CPU is responsible for that. 

Perhaps it helps if you add a time delay, before the Serial.begin(). Then you will have more time to start the programmer.

There is also a trick to enlarge the time you can start the programming after a reset to 8 seconds. https://forum.arduino.cc/index.php?topic=224416.msg1643210#msg1643210

And one additional hint: 

Your code is unnecessarily complicated. If you want, you can try the program below. I think it does the same as yours. I have no compiler and no micro at the moment so it's complete untested. 

You used a calibration variable. I guessed that it is for skip the first calibration values. If you need the values you can store them in a separate array.

My prog. has a lower memory footprint because I store the integer values from the analog input into an integer array. You used a double array. 

You also did a lot of unnecessary computations after you read an analog value. This can slow down the readings. Perhaps therefore you missed some values you expected to see.

//amount of calibration values we will average
const int valueCount = 400; 
const int calibCount =   0; 

void setup() 
{ 
  Serial.begin(115200); 
}

void loop() 
{
  // the readings from the analog input
  int vals[ valueCount ]; 

  for (int idx = 0; idx &lt; valueCount + calibCount; idx++) 
  {
    int rawValue = analogRead( A0 );
    if ( idx &gt;= calibCount )
    {
      vals[ idx - calibCount ] = rawValue;
    }
  }

  double total = (double) 0.0;

  for (int idx = 0; idx &lt; valueCount; idx++) 
  {
    total += (double) vals[ idx ];
  }

  Serial.println( total / valueCount );
}