Detailed diagrams and comments.
This diagram gives an overview of the power supply.
The netfilter is a standard ICE connector with build in fuse followed by an On/Off switch on the back of the amplifier.
The +/- 12 V supply delivers +12 V to the Arduino. +/- 12 V to ICEpower modules are controlled by Relay 1.
Relay 2 controls AC to the Vpp (80 V) supply and relay 3 controls a soft start resistor.
The +/- 12 V supply is a classic solution based on 7812 / 7912. It is heavily filtered with a residual noise less than 0.1 mV unloaded.
This diagram shows the driver transistors for the relays on the relay board.
Vpp (80 V) current to the the power goes through a 0.1 Ohm resistor. It will trigger the BD140 transistor when current exceeds a fixed limit around 7-10A. The selected transistor can handle the voltage drop (80 V) and the output voltage is reduced via a voltage divider in order to supply a logical one as digital input to Arduino.
There are two current detectors one for each power amplifier module.
Interface logic connects the Arduino to the rest of the circuit. Arduino Uno R3 is a 5V device with an AD-converter with an input range of 0V to 5V and 5V digital input/output pins.
Interface logic is placed on an Arduino prototype board (see Resources).
Attenuator and precision measurements
I measure 5 voltages (L+, L-, R+, R-, Vpp) in the range 0-80V and I use a number of tricks in order to obtain precise and noise free analog measurements.
I have designed the input to handle voltages from 0-100 V. This is attenuated approximately 1:20 and the resulting 0-5 V is send to the build in analog to digital converter (ADC). It has a resolution of 1024 steps which means that I can measure 0-100 V with a resolution of 0.1 V. On paper these data are more than adequate but some issues had to be solved.
Resistor tolerance. With 1% resistors each attenuator (two resistors) will have 2% tolerance in gain and when you measure DC over the speaker 4 resistors are involved giving a worst case error of 4% or 4 V. This must be improved.
Trim pots are the classic solution which I will recommmend. For my own personal amplifier I decided to implement the trimpots in software with an array of gain constants which I “trimmed” to a precision of 0.5% FS.
During power up I expect 0 V on the speaker terminals and with gain calibration I get very precise readings.
High CMRR. After I Enable the amplifier I expect a DC signal of Vpp/2 (40V) on the speaker terminals and I want to optimize the two signals called sum and difference. If I would implement sum and especially difference with a classical electronic circuit I would focus on high CMRR. If I transfer CMRR to the digital domain I would say that I need high precision measurements before calculating sum and difference and I need the highest precision around Vpp/2. I have implemented an Auto zero state that calibrate the four speaker outputs at 50% of Vpp. The result is saved in a variable called offsetCal.
All of the tricks come into action in the program line where I read the analog input from the speaker terminal and convert it to a floating point voltage:
currentV[i] = analogRead(i)*vFactor*GainCal[i]+offsetCal[i];
[i] is an index that loops through the output terminals. currentV[i] is the floating point voltage of speaker terminal [i] after all calibration. analogRead() returns the ADC result as an integer 0-1023 this is multiplied with vFactor giving the uncalibrated voltage. The uncalibrated voltage is multiplied with GainCal[i] the fixed calibrations that I have entered and finally offsetCal[i] from auto zero is added.
With these tricks I have obtained very precise and stable measurements. When I turn down the music signal I read 0.00 V over the speaker.
Low pass filter. High frequency noise from the class D amplifier was the next issue. This is removed with the 100 nF capacitor that forms a first order low pass filter with fc=1,000 Hz.
Nyquist frequency. With a sampling frequency of 1,000 Hz you get a Nyquist frequency of 500 Hz. This means that frequencies above 500 Hz should be removed with a sharp 500 Hz low pass filter. On the other hand I want very quick response in case of a fault , so in the end I implemented a 1,000 Hz filter.
Folding. Folding is the situation where a high frequency signal that is sampled looks like a low frequency signal. If I sample a 999 Hz or a 1001 Hz signal they will look like a one Hz signal which could potentially trigger a DC alarm. In practise I have not seen this kind of problems. For more information see Nyquist in Resources.
Buffer and inverter
The ICEpower modules have two control signals (^Mute, ^Standby) with internal pull-up resistors. They are active low (the ^-symbol). If these control signals are not connected then the amplifier will work normally.
I have implemented the buffer transistors as suggested in the ICEpower documentation. They can pull the control signal down and they invert the signal, so the digital signals from the Arduino should be called Mute and Standby (active high).
The digital output pins from the Arduino can easily deliver the necessary current to drive the LEDs directly through a resistor.
The light from the two LEDs are also controlled by the Arduino:
- The blue LED visulalizes the power state and increases in intensity during power up. This is done with puls with modulation (PWM).
If you have tried the settings in a computer display yoy may have come across a setting called gamma. Gamma is a nonlinear compensation of light intensity. I have implemented a value of 2.0 which gives a good visual result.
- The red LED is used to display error information via blink using just one LED. This was fine during development but not very user friendly. A more user friendly solution could include more LED´s or mayby a small display.