I have a Boron LTE powered by a 5V, 5W solar panel connected to VUSB. I want to use my panel at its maximum power point to get the best charging efficiency.
One idea I had was to dynamically adjust the battery charge rate using SystemPowerConfiguration::batteryChargeCurrent() so that the panel operates as close to its maximum power point (Vmp) as possible.
The characteristic equation for a solar panel states that output current decreases as voltage increases, in a non linear fashion. Therefore it seems that the panel voltage can be controlled by measuring VUSB: if the voltage is above the Vmp then increase the charging current; if it’s below Vmp then decrease the charging current.
Is doing MPPT in firmware a good approach, or can this be done in hardware with the PMIC?
I’ve just discovered this information from page 15 of the datasheet of the BQ24195L (PMIC): “When input source is over-loaded, either the current exceeds the input current limit (REG00[2:0]) or the voltage falls below the input voltage limit (REG00[6:3]). The device then reduces the charge current until the input current falls below the input current limit and the input voltage rises above the input voltage limit.”
This seems to mean that if I just set SystemPowerConfiguration::powerSourceMinVoltage to the maximum power point of my panel, then the PMIC will automatically scale the charging current and give me hardware MPPT without having to write any firmware code at all!
But if so, then does that mean that the documentation for powerSourceMinVoltage is wrong? It says that powerSourceMinVoltage is the “minimum voltage required for VIN to be used”, which led me to believe that the power simply switches off below that voltage.
The other thing that’s unclear to me is that if the PMIC automatically scales the charging current when the voltage is below the powerSourceMinVoltage threshold, then what effect does SystemPowerConfiguration::batteryChargeCurrent() have in this situation, if any?
After doing a bit of digging into the OS 2.0.1 PMIC source code I found that SystemPowerConfiguration::batteryChargeCurrent() ultimately refers to register REG02 on the Boron PMIC.
According to the PMIC datasheet (section 220.127.116.11), REG02 sets the charge rate when the battery is above 3V (i.e normal charging), with the following caveat:
If the charger device is in DPM regulation or thermal regulation during charging, the actual charging current will be less than the programmed value
So it appears that SystemPowerConfiguration::batteryChargeCurrent()actually sets the maximum charge current. That means that if the supply voltage is below powerSourceMinVoltage(), the charge current will be automatically scaled down regardless of what batteryChargeCurrent() has been set.
The key takeaway here is that simply setting SystemPowerConfiguration::powerSourceMinVoltage() to the maximum power point of my panel (with batteryChargeCurrent() set to the maximum allowable charge current that my battery can handle) will result in automatic maximum power point tracking!
I think that the docs are really lacking here and they should be updated to reflect how the PMIC actually uses these settings.