Jump to content
HWBOT Community Forums

Idea for volt mod tool


buildzoid

Recommended Posts

I had an idea for a device that I want to make because I'm sick of having to pick up piles and piles of pots to get voltage control on different GPUs.

 

I guess it's going to basically be a dumb EVC.

 

Basically it's going to be a pile of digital potentiometers with some inbuilt sensing and safeties to make hard modding easier.

 

Here's my goal for the features:

3 channels(VCC,VMEM,misc voltage rail) offering resistances from 2ohms(the lowest I've seen) up to 500kohm(the highest I've seen)

 

Each channel will also have an option to monitor voltage and set limits on how much overvoltage is possible(my biggest fear with hard mods is setting the pots to really low resistances by accident). With some clever coding this could be setup to also counter act voltage drop in situations like the E-power on a TITAN-X because you just tell the device to hold X voltage and when the voltage drops bellow that it will adjust the pots to push more voltage(this might not be fast enough to work properly but you could try to slow down the voltage drop with extra caps to the point where this thing does keep up)

 

Connector so that you only need to attach a connector to the GPU you plan to mod and whenever you want to use the device on another GPU you can just unplug it and solder a new connector to the new GPU.

 

 

 

I'm not yet sure what I'll use as the brains for this monstrosity since I've done exactly 0 stuff with any kinds of micro controllers so if anyone has suggestions that would be great. If you have any other suggestions for cool simple to implement functions I'd love to hear them.

Link to comment
Share on other sites

This is essentially what the ASUS Hotwire feature does, except for the "smart" part. What you need is a current DAC + microcontroller with ADC. The current DAC can source/sink current into the feedback loop creating essentially the same effect as when you mod with a VR, except that it's digitally controlled. The microcontroller would handle the adjustments and an integrated ADC for easily reading out the voltages.

 

I'd recommend getting started with an Arduino setup + something like this https://www.maximintegrated.com/en/products/analog/data-converters/digital-to-analog-converters/DS4402.html

Link to comment
Share on other sites

This is essentially what the ASUS Hotwire feature does, except for the "smart" part. What you need is a current DAC + microcontroller with ADC. The current DAC can source/sink current into the feedback loop creating essentially the same effect as when you mod with a VR, except that it's digitally controlled. The microcontroller would handle the adjustments and an integrated ADC for easily reading out the voltages.

 

I'd recommend getting started with an Arduino setup + something like this https://www.maximintegrated.com/en/products/analog/data-converters/digital-to-analog-converters/DS4402.html

 

From my understanding of that datasheet that DAC will not necessarily match the different current amounts that different FB loops work with right off the bat.

 

With my design I was imagining that I just hook it into the FB loop and then it starts lowering the resistance until the voltage sense line hits the voltage you ask it to reach. To do that it has several thousand different resistance settings. That DAC has only 31 settings.

I have doubts about being able to use that DAC on a GPU like the 260X on which I used a 25K ohm pot and then just hook it up to a Fury X which needs a 100-200ohm pot without any adjustments in between.

 

Other than that I guess I will go with the arduino micro for prototyping.

 

Here's a mockup of what I want it to look like:

xkANzgn.png

Edited by buildzoid
Link to comment
Share on other sites

One problem I just thought of is that some GPU's have a low power state that will drop the volts to something like 0.9v which with this method would see the volts being set much higher as soon as load is applied

 

But to give an example. If you tell it set 1.4v and the card has stock 1.2v and low power of 0.9v you would likely run 1.7v when first under load because it will start off at +500mv

Link to comment
Share on other sites

From my understanding of that datasheet that DAC will not necessarily match the different current amounts that different FB loops work with right off the bat.

 

With my design I was imagining that I just hook it into the FB loop and then it starts lowering the resistance until the voltage sense line hits the voltage you ask it to reach. To do that it has several thousand different resistance settings. That DAC has only 31 settings.

I have doubts about being able to use that DAC on a GPU like the 260X on which I used a 25K ohm pot and then just hook it up to a Fury X which needs a 100-200ohm pot without any adjustments in between.

 

Other than that I guess I will go with the arduino micro for prototyping.

 

Here's a mockup of what I want it to look like:

xkANzgn.png

 

There are DACs with finer grains + you can hook up several DACs to the same output. I'm a bit unclear about what kind of solution would you use to lower resistance?

Link to comment
Share on other sites

There are DACs with finer grains + you can hook up several DACs to the same output. I'm a bit unclear about what kind of solution would you use to lower resistance?

 

My plan was to hook up several digital potentiometers in series. I'd have a 250K going to a 200K to a 50K to a 20K to a 5K and finally a 1K(I might change these values some more since I think I have too much overlap between the different sizes). Each has 256 settings and I just start lowering resistance on them in order from largest to smallest until the Vcore is just bellow the target value(this would be taken care of by some equations). Doing it this way means that I always start with a 500K ohm resistance and it only drops bellow that when I want to change voltage.

 

I can get a 4 channel digital pot of each the sizes I listed for about 4 GBP so it's kinda expensive since I need 6 per tool with the current design. They all use I2C so I can control them using the arduino.

 

I will do some more research into the DACs since they might be cheaper than my method.

 

EDIT I just realized that I need Way fewer pots for my own design than I initially thought.

 

EDIT2: Maximum resistance will be 1Mohm and minimum will be ~11ohm.

Here's my attempt at a "schematic" of the 3 resistance channels:

BG3APC1.png

 

It should clarify how I intend to achieve the resistance control. Also this design is also pretty OK price wise because the 5K pots are under a pound on DigiKey and the other two pots are around 2 pounds each. All of them support I2C so that's how I will control them all. Now I just need to figure out the ADCs LEDs Displays and controls.

 

EDIT3: I've realized that there needs to be some way to define a maximum voltage limit for each channel manually. Should only need 1 extra button to do it and some better LED control to indicate that the voltage limit is being set on that channel.

 

EDIT 4: I've realized that I need some transistors to by pass the 1M ohm pots and 5K ohm pots when going into the very low resistances because the pots have a minimum resistance of about 70ohms.

Edited by buildzoid
Link to comment
Share on other sites

One problem I just thought of is that some GPU's have a low power state that will drop the volts to something like 0.9v which with this method would see the volts being set much higher as soon as load is applied

 

But to give an example. If you tell it set 1.4v and the card has stock 1.2v and low power of 0.9v you would likely run 1.7v when first under load because it will start off at +500mv

 

I have a plan to solve that. But it's a little hard to explain.

Link to comment
Share on other sites

Feedback loops usually controlled by voltage-level on the pin. And since in majority of the cases it's resistive divider, current DAC is the best way. You don't really care about resistance if its 10 ohm or 10kohm there, what you do with the CDAC is to sink/source current to offset resistor divider output, to get your feedback voltage biased accordingly.

 

But way better to do it digitally. Most of controllers already have digital control (but you will need access to internal documentation though, which is another topic). Messing with feedback without care often can screw up compensation.

 

Also this idea will not work to compensate voltage drops under load in case of E-Power/etc as this compensation would be too slow. There is much easier way to compensate for that, requiring only two extra wires, without any programming or anything like that.

Link to comment
Share on other sites

I came up with an idea to implement voltage tracking with up to 6 channels utilizing the analog pins on an arduino.

 

The idea is to monitor voltages via USB and convert the data into a visual form. I want to monitor the voltages in graphical form or clear text in realtime.

Heres an example of what I want to do: http://www.instructables.com/id/Make-a-Mini-Arduino-programmable-4-channel-DC-DVM/

 

The 6 analog pins only have a voltage range up to +5V. So if you wanted to measure a 12V line you need a divider like this:

FC8DO06HSRZOG79.LARGE.jpg

 

You could implement this into your device or even attach a thermocouple amplifier with analog output(https://www.adafruit.com/products/1778) instead of a voltage read point. All of this together would be pretty sweet.

Edited by Wiggles
Link to comment
Share on other sites

I had the same idea for a 5 channel (2 cards + aux) and started working on it a few months ago. Mine was going to be made with digital pots and "setter"+ adjuster knobs at first but then I worked out a better implementation with a single $5 Chinese micro arduino.

 

What type of connector are you going to use?

 

Here is a GX2 I just finished this week, sorta a step in the direction of my single mod controller but this one will be sold with the card so its basically permanent. I am testing connectors currently and this one seems to be my favorite.

 

The easy way out is to use millmax type sockets for each pot so you can easily swap them out and make a cheap universal mod control center.

 

IMG_20160330_121120.jpg~original

Edited by mllrkllr88
Link to comment
Share on other sites

I had the same idea for a 5 channel (2 cards + aux) and started working on it a few months ago. Mine was going to be made with digital pots and "setter"+ adjuster knobs at first but then I worked out a better implementation with a single $5 Chinese micro arduino.

 

What type of connector are you going to use?

 

Here is a GX2 I just finished this week, sorta a step in the direction of my single mod controller but this one will be sold with the card so its basically permanent. I am testing connectors currently and this one seems to be my favorite.

 

The easy way out is to use millmax type sockets for each pot so you can easily swap them out and make a cheap universal mod control center.

 

IMG_20160330_121120.jpg~original

 

The goal of this projects is no more pots. I hate the damn things. They're too small require a screw driver to adjust and you need several different sizes depending on the GPU.

 

Right now I have all the digital pots I need for a single controller. I'll try wire those up and if I don't like how it works I'll try figure out how the DAC thing is supposed to work.

 

I'm not sure about connectors yet they aren't too much of a priority until I know the tool works.

Link to comment
Share on other sites

  • 2 weeks later...
I had the same idea for a 5 channel (2 cards + aux) and started working on it a few months ago. Mine was going to be made with digital pots and "setter"+ adjuster knobs at first but then I worked out a better implementation with a single $5 Chinese micro arduino.

 

What type of connector are you going to use?

 

Here is a GX2 I just finished this week, sorta a step in the direction of my single mod controller but this one will be sold with the card so its basically permanent. I am testing connectors currently and this one seems to be my favorite.

 

The easy way out is to use millmax type sockets for each pot so you can easily swap them out and make a cheap universal mod control center.

 

IMG_20160330_121120.jpg~original

 

I picked up a veroboard today to give this one a try myself but I don't have lcd volt meters because my local electronics store has self powered ones for $25 so I'll get them from ebay

 

zJQP2iR.jpg

 

The goal of this projects is no more pots. I hate the damn things. They're too small require a screw driver to adjust and you need several different sizes depending on the GPU.

 

To make life easier with trimpots I hot glue some like dvi/vga screws or mb stand-offs to them and you can turn them by hand and I'll post up a picture of what I mean later

Link to comment
Share on other sites

I picked up a veroboard today to give this one a try myself but I don't have lcd volt meters because my local electronics store has self powered ones for $25 so I'll get them from ebay

 

zJQP2iR.jpg

 

 

 

To make life easier with trimpots I hot glue some like dvi/vga screws or mb stand-offs to them and you can turn them by hand and I'll post up a picture of what I mean later

 

I think I know what you might be getting at but I still think it would be more convenient to just punch in a voltage value and let some micro controller do all the adjustments for you.

Link to comment
Share on other sites

So far I have a 2 Channel device that will display Target/Read voltages but Im having trouble getting the data to read on one line.

 

I have the code fully written to support 1 Chip with a range of 100K/10K in 256 steps. Once I get this simple version working 100% Im confident I can add a channel select button and have a serial setup of MCP4XXXX pots to be made into a full range(1M to 500 ohm analog pot) version.

 

Any help would be great.

/* WIGGLES' Universal VMod tool V0.2
 This program is used to control up to 6 differenct voltage rails up to 5V 
 utilizing a MCP42XXX or MCP41XXX series digital potentiometer. Currently 
 uses USB Console to view set and read voltages. -Wiggles5289, Overclock.net

   ISSUES:
 1: NEED TO CONVERT CHxVRead and CHxVtgt from 100ths to  without interference
   from logic in voltageAdjust
 2: Result of Issue 1 is that the program goes at an arduious rate of 1 complete cycle of void loop()
   every 5 seconds. adjustVoltage() is the cause of this, it should stop if only voltage values are
   compared in 100ths instead of near infinate.

   To Do:
 1: Add code and support for 2.2 TFT Screen and 2.8 CAP Touch TFT Screen
 2: Add "Channel Select" function
 3: Add code and support for serial MCP4XXXX chips
 4: Add Temp Probe code and support
 5: Switch unnecessary Delay() to millis() to eliminate unnecessary pauses

 CHANGE LOG:
 Disabled printOut() as wrong or no values were being printed on console
 Added print function to readVoltage()

 This code used to control the digital potentiometer
 MCP4XXXX connected to  arduino Board
 CS >>> D10
 SCLK >> D13
 DI  >>> D11
 PA0 TO VCC
 PBO TO GND
 SHDN >> 9
 PW0 TO led with resistor 100ohm. JUST TO TEST.

 Thanks to all who helped, Ill be listing people here.
*/
const int buttonUpCH0Pin = 2;
const int buttonDownCH0Pin = 3;
const int buttonUpCH1Pin = 4;
const int buttonDownCH1Pin = 5;
const int sensor0Val = A0;
const int sensor1Val = A1;

int buttonUpCH0State = 0;
int buttonDownCH0State = 0;
int buttonUpCH1State = 0;
int buttonDownCH1State = 0;
int lastButtonUpCH0State = 0;
int lastButtonDownCH0State = 0;
int lastButtonUpCH1State = 0;
int lastButtonDownCH1State = 0;
int CH0VRead = 0;
int CH1VRead = 0;
float CH0Vtgt = 0; // May change to 1.0V for stabilization
float CH1Vtgt = 0; // May change to 1.0V for stabilizationÆ’

#include <SPI.h>
byte addressPot0 = 0b00010001;      //To define potentiometer use last two BITS 01= POT 0
byte addressPot1 = 0b00010010;      //To define potentiometer use last two BITS 10= POT 1
byte addressPot0and1 = 0b00010011;  //To define potentiometer use last two BITS 10= POT 0 and 1
byte addressPotNA = 0b00000000; //To define no write to potentiometer use BITS 5 and 6 or last two BITS= 00
byte CS= 10;    //Chip control goes to pin 10
byte SHDN = 9;  //Chip SHUTDOWN - PIN 9
byte RS = 8;    //Chip RESET - PIN 8

void setup()
{
 pinMode (CS, OUTPUT); //CS - When High, sets chip to read the data.
 pinMode (SHDN, OUTPUT); //CS - When High, sets chip to read the data.
 pinMode (RS, OUTPUT); //CS - When High, sets chip to read the data.
 pinMode(buttonUpCH0Pin, INPUT);
 pinMode(buttonDownCH0Pin, INPUT);
 pinMode(buttonUpCH1Pin, INPUT);
 pinMode(buttonDownCH1Pin, INPUT);
 CH0Vtgt+= 1.09;
 CH1Vtgt+= 1.09;

 Serial.begin(9600); 
 digitalWrite(SHDN, HIGH); //Power ON (HIGH)
 digitalWrite(RS, HIGH); //Power NO RESET (LOW)
 SPI.begin();

 delay(0); // Increase to 3000 to allow for breakout boards to initialize or external device boot
}

void loop(){
 setVoltageCH0(); // Sets voltage via 2 buttons
 setVoltageCH1(); // Sest voltage via 2 buttons but will be changed to 1 set and a single "Channel Select" button
 readVoltage(); // Reads voltage from Analog pins
 voltageAdjust(); // Determines if the voltage needs to be changed based upon read voltage
 //printOut(); // DISABLED What to display in serial soon to be display

 delay(10); //Delay to allow Pots to adjust voltage feedback.
}


void setVoltageCH0() {
 // Sets resistance up or down from 100 to 210 with 2 buttons:
 buttonUpCH0State = digitalRead(buttonUpCH0Pin);

 if (buttonUpCH0State != lastButtonUpCH0State) {
   if (buttonUpCH0State == HIGH) {
     Serial.println("UP CH0"); // REMOVE POST DEBUG
       if (CH0Vtgt >= 1.00 && CH0Vtgt < 2.10){
         CH0Vtgt += 0.01;
         }
   } else {
     Serial.println("UP CH0 Released"); // REMOVE POST DEBUG
   }
   delay(5);
 }

 buttonDownCH0State = digitalRead(buttonDownCH0Pin);

 if (buttonDownCH0State != lastButtonDownCH0State) {
   if (buttonDownCH0State == HIGH) {
     Serial.println("DOWN CH0"); // REMOVE POST DEBUG
       if (CH0Vtgt > 1.00 && CH0Vtgt <= 2.10){
         CH0Vtgt -= 0.01;
         }
   } else {
     Serial.println("Down CH0 Released"); // REMOVE POST DEBUG
   }
   delay(5);
 }
     Serial.print("Channel 1 Target: ");
     Serial.print(CH0Vtgt);
     Serial.print("\t");

 lastButtonDownCH0State = buttonDownCH0State;  
 lastButtonUpCH0State = buttonUpCH0State;
}

void setVoltageCH1() {
 // Sets resistance up or down from 100 to 210 with 2 buttons:
 buttonUpCH1State = digitalRead(buttonUpCH1Pin);

 if (buttonUpCH1State != lastButtonUpCH1State) {
   if (buttonUpCH1State == HIGH) {
     Serial.println("UP CH1"); // REMOVE POST DEBUG
       if (CH1Vtgt >= 1.00 && CH1Vtgt < 2.10){
         CH1Vtgt += 0.01;
         }
   } else {
     Serial.println("UP CH1 Released"); // REMOVE POST DEBUG
   }
   delay(5);
 }

 buttonDownCH1State = digitalRead(buttonDownCH1Pin);

 if (buttonDownCH1State != lastButtonDownCH1State) {
   if (buttonDownCH1State == HIGH) {
     Serial.println("DOWN CH1"); // REMOVE POST DEBUG
       if (CH1Vtgt > 1.00 && CH1Vtgt <= 2.10){
         CH1Vtgt -= 0.01;
         }
   } else {
     Serial.println("Down CH1 Released"); // REMOVE POST DEBUG
   }
   delay(5);
 }
     Serial.print("Channel 2 Target: ");
     Serial.print(CH1Vtgt);
     Serial.print("\t");

 lastButtonDownCH1State = buttonDownCH1State;  
 lastButtonUpCH1State = buttonUpCH1State;
}

void readVoltage() {
 // Reads voltage from Analog Pins
 {
   int sensor0Val = analogRead(A0);
   float CH0VRead = sensor0Val * (5.0 / 1023.0); 
   Serial.print("Channel 1 Voltage:    ");
   Serial.print(CH0VRead); // LAST VALUE NEEDS TO BE CHANGED TO REMOVE DECIMAL
   Serial.print("\t");
 }
 {
   int sensor1Val = analogRead(A1);
   float CH1VRead = sensor1Val * (5.0 / 1023.0);
   Serial.print("Channel 2 Voltage:    ");
   Serial.println(CH1VRead); // LAST VALUE NEEDS TO BE CHANGED TO REMOVE DECIMAL
 }
 //Duplicate or simplify above code for up to 6 channels
 delay(10); //delay between readys for Pot adj CAN BE REMOVED
}

void voltageAdjust(){
 // Adjusts Voltage
if (CH0VRead != CH0Vtgt || CH1VRead != CH1Vtgt) { //REMOVE ACTUAL
 if (CH0VRead > CH0Vtgt && CH0VRead != CH0Vtgt) { //REMOVE ACTUAL
   voltageDecrease(addressPot0);
 } else {
   voltageIncrease(addressPot0);
 }

 if (CH1VRead > CH1Vtgt && CH1VRead != CH1Vtgt) {
   voltageDecrease(addressPot1);
 } else {
   voltageIncrease(addressPot1);
 }

 delay(10); //Delay to allow for voltage feedback
}
}

void voltageDecrease(byte address){
 // Decreases Voltage increasing resistance 1/255 away from Terminal A(Pin PAx)
  for (int i = 0; i <= 255; i++){
   digitalPotWrite(i, address);
   delay(10);
  }
}

void voltageIncrease(byte address){
  // Increases Voltage by decreasing resistance 1/255 towards Terminal A(Pin PAx)
 for (int i = 255; i >= 0; i--){
   digitalPotWrite(i, address);
   delay(10);
 }
}

/* void printOut(){
 // What to display via Serial
 Serial.print("Channel 1 Voltage:     ");
 Serial.println(CH0VRead); // LAST VALUE NEEDS TO BE CHANGED TO REMOVE DECIMAL
 Serial.print("\t");

 Serial.print("Channel 1 Target Voltage:     ");
 Serial.println(CH0Vtgt); // LAST VALUE NEEDS TO BE CHANGED TO REMOVE DECIMAL
 Serial.print("\t");

 Serial.print("Channel 2 Voltage:     ");
 Serial.println(sensor1Val); // LAST VALUE NEEDS TO BE CHANGED TO REMOVE DECIMAL
 Serial.print("\t");

 Serial.print("Channel 2 Target Voltage:     ");
 Serial.println(CH1Vtgt, 2); // LAST VALUE NEEDS TO BE CHANGED TO REMOVE DECIMAL

} */ //DISABLED CODE

int digitalPotWrite(byte value, byte address)
{ //SPI Write program. Single Chip, 2 Channels.
 digitalWrite(CS, LOW); //Set Chip Active
 SPI.transfer(address);
 SPI.transfer(value);
 digitalWrite(CS, HIGH); //Set Chip Inactive
}

 

EDIT: Fixed a button issue.

EDIT DEUCE: Got it 99% working, I have a problem with the voltage being compared has to be exact instead of 100ths of volts causeing an adjustVoltage loop. Other than that its working!

Edited by Wiggles
Link to comment
Share on other sites

I think I know what you might be getting at but I still think it would be more convenient to just punch in a voltage value and let some micro controller do all the adjustments for you.

 

Yeah I don't disagree but I needed something for now and here's an example of what I mean with the trimpot

 

image_id_1630528.jpeg

Link to comment
Share on other sites

  • 3 weeks later...

Im nearly done with a prototype for PCB production. Im waiting on a SATA Power connector and TFT touch screen to test. Digikey and Mouser have no cheap TFTs or even a SATA Power connector, alas I have resorted to 3rd party to get sparse details.

 

I should have a PCB by the end of next month to program fully. This thing is badass, I designed it from the ground up using an ATmega2560.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...