buildzoid Posted March 16, 2016 Posted March 16, 2016 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. Quote
elmor Posted March 16, 2016 Posted March 16, 2016 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 Quote
buildzoid Posted March 17, 2016 Author Posted March 17, 2016 (edited) 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: Edited March 17, 2016 by buildzoid Quote
newlife Posted March 17, 2016 Posted March 17, 2016 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 Quote
elmor Posted March 17, 2016 Posted March 17, 2016 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: 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? Quote
buildzoid Posted March 17, 2016 Author Posted March 17, 2016 (edited) 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: 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 March 20, 2016 by buildzoid Quote
buildzoid Posted March 24, 2016 Author Posted March 24, 2016 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. Quote
TiN Posted March 30, 2016 Posted March 30, 2016 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. Quote
Wiggles Posted April 2, 2016 Posted April 2, 2016 (edited) 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: 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 April 2, 2016 by Wiggles Quote
mllrkllr88 Posted April 3, 2016 Posted April 3, 2016 (edited) 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. Edited April 3, 2016 by mllrkllr88 Quote
Massman Posted April 6, 2016 Posted April 6, 2016 This looks pretty cool - looking forward to test updates! Quote
skulstation Posted April 6, 2016 Posted April 6, 2016 (edited) ops wrong trade ..... but nice work Edited April 6, 2016 by skulstation Quote
buildzoid Posted April 6, 2016 Author Posted April 6, 2016 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. 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. Quote
Wiggles Posted April 12, 2016 Posted April 12, 2016 Why not use breadboard connectors? Just get Female to Female cables and have it so you can have easy disconnect and a break away function in case you pull a wire/drop the device. Quote
buildzoid Posted April 13, 2016 Author Posted April 13, 2016 Ok so after messing around with volt modding all my Fury X's I've decided that I'm just going to learn how the DACs are supposed to be used because being able to also lower Vcore as well as raise it would be nice when your volt mod doesn't go perfectly. Quote
Wiggles Posted April 25, 2016 Posted April 25, 2016 Im close to finishing my design of a tool. Should have up to 6 channels, 2 K Probe sensors, and a nice color LCD to display info and set voltage. Im just trying to figure out the programming now. Quote
newlife Posted April 29, 2016 Posted April 29, 2016 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. 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 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 Quote
buildzoid Posted April 29, 2016 Author Posted April 29, 2016 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 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. Quote
Wiggles Posted April 30, 2016 Posted April 30, 2016 (edited) 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 May 1, 2016 by Wiggles Quote
newlife Posted May 4, 2016 Posted May 4, 2016 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 Quote
Wiggles Posted May 23, 2016 Posted May 23, 2016 @buildzoid Do you have any updates on that 1M Ohm Design? Id like to order prototype boards and can't find a solution that is better than yours. I wouldn't want to take credit where its due and am curious to see what you got. Quote
buildzoid Posted May 23, 2016 Author Posted May 23, 2016 No updates I've been pretty busy with exams recently. Quote
Wiggles Posted May 26, 2016 Posted May 26, 2016 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. Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.