I saw Hacking Qualcomm Quick Charge 3.0 - #9 by shaladrer and thought it might work well for a couple small motor projects.
Here's my rats-nest wiring and schematic:
It's basically this:
...with an extra 47K:10K voltage divider to bring the possible 20V Vbus ouput down to Nano ADC levels.
My code:
// QuickCharge 3.0 demo
// Use the library from https://github.com/vdeconinck/QC3Control/blob/master/src/QC3Control.cpp
// to control a Quick Charge power controller
// Copied the QC3Control.h and QC3Control.cpp to this Wokwi
//
// Should control QuickCharge/FastCharge power block
// https://en.wikipedia.org/wiki/Quick_Charge
// See https://forum.arduino.cc/t/hacking-qualcomm-quick-charge-3-0/906880/11
// for a prototype
// The resistors aren't electronically simulated in Wokwi, but per the library's
// diagram, they form voltage dividers to control the D+ and D- voltages on
// a QC2/QC3 charger's data lines.
#include "QC3Control.h" // quotes for local files in Wokwi
//Pin 4 for Data+ 470R to VCC+10K+1K5+GND
//Pin 5 for Data- 470R to VCC+10K+1K5+GND
//See How to connect in the documentation for more details.
QC3Control quickCharge(4, 5);
float Vcc = 5;
float Vbus = 0;
void printMVolts() {
Vcc = readVcc() / 1000.0;
Serial.print(quickCharge.getMilliVoltage());
Serial.print("mV, D-: ");
Serial.print((analogRead(A0) + 0.5) * Vcc / 1023);
Serial.print("V, D+: ");
Serial.print((analogRead(A1) + 0.5) * Vcc / 1023);
Serial.print("V, VBus: ");
Serial.print(Vbus = (analogRead(A2) + 0.5) / 1023.0 * Vcc * (46.29 + 9.89) / 9.89 ); //
Serial.print("V, Vcc=");
Serial.print(Vcc); //
Serial.println("V ");
}
long readVcc() {
long result;
byte ADMUXsave = ADMUX;
// Read 1.1V reference against AVcc
ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
delay(2); // Wait for Vref to settle
ADCSRA |= _BV(ADSC); // Convert
while (bit_is_set(ADCSRA, ADSC));
result = ADCL;
result |= ADCH << 8;
ADMUX = ADMUXsave;
result = 1126400L / result; // Back-calculate AVcc in mV
//Serial.println(result);
return result;
}
void setup() {
Vcc = readVcc() / 1000.0;
quickCharge.begin();
Serial.begin(115200);
//set voltage to 12V
quickCharge.set5V();
//delay(5000);
//quickCharge.set12V();
printMVolts();
delay(5000);
}
void demoModes(void) {
const int interval = 1000;
static unsigned long last = 0;
static int mode = 0;
static int ii = 0;
unsigned long now = millis();
if (now - last > interval) {
if (now - last > 4 * interval) {
last = now ;
}
else {
last += interval;
}
Serial.print("Mode ");
Serial.print(mode);
Serial.print(": ");
printMVolts();
switch (mode) {
case 0:
quickCharge.set5V();
mode++;
break;
case 1:
quickCharge.set9V();
mode++;
break;
case 2:
quickCharge.set12V();
mode++;
break;
case 3:
quickCharge.setMilliVoltage(3200);
mode++;
break;
case 4:
quickCharge.setMilliVoltage(12000);
mode++;
break;
case 5: // decrementing 0.2v/step
if (ii < 50) {
ii++;
quickCharge.decrementVoltage();
}
else
{
mode++;
//ii = 60; //override
}
break;
case 6:
if (ii > 0) {
ii--;
quickCharge.incrementVoltage();
}
else
{
mode++;
}
break;
case 7:
quickCharge.set5V();
mode = 0;
break;
default:
mode = 0;
break;
}
}
}
// loopCounter from https://forum.arduino.cc/t/while-loop-as-a-condition-for-limit-switches/963899/11
void LoopCounter() // tells the average response speed of void loop()
{ // inside a function, static variables keep their value from run to run
const unsigned long microsInOneSecond = 1000000UL;
static unsigned long count, countStartMicros; // only this function sees these
count++; // adds 1 to count after any use in an expression, here it just adds 1.
if ( micros() - countStartMicros >= microsInOneSecond ) // 1 second
{
countStartMicros += microsInOneSecond; // for a regular second
Serial.println( count ); // 32-bit binary into decimal text = many micros
count = 0; // don't forget to reset the counter
}
}
void loop() {
//And you can change it on the fly
demoModes();
//LoopCounter();
}
Simulated on Wokwi: QuickChargeControl.ino - Wokwi Arduino and ESP32 Simulator
And the output from my Nano:
5000mV, D-: 0.62V, D+: 0.16V, VBus: 11.97V, Vcc=4.75V
Mode 0: 5000mV, D-: 0.62V, D+: 0.16V, VBus: 5.24V, Vcc=4.75V
Mode 1: 5000mV, D-: 0.62V, D+: 0.16V, VBus: 5.24V, Vcc=4.75V
Mode 2: 9000mV, D-: 3.60V, D+: 0.56V, VBus: 9.42V, Vcc=4.73V
Mode 3: 12000mV, D-: 0.62V, D+: 0.58V, VBus: 12.60V, Vcc=4.75V
Mode 4: 3600mV, D-: 0.62V, D+: 3.56V, VBus: 3.89V, Vcc=4.75V
Mode 5: 12000mV, D-: 0.61V, D+: 3.54V, VBus: 12.55V, Vcc=4.73V
Mode 5: 11800mV, D-: 0.61V, D+: 3.54V, VBus: 12.31V, Vcc=4.73V
Mode 5: 11600mV, D-: 0.61V, D+: 3.55V, VBus: 12.10V, Vcc=4.73V
Mode 5: 11400mV, D-: 0.61V, D+: 3.54V, VBus: 11.92V, Vcc=4.73V
Mode 5: 11200mV, D-: 0.61V, D+: 3.54V, VBus: 11.73V, Vcc=4.73V
Mode 5: 11000mV, D-: 0.62V, D+: 3.56V, VBus: 11.57V, Vcc=4.75V
Mode 5: 10800mV, D-: 0.61V, D+: 3.55V, VBus: 11.31V, Vcc=4.73V
Mode 5: 10600mV, D-: 0.61V, D+: 3.55V, VBus: 11.10V, Vcc=4.73V
Mode 5: 10400mV, D-: 0.61V, D+: 3.54V, VBus: 10.89V, Vcc=4.73V
Mode 5: 10200mV, D-: 0.61V, D+: 3.54V, VBus: 10.68V, Vcc=4.73V
Mode 5: 10000mV, D-: 0.62V, D+: 3.54V, VBus: 10.50V, Vcc=4.73V
Mode 5: 9800mV, D-: 0.61V, D+: 3.55V, VBus: 10.23V, Vcc=4.73V
Mode 5: 9600mV, D-: 0.61V, D+: 3.54V, VBus: 10.02V, Vcc=4.73V
Mode 5: 9400mV, D-: 0.61V, D+: 3.54V, VBus: 9.84V, Vcc=4.73V
Mode 5: 9200mV, D-: 0.61V, D+: 3.54V, VBus: 9.63V, Vcc=4.73V
Mode 5: 9000mV, D-: 0.61V, D+: 3.55V, VBus: 9.39V, Vcc=4.73V
Mode 5: 8800mV, D-: 0.61V, D+: 3.55V, VBus: 9.21V, Vcc=4.73V
Mode 5: 8600mV, D-: 0.61V, D+: 3.54V, VBus: 9.00V, Vcc=4.73V
Mode 5: 8400mV, D-: 0.61V, D+: 3.55V, VBus: 8.79V, Vcc=4.73V
Mode 5: 8200mV, D-: 0.61V, D+: 3.54V, VBus: 8.58V, Vcc=4.73V
Mode 5: 8000mV, D-: 0.61V, D+: 3.54V, VBus: 8.37V, Vcc=4.73V
Mode 5: 7800mV, D-: 0.61V, D+: 3.54V, VBus: 8.16V, Vcc=4.73V
Mode 5: 7600mV, D-: 0.61V, D+: 3.54V, VBus: 7.95V, Vcc=4.73V
Mode 5: 7400mV, D-: 0.61V, D+: 3.54V, VBus: 7.71V, Vcc=4.73V
Mode 5: 7200mV, D-: 0.61V, D+: 3.55V, VBus: 7.55V, Vcc=4.73V
Mode 5: 7000mV, D-: 0.61V, D+: 3.55V, VBus: 7.32V, Vcc=4.73V
Mode 5: 6800mV, D-: 0.61V, D+: 3.55V, VBus: 7.11V, Vcc=4.73V
Mode 5: 6600mV, D-: 0.61V, D+: 3.54V, VBus: 6.90V, Vcc=4.73V
Mode 5: 6400mV, D-: 0.62V, D+: 3.56V, VBus: 6.72V, Vcc=4.75V
Mode 5: 6200mV, D-: 0.62V, D+: 3.56V, VBus: 6.50V, Vcc=4.75V
Mode 5: 6000mV, D-: 0.61V, D+: 3.55V, VBus: 6.27V, Vcc=4.73V
Mode 5: 5800mV, D-: 0.62V, D+: 3.56V, VBus: 6.08V, Vcc=4.75V
Mode 5: 5600mV, D-: 0.62V, D+: 3.56V, VBus: 5.87V, Vcc=4.75V
Mode 5: 5400mV, D-: 0.61V, D+: 3.54V, VBus: 5.66V, Vcc=4.73V
Mode 5: 5200mV, D-: 0.61V, D+: 3.54V, VBus: 5.45V, Vcc=4.73V
Mode 5: 5000mV, D-: 0.61V, D+: 3.55V, VBus: 5.22V, Vcc=4.73V
Mode 5: 4800mV, D-: 0.61V, D+: 3.55V, VBus: 5.01V, Vcc=4.73V
Mode 5: 4600mV, D-: 0.61V, D+: 3.54V, VBus: 4.80V, Vcc=4.73V
Mode 5: 4400mV, D-: 0.61V, D+: 3.54V, VBus: 4.56V, Vcc=4.73V
Mode 5: 4200mV, D-: 0.62V, D+: 3.56V, VBus: 4.39V, Vcc=4.75V
Mode 5: 4000mV, D-: 0.61V, D+: 3.54V, VBus: 4.16V, Vcc=4.73V
Mode 5: 3800mV, D-: 0.61V, D+: 3.54V, VBus: 3.95V, Vcc=4.73V
Mode 5: 3600mV, D-: 0.61V, D+: 3.54V, VBus: 3.88V, Vcc=4.73V
Mode 5: 3400mV, D-: 0.61V, D+: 3.55V, VBus: 3.90V, Vcc=4.73V
Mode 5: 3200mV, D-: 0.62V, D+: 3.56V, VBus: 3.89V, Vcc=4.75V
Mode 5: 3000mV, D-: 0.61V, D+: 3.55V, VBus: 3.90V, Vcc=4.73V
Mode 5: 2800mV, D-: 0.61V, D+: 3.54V, VBus: 3.88V, Vcc=4.73V
Mode 5: 2600mV, D-: 0.61V, D+: 3.54V, VBus: 3.90V, Vcc=4.73V
Mode 5: 2400mV, D-: 0.62V, D+: 3.56V, VBus: 3.89V, Vcc=4.75V
Mode 5: 2200mV, D-: 0.62V, D+: 3.56V, VBus: 3.89V, Vcc=4.75V
Mode 5: 2000mV, D-: 0.61V, D+: 3.55V, VBus: 3.88V, Vcc=4.73V
Mode 6: 2000mV, D-: 0.61V, D+: 3.55V, VBus: 3.90V, Vcc=4.73V
Mode 6: 2200mV, D-: 0.61V, D+: 3.54V, VBus: 3.98V, Vcc=4.73V
Mode 6: 2400mV, D-: 0.62V, D+: 3.56V, VBus: 4.16V, Vcc=4.75V
Mode 6: 2600mV, D-: 0.61V, D+: 3.55V, VBus: 4.37V, Vcc=4.73V
Mode 6: 2800mV, D-: 0.61V, D+: 3.54V, VBus: 4.59V, Vcc=4.73V
Mode 6: 3000mV, D-: 0.61V, D+: 3.54V, VBus: 4.80V, Vcc=4.73V
Mode 6: 3200mV, D-: 0.62V, D+: 3.56V, VBus: 5.03V, Vcc=4.75V
Mode 6: 3400mV, D-: 0.61V, D+: 3.54V, VBus: 5.24V, Vcc=4.73V
Mode 6: 3600mV, D-: 0.61V, D+: 3.54V, VBus: 5.45V, Vcc=4.73V
Mode 6: 3800mV, D-: 0.62V, D+: 3.56V, VBus: 5.69V, Vcc=4.75V
Mode 6: 4000mV, D-: 0.61V, D+: 3.55V, VBus: 5.85V, Vcc=4.73V
Mode 6: 4200mV, D-: 0.62V, D+: 3.56V, VBus: 6.08V, Vcc=4.75V
Mode 6: 4400mV, D-: 0.61V, D+: 3.54V, VBus: 6.27V, Vcc=4.73V
Mode 6: 4600mV, D-: 0.62V, D+: 3.56V, VBus: 6.48V, Vcc=4.75V
Mode 6: 4800mV, D-: 0.62V, D+: 3.56V, VBus: 6.69V, Vcc=4.75V
Mode 6: 5000mV, D-: 0.61V, D+: 3.55V, VBus: 6.90V, Vcc=4.73V
Mode 6: 5200mV, D-: 0.62V, D+: 3.56V, VBus: 7.16V, Vcc=4.75V
Mode 6: 5400mV, D-: 0.61V, D+: 3.54V, VBus: 7.32V, Vcc=4.73V
Mode 6: 5600mV, D-: 0.62V, D+: 3.56V, VBus: 7.56V, Vcc=4.75V
Mode 6: 5800mV, D-: 0.62V, D+: 3.56V, VBus: 7.74V, Vcc=4.75V
Mode 6: 6000mV, D-: 0.61V, D+: 3.55V, VBus: 7.92V, Vcc=4.73V
Mode 6: 6200mV, D-: 0.62V, D+: 3.56V, VBus: 8.17V, Vcc=4.75V
Mode 6: 6400mV, D-: 0.61V, D+: 3.55V, VBus: 8.37V, Vcc=4.73V
Mode 6: 6600mV, D-: 0.61V, D+: 3.55V, VBus: 8.58V, Vcc=4.73V
Mode 6: 6800mV, D-: 0.62V, D+: 3.56V, VBus: 8.83V, Vcc=4.75V
Mode 6: 7000mV, D-: 0.62V, D+: 3.56V, VBus: 9.01V, Vcc=4.75V
Mode 6: 7200mV, D-: 0.62V, D+: 3.56V, VBus: 9.22V, Vcc=4.75V
Mode 6: 7400mV, D-: 0.62V, D+: 3.56V, VBus: 9.43V, Vcc=4.75V
Mode 6: 7600mV, D-: 0.62V, D+: 3.56V, VBus: 9.70V, Vcc=4.75V
Mode 6: 7800mV, D-: 0.61V, D+: 3.55V, VBus: 9.81V, Vcc=4.73V
Mode 6: 8000mV, D-: 0.61V, D+: 3.55V, VBus: 10.05V, Vcc=4.73V
Mode 6: 8200mV, D-: 0.61V, D+: 3.55V, VBus: 10.26V, Vcc=4.73V
Mode 6: 8400mV, D-: 0.61V, D+: 3.55V, VBus: 10.47V, Vcc=4.73V
Mode 6: 8600mV, D-: 0.61V, D+: 3.54V, VBus: 10.71V, Vcc=4.73V
Mode 6: 8800mV, D-: 0.62V, D+: 3.56V, VBus: 10.94V, Vcc=4.75V
Mode 6: 9000mV, D-: 0.61V, D+: 3.55V, VBus: 11.08V, Vcc=4.73V
Mode 6: 9200mV, D-: 0.60V, D+: 3.54V, VBus: 11.31V, Vcc=4.73V
Mode 6: 9400mV, D-: 0.62V, D+: 3.56V, VBus: 11.54V, Vcc=4.75V
Mode 6: 9600mV, D-: 0.61V, D+: 3.55V, VBus: 11.73V, Vcc=4.73V
Mode 6: 9800mV, D-: 0.61V, D+: 3.54V, VBus: 11.92V, Vcc=4.73V
Mode 6: 10000mV, D-: 0.62V, D+: 3.56V, VBus: 12.18V, Vcc=4.75V
Mode 6: 10200mV, D-: 0.62V, D+: 3.54V, VBus: 12.36V, Vcc=4.73V
Mode 6: 10400mV, D-: 0.61V, D+: 3.54V, VBus: 12.55V, Vcc=4.73V
Mode 6: 10600mV, D-: 0.62V, D+: 3.54V, VBus: 12.55V, Vcc=4.73V
Mode 6: 10800mV, D-: 0.61V, D+: 3.54V, VBus: 12.55V, Vcc=4.73V
Mode 6: 11000mV, D-: 0.62V, D+: 3.54V, VBus: 12.55V, Vcc=4.73V
Mode 6: 11200mV, D-: 0.62V, D+: 3.56V, VBus: 12.60V, Vcc=4.75V
Mode 6: 11400mV, D-: 0.61V, D+: 3.55V, VBus: 12.57V, Vcc=4.73V
Mode 6: 11600mV, D-: 0.61V, D+: 3.54V, VBus: 12.55V, Vcc=4.73V
Mode 6: 11800mV, D-: 0.61V, D+: 3.54V, VBus: 12.55V, Vcc=4.73V
Mode 6: 12000mV, D-: 0.61V, D+: 3.54V, VBus: 12.55V, Vcc=4.73V
Mode 7: 12000mV, D-: 0.62V, D+: 3.54V, VBus: 12.57V, Vcc=4.73V
Mode 0: 5000mV, D-: 0.61V, D+: 0.16V, VBus: 5.24V, Vcc=4.75V
Mode 1: 5000mV, D-: 0.62V, D+: 0.16V, VBus: 5.24V, Vcc=4.75V
Mode 2: 9000mV, D-: 3.61V, D+: 0.58V, VBus: 9.42V, Vcc=4.73V
Mode 3: 12000mV, D-: 0.62V, D+: 0.58V, VBus: 12.57V, Vcc=4.75V
Mode 4: 3600mV, D-: 0.62V, D+: 3.56V, VBus: 3.89V, Vcc=4.75V
With a Motorola TurboPower25 brick, it only did the 5,9,12V settings and the others modes didn't work. But with a new $5 18W "Quick Charger 3.0 Wall Charger" I got a 3.9-12.5V range, controllable and readable by the Nano.
Anybody have good/bad experiences using a QuickCharge as an adjustable voltage source?