Entire Forum This board This topic Members Entire Site
 Pages: [1]
 Author Topic: Volt-amp meter for symmetrical power supply - help requested (troubleshooting)  (Read 2237 times) 0 Members and 1 Guest are viewing this topic.
thunderer
Junior Member

Offline

Posts: 54

Thank You
-Given: 18

I try to be patient

 « on: April 14, 2013, 11:21:45 23:21 »

I decided to make myself a symetrical PSU with LM317 and 337, control by dual taper pots (coarse and fine). The intent was to have a PSU for small audio power amps and pre-amps, correctors, etc.

Nothing fancy, the datasheet schematic. Works flawlessly.

The part I added was a LCD showing the voltage and current on each branch. Remember, there are 3 output terminals (V+, 0V, and V-).

So I chose to use some resistive dividers and shunts (0.1ohm, 3W, 1%). See the attched DSN file for connections outside the PSU (I do not show the 317 and 337, as there is no issue with them).

I chose to display the positive current as the voltage drop on RSH1 (later to divide by 0.1 to get the current) to avoid putting another OPAMP, as I could not find how to reference it to the V- (being the GND of the PIC). The issue I have is that the difference is not consistant. See the pictures for 1A and 0.5A. The voltage drop on RSH1 (shown on LCD) at 0.5A (0.12V - on 7.45V shown on LCD) is bigger than at 1A (0.1V = which is 1A on 0.1ohm = coincidence? - on 13.3V shown on LCD). How come?! Note I used a 13ohm load (so 1A at 13V)

The code for the 16F88 I used is:
Code:
'     VI_LCD_for_differential_PS
'     (c) Thunderer (2o12)
' * Revision History:
'     0 - 1st issue
' * Description:
'     DC voltage and current are measured and displayed on a 16x2 LCD.
'     Data: 20Vdc max, 1.5Adc max for a symetrical power supply. Common GND.
'     S -------------------- +V
'     S -------------------- GND (0V)
'     S -------------------- -V
'     Example:
'            ------------------
'            |S+: 12.34V 1.23A |
'            |S-: 12.34V 1.23A |
'            ------------------
' * Test configuration:
'     MCU:             PIC16F88
'     Oscillator:      INTOSC 4 MHz
'     Ext. Modules:    -
' *

program Measurement
' Declarations section
dim            U1mes, U1m, U1 as float                   ' U1
U2mes, U2m, U2 as float                   ' U2
U3mes, U3m, U3 as float                   ' I1
U4mes, U4m, U4 as float                   ' I2
i as byte

' Lcd module connections
dim LCD_RS as sbit at RB7_bit
LCD_EN as sbit at RB6_bit
LCD_D4 as sbit at RB5_bit
LCD_D5 as sbit at RB4_bit
LCD_D6 as sbit at RB3_bit
LCD_D7 as sbit at RB2_bit

LCD_RS_Direction as sbit at TRISB7_bit
LCD_EN_Direction as sbit at TRISB6_bit
LCD_D4_Direction as sbit at TRISB5_bit
LCD_D5_Direction as sbit at TRISB4_bit
LCD_D6_Direction as sbit at TRISB3_bit
LCD_D7_Direction as sbit at TRISB2_bit
' End Lcd module connections

dim txtU1 as char[5]
txtI1 as char[4]
txtU2 as char[5]
txtI2 as char[4]

'   Set-up the PIC
sub procedure InitMain()
OSCCON     =   0x7E              ' 8MHz clock
OPTION_REG =   0x80              ' Pull-up disabled PORTB
INTCON     =   0x00              ' No INT
CMCON      =   0x00              ' No COMP
ANSEL      =   0x0F              ' PORTB Digital I/Os, PORTA AIs
' on RA0 to RA3, RA4 to RA7 are DIs
CCP1CON    =   0x00              ' CCP disabled

TRISA      =   0xFF              ' All inputs
TRISB      =   0x00              ' All outputs

PORTA      =   0x00              ' Clear PORTA
PORTB      =   0x00              ' Clear PORTB
end sub

'   Main program
Main:
InitMain()

Lcd_Init()                     ' Initialize Lcd
Lcd_Cmd(_LCD_CLEAR)            ' Clear display
Lcd_Cmd(_LCD_CURSOR_OFF)       ' Cursor off
Lcd_Out(1,2,"Symmetrical PS")  ' Write text in first row
Lcd_Out(2,3,"2x20V/1.5Adc")    ' Write text in second row
Delay_ms(1000)
Lcd_Cmd(_LCD_CLEAR)            ' Clear display

' The VI measurement
Measure:
while (TRUE)

' Display static text
Lcd_Out(1,1,"S+: ")           ' Write in 1st row 1st position
Lcd_Out(2,1,"S-: ")           ' Write in 2nd row 1st position

Delay_ms(100)

' Voltage positive
' Measure
U1mes = 0
for i = 1 to 200
next i
' Calculate
U1m = U1mes/200 - U2m
U1  = U1m*25*5/1023
FloatToStr(U1, txtU1)         ' txtU1 = U1
' Display
Lcd_Out(1,5,txtU1)            ' Write textU in 1st row 5th position
Lcd_Out(1,10,"V")             ' Write V in 1st row 10th position
Lcd_Out(1,11," ")             ' Write "space" in 1st row 11th position

Delay_ms(100)

' Current positive
' Measure
U3mes = 0
for i = 1 to 200
next i
' Calculate
U3m = U3mes/200 - U2m
U3  = U3m*25*5/1023
FloatToStr(U3, txtI1)          ' txtI1 = U3
' Display
Lcd_Out(1,12,txtI1)            ' Write textI in 1st row 12th position
Lcd_Out(1,16,"A")              ' Write A in 1st row 16th position

Delay_ms(100)

' Voltage negative
' Measure
U2mes = 0
for i = 1 to 200
next i
' Calculate
U2m = U2mes/200
U2  = U2m*25*5/1023
FloatToStr(U2, txtU2)         ' txtU2 = U2
' Display
Lcd_Out(2,5,txtU2)            ' Write textU in 2nd row 5th position
Lcd_Out(2,10,"V")             ' Write V in 2nd row 10th position
Lcd_Out(2,11," ")             ' Write "space" in 2nd row 11th position

Delay_ms(100)

' Current negative
' Measure
U4mes = 0
for i = 1 to 200
next i
' Calculate
U4m = U4mes/200
U4 = U4m*0.936*5/1023            ' 5 * 9.36 = 4.68 correction
FloatToStr(U4, txtI2)         ' txtI2 = U4
' Display
Lcd_Out(2,12,txtI2)           ' Write textI in 2nd row 12th position
Lcd_Out(2,16,"A")             ' Write A in 2nd row 16th position

Delay_ms(100)

wend
end.
 « Last Edit: April 15, 2013, 12:03:40 00:03 by thunderer » Logged

Interested and hopefully helpful in: DC brushed motor control (mainly R/C - PPM/PWM), analog audio, PIC (mikrobasic PRO). Feel free to ask, and if I can, I will help. But only on forum topics, any started private conversation will continue in a public topic.
pickit2
Moderator
Hero Member

Offline

Posts: 3816

Thank You
-Given: 567

There is no evidence that I muted SoNsIvRi

 « Reply #1 on: April 15, 2013, 02:29:22 02:29 »

some users don't have proteus installed, why not post a *.pdf
first thought why use LM317 & LM337 ripple would be a problem.
 Logged

Note: If you have no posts other than, I want or reporting a dead link Then you can't complain If I remove your post So Stop Leeching
kentar
Newbie

Offline

Posts: 25

Thank You
-Given: 45

 « Reply #2 on: April 15, 2013, 06:11:08 06:11 »

Shunt resistor is in series with load resistor. When the load is very small (very small voltage drop) on shunt resistor
rsh resistor is load . So in low voltages you must use offset in your code  or use very small shunt resistor.
(2 x 0.1  ohm  in parallel)  or   typical shunt resistor (75 mV max voltage drop).
 « Last Edit: April 15, 2013, 06:26:59 06:26 by kentar » Logged

Warned
PaulC
V.I.P
Active Member

Offline

Posts: 162

Thank You
-Given: 3584

 « Reply #3 on: April 15, 2013, 01:25:40 13:25 »

to give you some ideas
http://www.sonsivri.to/forum/index.php?topic=52006.msg149800#msg149800
 Logged

find it , read it , share it .
thunderer
Junior Member

Offline

Posts: 54

Thank You
-Given: 18

I try to be patient

 « Reply #4 on: April 16, 2013, 01:17:39 01:17 »

@pickit2 - I attached the PDF. I agree 317-337 is such noisy. Can we believe 317 turned 40 years?

...rsh resistor is load . So in low voltages you must use offset in your code  or use very small shunt resistor.
I do not follow you. A shunt is not more of a load on a small load than on a big one. And the 0.1R has a drop of 150mV at 1.5A. More, I measure the voltage after the shunt (on the positive branch), so I know how much voltage I have at the load terminals. Funny is that we complain about 0.1R but we do not care about more than 3-4 times resistance in cables to the load  .
I am interested about the use of offset. Do you mean deducting the voltage drop on the negative branch - that is a flaw of my software in both positive and negative? This is easy to fix. Can you give me some hints?

@PaulC - I will read it, thx!

Guys, FYI the negative branch works OK, I mean the GND to V- works perfectly, the current is perfectly measured with such simple scheme. Only the positive branch refused to "behave".
 « Last Edit: April 16, 2013, 01:56:51 01:56 by thunderer » Logged

Interested and hopefully helpful in: DC brushed motor control (mainly R/C - PPM/PWM), analog audio, PIC (mikrobasic PRO). Feel free to ask, and if I can, I will help. But only on forum topics, any started private conversation will continue in a public topic.
Catcatcat
Active Member

Warned
Offline

Posts: 117

Thank You
-Given: 89

 « Reply #5 on: April 16, 2013, 07:36:57 07:36 »

I think the problem is that you have a common wire is taken not tire COMMON PSU, and - FROM PSU
 Logged
pickit2
Moderator
Hero Member

Offline

Posts: 3816

Thank You
-Given: 567

There is no evidence that I muted SoNsIvRi

 « Reply #6 on: April 16, 2013, 08:59:43 08:59 »

Why not use the voltage value at Ajust of voltage regs.
 Logged

Note: If you have no posts other than, I want or reporting a dead link Then you can't complain If I remove your post So Stop Leeching
DreamCat
Active Member

Offline

Posts: 235

Thank You
-Given: 130

 « Reply #7 on: April 16, 2013, 09:11:09 09:11 »

@thunderer, as you said, the 0.1R shunt resistor has a voltage drop of 150mV at 1.5A, but it really too small respect to the reference voltage of your MCU, it can't get a enough resolution.
So, I think you should better use a current monitor IC, or a op amp to get some gain. of course, a current mirror also can be used for this.
 Logged

May be I expressed the wrong meaning, sorry for my bad english. Please correct it for me if you can.
thunderer
Junior Member

Offline

Posts: 54

Thank You
-Given: 18

I try to be patient

 « Reply #8 on: April 16, 2013, 11:49:29 23:49 »

@ Dreamcat: Are you proposing a differential amplifier on the RSH1? My issue with this is that I will have an opamp powered at 5V, and its inputs will see maybe 40V with respect to the "- of the PSU" (which is the GND of the OPAMP and the PIC). Will this be acceptable?

Maybe I will keep the resistive dividers and then input them in the OPAMP I purchased to re-do this project (a rail-to-rail FAN4174 http://www.fairchildsemi.com/ds/FA/FAN4274.pdf). Then the output of the OPAMP sent to the PIC. I will have to try this configuration. Looks like a plan, thx!
 « Last Edit: April 17, 2013, 12:02:03 00:02 by thunderer » Logged

Interested and hopefully helpful in: DC brushed motor control (mainly R/C - PPM/PWM), analog audio, PIC (mikrobasic PRO). Feel free to ask, and if I can, I will help. But only on forum topics, any started private conversation will continue in a public topic.
Catcatcat
Active Member

Warned
Offline

Posts: 117

Thank You
-Given: 89

 « Reply #9 on: April 17, 2013, 07:42:16 07:42 »

maybe you should pay attention to such converters TSC101
 Logged
PaulC
V.I.P
Active Member

Offline

Posts: 162

Thank You
-Given: 3584

 « Reply #10 on: April 17, 2013, 07:25:07 19:25 »

ICL7136
3 1/2 Digit LCD/LED, Low Power Display, A/D Converters with Overrange Recovery
w?w
www.intersil.com/data/fn/fn3086.pdf

ICL7106
3 1/2 Digit, LCD/LED Display, A/D Converters
h??p
http://www.intersil.com/content/dam/Intersil/documents/fn30/fn3082.pdf

ICL7107
3 1/2 Digit, LCD/LED Display, A/D Converters
h??p
http://www.intersil.com/content/dam/Intersil/documents/fn30/fn3082.pdf

ICL7126
3 1/2 Digit, Low Power, Single-Chip A/D Converter
h??p
htty://www.intersil.com/content/dam/Intersil/documents/fn30/fn3084.pdf

Key Features

First Reading Overrange Recovery in One Conversion Period
Guaranteed Zero Reading for 0V Input on All Scales
True Polarity at Zero for Precise Null Detection
1pA Typical Input Current
True Differential Input and Reference, Direct Display Drive
LCD ICL7136
Low Noise - Less Than 15µVP-P
On Chip Clock and Reference
Low Power - Less Than 1mW
Surface Mount Package Available
Drop-In Replacement for ICL7126, No Changes Needed
Pb-Free Plus Anneal Available (RoHS Compliant)

Description

The Intersil ICL7136 is a high performance, low power 31/2 digit, A/D converter. Included are seven segment decoders, display drivers, a reference, and a clock. The ICL7136 is designed to interface with a liquid crystal display (LCD) and includes a multiplexed backplane drive.

The ICL7136 brings together a combination of high accuracy, versatility, and true economy. It features auto-zero to less than 10µV, zero drift of less than 1µV/oC, input bias current of 10pA (Max), and rollover error of less than one count. True differential inputs and reference are useful in all systems, but give the designer an uncommon advantage when measuring load cells, strain gauges and other bridge type transducers. Finally, the true economy of single power supply operation, enables a high performance panel meter to be built with the addition of only 10 passive components and a display.

The ICL7136 is an improved version of the ICL7126, eliminating the overrange hangover and hysteresis effects, and should be used in its place in all applications. It can also be used as a plug-in replacement for the ICL7106 in a wide variety of applications, changing only the passive components.

may be worth a look..

 « Last Edit: April 18, 2013, 08:56:44 08:56 by pickit2 » Logged

find it , read it , share it .
thunderer
Junior Member

Offline

Posts: 54

Thank You
-Given: 18

I try to be patient

 « Reply #11 on: April 18, 2013, 04:08:28 04:08 »

Hi guys,
I re-wrote the program, saved some "space" on the PIC, and got it more stable (I still have to improve it). I mean, using this erroneous way of voltage drop I managed to have a consistent difference Vsupply-Vload.

Anyway, it will not stop here as I will try (first) an opamp to differentially amplify the difference and get better us of PIC ADC resolution. If not happy, I have sourced some current monitor IC (ZXCT1009) that I may use having them in my comps box.

I will be travelling these days, so news come in the weekend.

Below the new code:
Code:
program Measurement
' Declarations section
dim tlong0,tlong00,tlong1,tlong11,tlong2,tlong22,tlong3       as longint
dim ch0, ch1, ch2, ch3                                        as word

' Lcd module connections
dim LCD_RS as sbit at RB7_bit
LCD_EN as sbit at RB6_bit
LCD_D4 as sbit at RB5_bit
LCD_D5 as sbit at RB4_bit
LCD_D6 as sbit at RB3_bit
LCD_D7 as sbit at RB2_bit

LCD_RS_Direction as sbit at TRISB7_bit
LCD_EN_Direction as sbit at TRISB6_bit
LCD_D4_Direction as sbit at TRISB5_bit
LCD_D5_Direction as sbit at TRISB4_bit
LCD_D6_Direction as sbit at TRISB3_bit
LCD_D7_Direction as sbit at TRISB2_bit
' End Lcd module connections

'   Set-up the PIC
sub procedure InitMain()
OSCCON     =   0x7E              ' 8MHz clock
OPTION_REG =   0x80              ' Pull-up disabled PORTB
INTCON     =   0x00              ' No INT
CMCON      =   0x00              ' No COMP
ANSEL      =   0x0F              ' PORTB Digital I/Os, PORTA AIs
' on RA0 to RA3, RA4 to RA7 are DIs
CCP1CON    =   0x00              ' CCP disabled

TRISA      =   0xFF              ' All inputs
TRISB      =   0x00              ' All outputs

PORTA      =   0x00              ' Clear PORTA
PORTB      =   0x00              ' Clear PORTB
end sub

'   Main program
Main:
InitMain()

Lcd_Init()                     ' Initialize Lcd
Lcd_Cmd(_LCD_CLEAR)            ' Clear display
Lcd_Cmd(_LCD_CURSOR_OFF)       ' Cursor off
Lcd_Out(1,2,"Symmetrical PS")  ' Write text in first row
Lcd_Out(2,3,"2x20V/1.5Adc")    ' Write text in second row
Delay_ms(1000)
Lcd_Cmd(_LCD_CLEAR)            ' Clear display

' Display static text
Lcd_Out(1,1,"S+:")            ' Write in 1st row 1st position
Lcd_Out(2,1,"S-:")            ' Write in 2nd row 1st position

' The VI measurement
Measure:
while (TRUE)
' Voltage positive
' Measure
tlong00 = tlong0 - tlong22
tlong0 = tlong00 >> 10
if ch0 = 0 then
Lcd_Out(1, 4," ")
else
Lcd_Chr(1, 4, 48+ch0)
end if
ch0 = (adc_rd0 div 1000) mod 10
Lcd_Chr(1, 5, 48+ch0)
Lcd_Chr(1, 6, ".")
ch0 = (adc_rd0 div 100) mod 10
Lcd_Chr(1, 7, 48+ch0)
ch0 = (adc_rd0 div 10) mod 10
Lcd_Chr(1, 8, 48+ch0)
Lcd_Out(1, 9,"V")
Delay_ms(100)

' Current positive
' Measure
tlong11 = tlong1 - tlong22
tlong1 = tlong11 >> 10
if ch1 = 0 then
Lcd_Out(1, 11," ")
else
Lcd_Chr(1, 11, 48+ch1)
end if
ch1 = (adc_rd1 div 1000) mod 10
Lcd_Chr(1, 12, 48+ch1)
Lcd_Chr(1, 13, ".")
ch1 = (adc_rd1 div 100) mod 10
Lcd_Chr(1, 14, 48+ch1)
ch1 = (adc_rd1 div 10) mod 10
Lcd_Chr(1, 15, 48+ch1)
Lcd_Out(1, 16,"A")
Delay_ms(100)

' Voltage negative
' Measure
tlong22 = tlong2
tlong2 = tlong2 >> 10
if ch2 = 0 then
Lcd_Out(2, 4," ")
else
Lcd_Chr(2, 4, 48+ch2)
end if
ch2 = (adc_rd2 div 1000) mod 10
Lcd_Chr(2, 5, 48+ch2)
Lcd_Chr(2, 6, ".")
ch2 = (adc_rd2 div 100) mod 10
Lcd_Chr(2, 7, 48+ch2)
ch2 = (adc_rd2 div 10) mod 10
Lcd_Chr(2, 8, 48+ch2)
Lcd_Out(2, 9,"V")
Delay_ms(100)

' Current negative
' Measure
tlong3 = tlong3 >> 10
if ch3 = 0 then
Lcd_Out(2, 11," ")
else
Lcd_Chr(2, 11, 48+ch3)
end if
ch3 = (adc_rd3 div 1000) mod 10
Lcd_Chr(2, 12, 48+ch3)
Lcd_Chr(2, 13, ".")
ch3 = (adc_rd3 div 100) mod 10
Lcd_Chr(2, 14, 48+ch3)
ch3 = (adc_rd3 div 10) mod 10
Lcd_Chr(2, 15, 48+ch3)
Lcd_Out(2, 16,"A")
Delay_ms(100)

wend
end.

Posted on: April 18, 2013, 04:01:26 04:01 - Automerged

Paul, I do not ignore you, but I do not want the ICL chips. I have some 7107, but not yet decided what to do with them. Anyway, your very first post I found it useless (at the first sight - sorry for that!!!), but you have to know that the program changes I made (see above) are due to your suggestion to take a look at the link you gave. Thanks!
 Logged

Interested and hopefully helpful in: DC brushed motor control (mainly R/C - PPM/PWM), analog audio, PIC (mikrobasic PRO). Feel free to ask, and if I can, I will help. But only on forum topics, any started private conversation will continue in a public topic.
max
Active Member

Offline

Posts: 223

Thank You
-Given: 603

 « Reply #12 on: April 20, 2013, 12:08:40 00:08 »

See the attached file for the high side current shunt amp.
 Logged

Fate arrived and made the conscious unconscious It silenced the activity of life.
kentar
Newbie

Offline

Posts: 25

Thank You
-Given: 45

 « Reply #13 on: April 20, 2013, 02:37:08 14:37 »

For better results , you can use a vref ic like mcp1525 or 1541 as vref instead of vcc
In this case you can increase the resolution of your measurement
Get more counts (50) at adc and use  the average value .
 Logged

Warned
thunderer
Junior Member

Offline

Posts: 54

Thank You
-Given: 18

I try to be patient

 « Reply #14 on: April 21, 2013, 03:43:51 03:43 »

See the attached file for the high side current shunt amp.
I used a differential opamp just like the one you proposed. I changed my reference to 0V (GND of the PSU) - and now have 2 differential opamps for both high and low sides. And supplied it +5/-5V. I need to do some touch-ups and move it from air-wired to final position in the PSU.
 Logged

Interested and hopefully helpful in: DC brushed motor control (mainly R/C - PPM/PWM), analog audio, PIC (mikrobasic PRO). Feel free to ask, and if I can, I will help. But only on forum topics, any started private conversation will continue in a public topic.
 Pages: [1]