Professional Documents
Culture Documents
ArduPicLab - 4-20 Ma Current Output For Arduino Uno
ArduPicLab - 4-20 Ma Current Output For Arduino Uno
This blog is dedicated to electronic projects and software due to the author’s
enthusiasm for these activities. The main aim is to share to other enthusiasts the
experience in electronic design of the author who disclaims all responsibility. All
presented projects are realized and fully tested by the author who intends to
preserve the intellectual property of the projects or information, whose utilization is
intended only for non-professional purposes.
Select Language
Powered by Translate
Last year I had designed a circuit suitable only for Arduino Due, this new work makes use of a common
Arduino Uno or similar to create a standard 4-20 mA analog output.
Arduino Uno, or systems based on the ATmega328 chip has no a true analog output. The easiest way is
to use one of the PWM outputs and filter the signal with a passive RC filter to obtain an analog signal
proportional to the duration of the pulses. This expedient creates a considerable noise due to the
frequency of the PWM itself. To eliminate the noise I used a second order active low-pass filter, Sallen-key
type. The frequency of the Arduino PWM (with 16 MHz clock) on pin 9 is about 490 Hz, so I used a very
low cutoff frequency (11 Hz) but with a bandwidth sufficient for the majority of industrial controls.
By connecting the filter directly to the PWM output is obtained a signal which varies from 0 to 5 V which
would give an output current of 0 to 20 mA. The pulses duration is programmed with a word of 8 bits,
losing 1/5 of the full scale. To improve the current resolution from 20/255 to 16/255, I modified the
minimum amplitude of pulses from 0 to 1 volts, giving at the output a 4 to 20mA current. The block
diagram is shown in figure 1.
Figure 2 shows the complete diagram of the circuit. To obtain pulses from 1 to 5 volts I had to use a 1 V
source realized with U1A and the transistor Q1 that works as a switch. The operational U1B operates as a
separator; the filter uses U1C and the voltage / current converter uses U1D and Q2.
The transistor Q1 inverts the PWM signal, so the software must complement the number of PWM duty
cycle.
The trimmer pot Rp1 is used to adjust the minimum output current (4 mA) and the Rp2 to adjust the
maximum (20 mA). The theoretical value of the emitter resistor is Re = 5/0.02 = 250 W, but that does not
take into account the tolerances of the voltage supply of Arduino and of the resistors.
The resistor R8 is used as U1D output current limiter in the situation of absence of load.
A step down converter is a good solution for powering the system because of the 24 V, this value can be
varied from 12 to 30 V, depending of the load circuit.
Arduino Uno has a +5 V output pin, It does not recommend using it as a power input inasmuch this
would be in parallel with the internal regulator but it can be powered at +5V using the USB connector,
other boards as Arduino Pro Mini, have a +5 V input.
Hardware components
1x Arduino board,
1x Step-down switching converter,
Components list
R1= 27 kW ±5% R2= 47 kW ±5% R3= 10 kW ±5% R4= 27 kW ±1% metal film
R5= 6.2 kW ±1% metal R6= 100 kW ±1% metal R7= 100 kW ±1% metal R8= 1 kW ±5%
film film film
R9= 270 W ±1% metal R10= 1.8 kW ±1% metal Rp1= 1 kW trimmer Rp2= 10 kW trimmer
film film
C1= 100nF Mylar C2= 100 nF Mylar C3= 200 nF Mylar C4 = 10 MF,50V
Electrolytic
C5 = 100 nF Mylar U1= LM324 quad op amp Q1 = 2N3904 or eq. Q2= 2N2219A or eq.
The capacitors used for the filter must be measured with a capacimeter, for my prototype I selected for C3
some 220 nF capacitors to search for a value that approached 200 nF and C2 have selected a value half
of C3. Q1 is a transistor that must have a low Vce(sat.) and Q2 must have a current gain of at least 100
and a Vceo of at least 40V with a minimum power of 500mW.
The operational amplifier U1 must be suitable also for single-rail power supply, such as LM324.
The components layout of my prototype is shown in Figure 3, the resistor on the top is a precision load
used for calibra on of the system. Q2 has a small heat sink because, with at 20 mA and a low voltage
load, as in this case, dissipates: (24-3-5) *0.02 = 320 mW. In these circumstances is be er to reduce the
24 v.
#include <LiquidCrystal.h>
void setup() {
pinMode(PWMpin, OUTPUT); // sets the pin as output
lcd.begin(16, 2);// set up number of columns and rows
lcd.setCursor(0, 0);// set the cursor to column 0, line 0
lcd.print("Stalker PWM test");// Print a message to the LCD
}
void loop() {
val = analogRead(analogPin) >> 2;// 10 to 8 bit conversion
analogWrite(PWMpin, val);
lcd.setCursor(0, 1);
lcd.print(spacestring);
lcd.setCursor(0, 1);
lcd.print(val);
delay(500);
}
I reported on the spreadsheet the PWM values and the measurements in volts made on a precision
resistor (150 W ±0.5%) that worked as a load,. The PWM / output current diagram is shown in Figure 4.
I have questions, what potentiometer connected to A0? i dont see it on the schematic. thanks
Reply
Mr. Giovanni,
please ignore my previous question. I have new question. When AO is 0 V the output is 20 mA, when A0 is
5 V the output is 4 mA, how to invert it?
Regards
Reply
Replies
Hi Yogie,
the answer to the first question is that you can use a linear potentiometer from 1 to 100 kilohms.
For the second question, just complement the value by including the statement:
val= 255-val;
Regards
Mr. Giovanni,
Thank you for the answers .. this potentiometer is connected to A0 input and power source, is
that correct?
Mr. Giovanni,
What if i am also want voltage output, instead current output?
I have a task to build 4 channel voltage output (1-5 V), and 4 channel current output (4-20 mA).
Please advise.
Regards
Mr. Yogie,
yes, the potentiometer cursor is connected to A0 and and the two ends are connected
respectively to ground and + 5V.
The 1-5V signal is available at the output of the amplifier U1C (pin 8).
Regards
Reply
Mr. Giovanni,
I tested the voltage signal on pin 8, U1C. It is a little bit higher than A0 input voltage.
Thank you
Reply
Mr.Yogie,
the output voltage is proportional to the input, but there are two conversions (ADC and PWM) and the
output resolution is only 8 bits. My program was just an example to test the system. Greetings
Reply
Mr. Giovanni,
Your circuit and test program is suitable for my project, it is what i am looking for. I wonder how you came
up with an idea to create that circut. Using your circuit, from single Arduino Board, i can generate multiple
current/voltage sources.
For my project, 8 bit is enough. So for Voltage source at Pin 8, i think i have to find a way, so that the output
is the same as the input.
Reply
Replies
Mr.Yogie,
I'm glad that my projects are useful to someone.
For a 0-5V out, the circuit is greatly simplified, you should connect the pin 5 of U1B to Arduino
D9. Also you need to remove: R1, R2, Q1, R4, Rp1, R5. U1a is no longer used. Regards
Reply
at pin 9 default frequency is 490Hz, but you can change to 3905Hz or to 31250Hz (see
http://playground.arduino.cc/Code/PwmFrequency )
Reply
I know it well, just change the divisor of the prescaler, but an optocoupler with slow switching times starts to
create problems. Now I'm testing a new project with 0-5V (or more) output range and a different
optocoupler.
Reply
Đơn Vị Ship Cấp Tốc Hàng Hóa Từ Việt Nam Sang Thái Lan Giá Thấp
Dịch vụ ship nhanh hàng hóa từ việt nam
Công ty giúp order hàng từ trên Taobao
Reply
Why did you choose a cut off frequency of 11Hz? I really don't understand that part.
Reply
Replies
Reply
Reply
Replies
Reply
Hi Lemi,
you can modify the output current by changing the resistors R9, R10, but the ratio remains 1:5. Yours
sincerely
Reply
Reply
ok.
R9 = 90 ohm
R10 = 450 ohm
Rp2 = 2.2 kohm
R4 = 18 kohm
R5 = 6.2 kohm
Reply
Reply
Reply
I do not know what's inside your gauge, maybe it's not even linear.
Try to increase the voltage, even if 24V should be sufficient.
Reply
Reply
for 10 ohm r9, circuit current max. 100 ma. so R10=50 ohm. what value for Rp2 ?
Reply
Don't change the circuit components. The problem is on your load. Test it with a resistor 100 ohm resistor
and an ammeter in series.
Reply
Reply
Reply
Reply
Unknown 3 September 2018 at 20:57
Q: How can i display the PWM reading as a current value on the LCD Screen. Thanks
Reply
Total Pageviews
78,328
About Me
Giovanni Carrera
Blog Archive
►
► 2020 (2)
►
► 2019 (2)
►
► 2018 (4)
►
► 2017 (1)
▼
▼ 2016 (6)
►
► September (1)
▼
▼ August (1)
4-20 mA current output for Arduino Uno
►
► July (1)
►
► June (1)
►
► May (2)
►
► 2015 (10)