• Updated 2023-07-12: Hello, Guest! Welcome back, and be sure to check out this follow-up post about our outage a week or so ago.

BGE's take on the Quadra 900/950 ATX PSU Mod

BadGoldEagle

Well-known member
When you're dealing with tantalum caps, only replace the ones that are damaged. The rest of them (for now at least) are ok. 

I don't remember on top of my head what value that cap was and my 950 is currently buried under a pile of stuff... Maybe someone else can help?

I think your PSU is what blew that cap.

 
Last edited by a moderator:

olliec420

Active member
So, I've opened the Quadra's case and power supply. The latter looked OK-ish, but on the motherboard something caught my attention. So, the first repair job is on the list.

Question; would I need to replace all of them, or will replacing the one that blew be enough?

Also; why did this one blow up? Wouldn't want to mindlessly replace this one only for it to be blown up again the next time. 

So I had the same thing happen to one I just got in the mail.  Please see my threads...








You should find these helpful.  

I was able to see the remnants of markings on my burnt cap and was able to determine it was this: https://www.ebay.com/itm/10pcs-T491C106K016AT-KEMET-Tantalum-Capacitor-16V-10-10UF-SURFACE-MOUNT/313012284846?ssPageName=STRK%3AMEBIDX%3AIT&_trksid=p2060353.m2749.l2649

I ordered it and soldiering station but I have not replaced it yet.  I did retrobright the plastic pieces of the case and they came out really good.  Putting out a blog/video series on it which I will post here and r/vintageapple when complete.  Hopefully its done this month or next.

As far as BadGoldEagle's PSUs, I would really like to get one but I THINK mine is working fine.  I spoke with someone who is electrical engineer who does not think my PSU blew it.  I hope he is right.  

Please let me know how you repair goes and I will you too!

 

BadGoldEagle

Well-known member
@olliec420 Parts. 8 bucks would be a little too cheap for a complete mod... those boards will be BIG.

Instructions/files will be free once I finish it. Hopefully I'll have a new schematic ready next week.

 

olliec420

Active member
@olliec420 Parts. 8 bucks would be a little too cheap for a complete mod... those boards will be BIG.

Instructions/files will be free once I finish it. Hopefully I'll have a new schematic ready next week.
Ahh ok very cool.  I definitely want a parts kit too when available.  Thanks for all the hard work to keep these old beasts alive! 

 

BadGoldEagle

Well-known member
The real hard work would have been trying to fix these old beasts, not gutting them... but at least, like Geekdot said, it’ll run cooler, be more reliable and easily repairable in the future...

 

Ton

New member
OK, update on the AWS95. It lives!

It was literally just a replacement of the blown cap and it booted straight up. Well, prior to that I did also wash the complete board with vinegar and rinsed it off with water. This I should have done immediately, as there was some corrosion visible on the board here and there. But the PSU is perfectly fine, the whole machine runs quite stable, although I haven't actually used it for a prolonged period yet.


View attachment IMG_5492.m4v


 
Last edited by a moderator:

BadGoldEagle

Well-known member
Great to hear @Ton

but given that the engineer I talked to before deciding to do this mod repairs PSUs for a living and tests them at full load for 24 hours before calling them fixed, I wouldn't declare victory just yet...

My recapped PSU died during a small stress/smoke test. My plan was to leave it on idling for 3 or 4 of hours but it didn't even pass the two hour mark...   

But your problem is interesting: it means that computers of this era (early 90s) are starting to suffer from tantalum cap failures. Instead of leaking like the electrolytic ones do, those just explode. 

________________________

And now, back to the subject at hand. I have once again decided to change the fan controller (this will be the last time, as I'm sure this will work this time).

I just can't get enough from the 555 to do everything it want it to do. I'll now be using an Arduino Nano board (it costs from 1 to 7 bucks depending on who you're getting it from... even clones from China should do the job).

I810330.1-ARDUINO-Nano.jpg

I chose it because:

1/ It comes in a PDIP like package. Either solder it to the QuadrATX DC board or install it in a socket. You don't need a hot air station...

2/ It's configurable, because it'll be running a bespoke sketch (read program). If I mess up the code, I can still change it without having to alter the DC board.

3/ It's REALLY easy to flash. Get the free Arduino App for your Mac/Linux/PC, open it, plug in the Nano with a USB cable and hit upload. ANYONE CAN DO IT. 

4/ If it dies, there's plenty more available

5/ It's easy to program for and it's got quite a sizable community.

6/ The fan controller part of the schematic is now a lot easier to understand and the circuit won't take as much space on the DC Board as it used to. 

7/ Isn't that enough?

More to follow...

 
Last edited by a moderator:

olliec420

Active member
OK, update on the AWS95. It lives!

It was literally just a replacement of the blown cap and it booted straight up. Well, prior to that I did also wash the complete board with vinegar and rinsed it off with water. This I should have done immediately, as there was some corrosion visible on the board here and there. But the PSU is perfectly fine, the whole machine runs quite stable, although I haven't actually used it for a prolonged period yet.


View attachment 35468


How difficult was the surgery?  I have it all ready for me but I just haven't felt the urge to sit and tackle it yet.  Ive watched enough videos, I think I got a plan but I am not very experience with this kind of soldering.  I got to get this done one weekend soon.  Any tip or suggestions for me?

 

BadGoldEagle

Well-known member
I don't mean to sound rude but wouldn't this conversation be more appropriate in a PM? 

In other news, I've decided to use an ATTiny85 instead of the Nano. The boards will come with a preprogrammed chip and I'll offer programming services after the original run of boards is sold out (if there is enough demand outside of the 68kmla, I'll order a new batch of 10). A set will now cost $10 but you won't have to buy the controller so in the end things will be cheaper for you guys. 

This will reduce board clutter as well. The ATTiny85 is a DIP8 IC while the nano takes about as much space as a DIP30 chip (which does not exist, so I would have had to use a DIP32 socket for the Nano and things wouldn't have been aligned...)

Current fan controller schematic:

Bildschirmfoto 2020-07-12 um 14.31.43.png

NB1: The relay bit is still entirely optional.

NB2: The pot will be replaced by a trimmer. It'll be about $3-4 cheaper.

NB3: The LED indicator circuit will probably change as I don't think a single 20mA LED will be bright enough to be seen through the vents at the back (it will be on only if something goes wrong, otherwise it'll be off). The rest of the schematic shouldn't change much now. 

How this works:

- Pins 3 and 7 are the inputs: The pot (pin 3) will allow the user to set the minimum fan speed (lowest position=50% and highest=100%). Pin 7 has the thermistor which will make the fan speed up/down linearly as the temperature increases/decreases. Still haven't decided on what the curve should look like. Should the max. temperature be lowered to 75C? Only actual testing will tell.

- Pins 5 and 6 are outputs. Pin 5 will go straight to a MOSFET, which in turn will modulate the fan's ground and therefore its speed. Pin 6 will be used for the LED indicator circuit.

Now on to write software for the thing! I'll code this for Arduinos 'cos that's just easier.

 

BadGoldEagle

Well-known member
Hi all

Small update... I have received most of the parts I need to test the fan controller circuitry.

Unfortunately the ones I don't have (the MOSFET and the pots) are pretty critical and I can't calibrate my controller until I get hold of them. 

But at least I got the "programmer" ready...

IMG_6254.jpg

And I tested my "bench" 12V PSU with the Noctua and the original Sanyo....

IMG_6255.jpg

Interestingly enough, even though the Sanyo is older and noisier, it moves A LOT more air compared to the Industrial PPC Noctua... But the latter should still be plenty enough as the Becker PSU doesn't really need any cooling (it has massive heatsinks!) and the fan MOSFET won't generate much heat (according to my calculations, the max. temperature rise in the worst case scenario will be 3°C (1A fan), or about 1.5°C for the Sanyo, negligible!)

Here's the current version of the microcode:

// QuadrATX fan speed controller //
// The Apple Chronicles //
// v0.25A //


// NOTES:
// set board to 8MHz!!!
// configure Arduino as ISP

// CALIBRATION NEEDED, currently using dummy values.


// variables declaration
int SensorPin = PB2; // pin 7
int PWMPin = PB0; // pin 5
int PotPin = PB4; // pin 3
int LEDPin = PB1; // pin 6
int SpeedPin = PB3 // pin 2
int SensorVal; // "temperature" from NTC
int PWMVal; // fan PWM output "speed"
int PotVal; // real potentiometer value, to define the cold/normal operation fan speed.
int PotValmapped; // lowest position shall correspond to the absolute minimum speed (see below) and not OFF, new potentiometer value
int MinSpeed=64; // absolute minimum speed, 0=0% and 255=100%, currently set to 25%, corresponds to lowest pot value

// Calibration variables, TBD
int NTCcold=450; // corresponds to ambient temperature, 10K for a 10k NTC @25°C
int NTChot=800; // corresponds to highest temperature before LED lights up, about 1.3K for a 10k NTC @80°C
int PotMin=0; // corresponds to lowest position on potentiometer
int PotMax=800; // corresponds to highest position on potentiometer


// setup code, to run once
void setup() {
// set PWM frequency of PB0 (Pin 5, ATTiny85, fan output) to 31,250 Hz.
TCCR0B = TCCR0B & 0b11111000 | 0b001;

// define pin modes ATTiny85
pinMode(SensorPin, INPUT);
pinMode(PotPin, INPUT);
pinMode(PWMPin, OUTPUT);
pinMode(LEDPin, OUTPUT);
pinMode(SpeedPin, OUTPUT);

// Set fan to full speed for one second at startup (prevents stall)
analogWrite(PWMPin, 255);

delay(1000);
}


// main code, to run repeatedly
void loop() {

//read NTC sensor value
SensorVal = analogRead(SensorPin);
if(SensorVal < NTCcold){ // in case ambient temperature is lower than 25°C
SensorVal = NTCcold;}

//read pot value
PotVal = analogRead(PotPin);

// map and assign pot/pwm values. 0 to 255 corresponds to 0 to 100%
PotValmapped = map(PotVal, PotMin, PotMax, MinSpeed, 254) // change potentiometer characteristic, lowest position corresponds to absolute minimum speed
PWMVal = map(SensorVal, NTCcold, NTChot, PotValmapped, 255); // linear fan curve from ambient to LED lighting up. PotValmapped is the minimum fan speed set by the potentiometer

// Overheating indicator
if (SensorVal>NTChot){
PWMVal=255; // full speed
analogWrite(LEDPin, HIGH); // LED ON
}
else {
analogWrite(LEDPin, LOW); // LED OFF
}

//write the PWM value to the pwm output pin
analogWrite(PWMPin, PWMVal);

//basic RPM indicator
analogWrite(SpeedPin, PWMVal);

}


I added a basic RPM indicator at the last minute... hopefully that'll work. For debug purposes only...

Comments/suggestions are welcome.

I also updated the schematic. It's not final (I'll probably place the MOSFET horizontally and the traces are most certainly too thick):

Bildschirmfoto 2020-07-19 um 15.47.05.png

 

BadGoldEagle

Well-known member
Just realized while performing a quick verify/compile that I forgot a couple of semicolons... I remember back when I was a freshman at university, our coding teacher used to subtract one point from our grade (out of a max. of twenty) per missing semicolon. Ah those were the days...

Also:

Sketch uses 1290 bytes (15%) of program storage space. Maximum is 8192 bytes.
Global variables use 13 bytes (2%) of dynamic memory, leaving 499 bytes for local variables. Maximum is 512 bytes.

Nice! So ATTiny25s and ATTiny45s can also be used without an issue (as long as they're of the PU aka PDIP variety).

 

Ton

New member
I'll keep following this topic as I'm interested in eventually replacing the power supply, even though mine seems good now (I've since installed A/UX fully).

 

BadGoldEagle

Well-known member
I have finished the calibration part and have updated the code and the schematic. I'd like to let it run today for an hour or so to check if the MOSFET heats up. It shouldn't but better be safe than sorry. 

Next step, real hardware testing with the ATTiny85. 

Bildschirmfoto 2020-07-24 um 10.22.22.png

 

BadGoldEagle

Well-known member
Endurance test is still going... Currently simulating a hot thermistor (LED is on). And the MOSFET stays cool to the touch so that's nice... no heatsinks needed.

Please note that the piece of kitchen towel is there to dampen the PWM vibrations. The glass table is definitely not helping. I didn't bother changing the frequency on the Arduino so it's currently set to 976Hz.

It will be set to 31kHz on the ATtiny. 

Also, I think I either have a dodgy pot or a bad mapping (just for the lower end of this pot) as it jumps around a bit... This needs investigating but I'd bet on the former. I got my potentiometers on amazon for less than €1 a pop. Edit: Yup, the pot was bad. Great!

The trimmer I have selected is made by Bourns and will be of higher quality. 

IMG_6261.jpeg

I'm also pretty happy to have found a thermistor with a built-in cable:

https://www.arrow.com/en/products/b57500m103a5/epcos-tdk

171070102_m500_pi0401.jpg

 
Last edited by a moderator:

BadGoldEagle

Well-known member
I was finally able to make my code work on the ATtiny. Turns out it's really picky about pin names... and that PB2 (pin 7) somehow corresponds to A2 and not A1 as it should!!!

Latest microcode:

// QuadrATX fan speed controller //
// The Apple Chronicles //
// v0.4 //


// NOTES:
// set board to 8MHz!!!
// configure Arduino as ISP


// variables declaration
int SensorPin = A1; // pin 7
int PWMPin = PB0; // pin 5
int PotPin = A2; // pin 3
int LEDPin = PB1; // pin 6
int SensorVal; // "temperature" from NTC
int PWMVal; // fan PWM output "speed"
int PotVal; // real potentiometer value, to define the cold/normal operation fan speed.
int PotValmapped; // lowest position shall correspond to the absolute minimum speed (see below) and not OFF, new potentiometer value
int MinSpeed=64; // absolute minimum speed, 0=0% and 255=100%, currently set to 25%, corresponds to lowest pot value

// Calibration variables
int NTCcold=512; // corresponds to ambient temperature, 10K for a 10k NTC @25°C
int NTChot=110; // corresponds to highest temperature before LED lights up, about 1.3K for a 10k NTC @80°C
int PotMin=0; // corresponds to lowest position on potentiometer
int PotMax=1023; // corresponds to highest position on potentiometer


// setup code, to run once
void setup() {
//set PWM frequency of PB0 (Pin 5, ATTiny85, fan output) to 31,250 Hz.
TCCR0B = TCCR0B & 0b11111000 | 0b001;

// define pin modes ATTiny85
pinMode(SensorPin, INPUT);
pinMode(PotPin, INPUT);
pinMode(PWMPin, OUTPUT);
pinMode(LEDPin, OUTPUT);

// Set fan to full speed for one second at startup (prevents stall)
analogWrite(PWMPin, 255);

delay(1200);
}


// main code, to run repeatedly
void loop() {

//read NTC sensor value
SensorVal = analogRead(SensorPin);
if( (SensorVal > NTCcold) && (SensorVal < 1000) ){ // in case ambient temperature is lower than 25°C
SensorVal = NTCcold;}
if( (SensorVal > NTCcold) && (SensorVal > 1000) ){ // NTC failure (open circuit)
SensorVal = NTChot-1;}

//read pot value
PotVal = analogRead(PotPin);

// map and assign pot/pwm values. 0 to 255 corresponds to 0 to 100%
PotValmapped = map(PotVal, PotMin, PotMax, MinSpeed, 254); // change potentiometer characteristic, lowest position corresponds to absolute minimum speed
PWMVal = map(SensorVal, NTCcold, NTChot, PotValmapped, 255); // linear fan curve from ambient to LED lighting up. PotValmapped is the minimum fan speed set by the potentiometer

// Overheating indicator
if (SensorVal<NTChot){
PWMVal=255; // full speed
digitalWrite(LEDPin, HIGH); // LED ON
}
else {
digitalWrite(LEDPin, LOW); // LED OFF
}

//write the PWM value to the pwm output pin
analogWrite(PWMPin, PWMVal);

delay(1000); // updates every second

}


I'll double check both boards with a professional next Saturday and I guess the next step is to send them to production ?  :)  Yay!

 
Last edited by a moderator:
Top