Pointer to Hardware Differences Documentation For Arduino Boards?
You may find this helpful: PTD0001 Arduino Comparison Rev 0 - PDF - 245 KB.

Screenshot of above: 

Credit: Payne Technologies Limited

That compares some models in a way you might find useful.




  I have found that the hardware PWM isn't always the same from one Arduino Board design to another


The PWM frequencies can be changed over quite a wide range. I have a page about timers which describes a lot of their features. 

According to the Arduino reference page about analogWrite:


  The frequency of the PWM signal on most pins is approximately 490 Hz. On the Uno and similar boards, pins 5 and 6 have a frequency of approximately 980 Hz. Pins 3 and 11 on the Leonardo also run at 980 Hz. 


By changing the hardware register you can change those frequencies. The frequency of 980 Hz is because of the compromise needed to get an approximate 1 ms interrupt for use by the millis() function:

16e6 / 64 / 256 = 976.5625 Hz


In other words the clock speed of 16 MHz is prescaled by 64 and then counted to 256, giving that frequency.

Note that this is almost 1 ms. The code behind millis() and micros() functions compensates for that so that you get a reasonably accurate result.

By changing the prescaler, and "count to" point you can get lots of other frequencies. However if you do that to Timer 0 on the Uno (and similar boards) then you will throw out the calculations for the millis() and micros() functions (you can compensate for that, of course).



This only partly answers your question, but hopefully will provide a nudge in a useful direction.