One reason you see less than 100mA when you connect the display up to a 5V supply through an 8 ohm resistor is because the forward voltage of the back light LED is higher than the 4.2V level. Another reason could be due to the meter that you put in series to measure the current. Meters generally measure current by looking at the voltage drop across a small value resistor and you would have effectively placed that resistance in series with the 8 ohms and thus reducing the current some amount.
For the buffer circuit try connecting it up like this:
This will allow the MCU to switch the NPN transistor on and off successfully. As you had it drawn before the LED back light load was being operated as an emitter follower. In such configuration the load was seeing a voltage that was at least a Vbe drop lower than the voltage the MCU pin was placing on the base circuit of the transistor.
With it redrawn as I've shown it the MCU can saturate the transistor and allow the collector circuit to sink the full current from the supply and through the LED and 8 ohm resistor.
If the MCU is able to place a 5V signal on its output pin then the base current of the transistor with 1K resistor will be:
Ibase = (5 - Vbe) / 1K = (5 - 0.7) / 1K = 4.3mA
The transistor current gain is Hfe. With a desired up to 100 mA of current in the collector the transistor will need an Hfe of at least this much:
Hfe = 100mA / 4.3mA ~= 23.
The transistor part numbers I have shown should have Hfe values that are higher than 23 and so the 4.3mA base current should allow the transistor to fully saturate.
One note is that this circuit is going to turn on the backlight when the MCU pin is placed into the high state. Thus logical '1' = High = On. Nice.
The BuckPuck is a step-down ("buck") converter. You must provide it with a voltage at least 2.5V above the forward voltage of the LEDs. The LED has a typical Vf of 3.2V, so you want your input voltage to be at least 5.7V. Call it 6V or higher. The BuckPuck will take an input voltage all the way up to 32VDC, although the efficiency drops a bit.
It is regulated to provide constant current. In other words, the BuckPuck will vary its output voltage so that the current remains the same. The buckpuck doesn't care if you have one or three LEDs in series, it will simply create whatever voltage necessary to push 700mA through the circuit. Of course, this output voltage cannot be greater than 2.5V less than the input voltage.
Because of this, you don't need any limiting resistors in the LED paths. This also means that you want to select your FETs (or transistors) to have small resistances when switched on ( \$R_{ds-on}\$ in the datasheets)
However, this presents a problem in your multiple-path design. If you turn off one of the LEDs before turning on another, then there is nowhere for the current to go. The output voltage will shoot up to the maximum possible, as the BuckPuck tries to keep pushing 700mA.
A solution is to turn on one of the LEDs just before turning off another one. MOSFETs take time to turn on and turn off, so you may need to add a delay in your code to ensure that there is always a current path available.
As for as PWM dimming, basically you just switch the CTRL pin on and off fairly rapidly. The datasheet says that you need to keep the PWM frequency under 10kHz. I would keep it down to around 1kHz, or even slower. What you're doing is turning the LED on and off faster than the eye can detect. What you end up seeing is the average brightness.
However, you can only do this directly if you have 5V logic outputs. The RPi has 3.3V outputs. The datasheet gives the following examples, which won't work for you because you don't have 5V logic:
Read Page 4 of the datasheet very carefully. Also note that the microcontroller ground (the RPi ground) is tied to LED-.
Conveniently, the REF pin provides 5V for your use. You need to switch this 5V into the CTRL pin. One option is to use a small optoisolator (optocoupler), such as the Sharp PC713V0YSZXF.
If you don't know how to use an optoisolator, I would look for answers here :)
Good luck.
Best Answer
Here is an approach using a comparator and minimum additional components, that would serve the purpose.
The key active part is an open collector comparator such as the Linear Technologies LT1011. Substitute this with any open collector / open drain comparator that operates with a single supply ranging beyond 9 Volts.
simulate this circuit – Schematic created using CircuitLab
DC_Bias + V1_peak - V_diode
.DC_Bias - V_diode
value is just below the voltage of the voltage divider made up of R3 and R4. When the 75 mV peak input signal is added to it, the result will be just above comparator threshold