Multimeter +

Dual input 24 bit Multimeter with USB interface, single channel 10 bit USB oscilloscope, PWM out, 2 Ch Data-logger, R, C, Digital sniffer.

Similar projects worth following
Being a frequent traveler I had pack a lot of equipment, making me a subject for a "random check" every time I board a plane. I have decided to make my own handheld multi-meter that will cover most equipment I use in the lab. I designed a board with a dual channel 24 bit ADC using PIC24FJ256GA110 microcontroller, high voltage analog front with overvoltage protection. PIC24F has a 500 ksps ADC, so I added a single channel o-scope that has 55 kHz (-3dB) bandwidth. It was almost too easy to add a simple PWM waveform generator since PIC24 has a PWM function. I also added circuits for resistance and capacitance measurements. For my digital tracing I added two channel, interrupt driven digital sniffer. A two channel 24 bit data-logger covers all the needs for data recording. I have automated AC/DC function, so I do not have to manually set DC or AC readings. The unit can be controlled by on-board push buttons or via a computer. All data can be streamed and display in real time on a

The following is the Multimeter+’s circuit block diagram:

Main page of the project, shows all connections between the different parts of the schematics diagram:

The instrument has two low frequency high voltage independent inputs for measuring signals and voltage levels below 1 kHz. On the block diagram above they are labeled as Input 1 and Input 2. The inputs are fully differential with over-voltage protection and filtering. Once the analog signal passed through the signal processing circuit it gets digitized by a 24 bit AFE (MCP3911). The MCP3911 is dual channel Analog Front End (AFE) containing two synchronous sampling Delta-Sigma Analog-to-Digital Converters (ADC), two PGAs, phase delay compensation block, internal voltage reference, modulator output block, and highspeed 20 MHz SPI compatible serial interface.

Voltage readings can be viewed on a built in LCD display or a PC user interface in real time. Input 2 can be set to measure currents up to 0.5A (I am working to increase the current range). When current measurement is selected the relay is switched to connect Rsh1 to the Input 2 terminal.

So far I was able to measure AC and DC voltages up to 120VAC, theoretically the instrument should work up to 220VAC or 310VDC.

There is a separate channel, o-scope, to view input signals up to 55 kHz with approximately 380 ksps on PC user interface. I am working on improving the sampling speed up to 500ksps. PIC24FJ256GA110 has 500ksps ADC converter, but because I have to manipulate and store data the effective sampling rate drops.

The following image shows the MCU circuit diagram:

PIC24FJ256GA110 100 Pin General Purpose Flash Microcontroller with Peripheral Pin Select.

Central to all PIC24F devices is the 16-bit modified Harvard architecture, first introduced with Microchip’s dsPIC® digital signal controllers.

Ideal for low power (<100nA standby current) and connectivity applications that benefit from the availability of multiple serial ports (3xI2C, 3xSPI), 4xUARTS, and 23 independent timers. Large amounts of RAM (16kB) memory for buffering and large (up to 256kB) Enhanced Flash program memory make it ideal for embedded control and monitoring applications. PPS (Peripheral Pin Select) aids in configuring the most efficient pin configuration of available I/O, and CTMU provides touch sensing support for up to 64 individual buttons.

  • Up to 16 MIPS performance
  • 16 x 16 Hardware Multiply, Single Cycle Execution
  • 12-bit x 16-bit Hardware Divider
  • C Compiler Optimized Instruction Set

Internal serial flash used by the built-in data-logger:

SPI bus used to transfer data from the MCU to the serial flash. The data-logger is currently under development.

The following image shows "Download Configuration" page of the data-logger:

There is a separate input for resistance and capacitance measurements.

The on-board pulse generator output can be used to test electronic circuits.

Digital sniffer is a work in progress, it will be used to trace digital signals.

Internal serial flash memory allows data recording internally for later data view.

Galvanically isolated full speed USB port is used for transfer data at 1.2 Mbit/sec from the Multemeter+ to PC user interface. The isolation reduces effects of measurement distortions introduced by a PC.

The Multimeter+ runs on a rechargeable Li-Ion battery and has an on-board charging circuit.

The charging circuit runs from a 12 VDC off-line converter. The main component is BQ24103RHLR Synchronous Switched-Mode, Li-Ion and Li-Polymer Charge-Management IC. U4 and U5 are used to monitor charging status of the battery. Battery status is displayed on the LCD display.

The expansion port that will be used for wireless communications and additional hardware, sensors.

Micro USB is used for serial communication between Multimeter + and a computer.

Measured values are displayed in real time. The following image shows a snapshot of a continuously running DVM (Digital Voltage Meter) page. On the image two small DC values are measured,...

Read more »

Adobe Portable Document Format - 1.09 MB - 05/19/2016 at 18:40



Applying basic nodal analysis on active circuits.

Adobe Portable Document Format - 159.83 kB - 02/16/2016 at 19:20


  • 1 × PIC24FJ256GA110 General Purpose Flash 16 Bit Microcontroller
  • 1 × MCP2200 USB-to-UART serial converter
  • 1 × MCP3911 2.7V to 3.6V dual channel Analog Front End (AFE)
  • 6 × LG L29K-G2J1-24-Z LEDs and Accessories / Light Emitting Diodes (LEDs)
  • 3 × EVQ-PSD02K Switches and Relays / Switches

View all 10 components

  • Digital Sniffer

    Roman07/02/2016 at 15:33 0 comments

    I am currently working on the Digital Sniffer. The following image show the interface schematics.

    Expansion Port:

    Signal is applied to Pin 1 of the SNSR1 connector. Pin 2 is the ground return. Signal is buffered and inverted by the Q43, NDS7002, MOSFET. D24 is used to protect Q43 from overvoltage condition. Passing the buffer, the signal is applied to PIN 93 MCU. RG14 is an interrupt pin CN81. CN81 is the Input Change Notification pin. The input change notification function of the I/O ports allows the PIC24FJ256GA110 family of devices to generate interrupt requests to the processor in response to a change of state on selected input pins. This feature is capable of detecting input change of states even in Sleep mode, when the clocks are disabled.


    Interrupt is initialized inside init_logic_analyzer() function.


    // <editor-fold defaultstate="collapsed" desc="Initialize CN82 on RG15 Interrupt">
        CNEN6bits.CN82IE    	= 1; // Enable interrupt on CN82 RG15 2N7002
        CNPD6bits.CN82PDE   = 0;    	// Pull down disable
        CNPU6bits.CN82PUE   = 0;    	// Pull up disable
        CNEN6bits.CN81IE    	= 1;    	// Enable interrupt on CN81 RG14
        CNPD6bits.CN81PDE   = 0;    	// Pull down disable
        CNPU6bits.CN81PUE   = 0;    	// Pull up disable
        IEC1bits.CNIE       	= 1;    	// Enable interrupt on pin change
        IFS1bits.CNIF       	= 0;    	// Clear the flag
        IPC4bits.CNIP       	= 4;    	// Interrupt priority 4  
        // </editor-fold>            
        flags = 13;         // Indicates that the Logic Analyzer has been initialized.    
    Once interrupt is initialized it is ready to read input from

    SNSR1 PIN1.

    OSCILLATOR data:

    Primary oscillator = 7.3728MHZ

    Phase Lock Loop:

    XTPLL = 4 x PLL = 7.3728MHZ x 4 = 29.4912MHz

    FCY = XTPLL/2 = 14.7456MHz. FCY is defined as XTPLL/2

    The processor clock source is divided by two to produce the internal instruction

    cycle clock, FCY.

    TCY = 1 / FCY = 1 / 14.7456MHz = 0.067817 us


    Figure 8-3 shows the sequence of events when a peripheral interrupt is asserted during a
    one-cycle instruction. The interrupt process takes four instruction cycles. Each cycle is numbered
    in Figure 8-3 for reference.

    The interrupt process takes four instruction cycles.

    TINTERRUPT = TCY * 4 = 0.067817 * 4 = 0.271 us

    FMAX-INTERRUPT = 1 / 0.271 us = 3.69 MHz

    Each instruction has Fetch and Execute parts. It takes TCY

    for each instruction (oscillator).

    It looks like I have 16 - 17 instructions in the ISR, then

    T = TINTERRUPT + 17 * 0.067817 = 1.017 us + 0.271 us = 1.363us

    Max input data-stream frequency is:

    FDATA = 1 / 1.363 = 0.7 MHz

    I have tested Multimeter+ with max frequency of 500 kHz. Its kind of slow for a logic Analyzer, but for a regular multimeter it adds value.

    The following code triggers on every CIN interrupt and shifts in a bit of data.

    // Global
    volatile WORD_VAL timer[8];
    extern volatile unsigned int  TMR1 __attribute__((__sfr__));
    volatile DWORD_VAL NmbrOfBits;
    volatile WORD_VAL TimeBase;
    volatile unsigned long ints;
    volatile unsigned char mask_l;                            
    void __attribute__((interrupt, no_auto_psv)) _CNInterrupt(void){
        // Time interval = Number of counts * Time of one count
        timer[0].Val = (WORD)(TMR1 * 68);            
        NmbrOfBits.Val = timer[0].Val / TimeBase.Val;
        TMR1 = 0;
        if (LAcntr < 2048){
            if (NmbrOfBits.Val == 0){
                goto skip;          // Skip all
            else if (NmbrOfBits.Val == 1){                       // 7 bits left 
                    // Input is inverted !_RG14 is actually _RG14.
                    // If RG15 is low set current bit to zero with mask_h = 0xFE
                    if (_RG14) {
                        voltage_msb[LAcntr] = mask_h;  // mask_h  is initialized to 0b1111 1110
                    } else { // If RG15 is high set current bit to one with mask_h = 0x01
                        voltage_msb[LAcntr] = ~mask_h; // ~mask_h = 0b0000 0001
            else if (NmbrOfBits.Val == 2){
                    // <editor-fold defaultstate="collapsed" desc="2 bit">   
                    mask_h = mask_h << 1; // 1111 1110 << 1 = 1111 1100
                    // Input is inverted !_RG14 is actually _RG14.
                    // If RG15 is low set current bit to zero with mask_h = 0x0b11111100
                    if (_RG14) { 
                        voltage_msb[LAcntr] = mask_h;  // mask_h << 1  = 0b1111 1100
     } else { // If RG15 is high set current bit to one with mask_h...
    Read more »

  • Testing AC powered equipment.

    Roman05/18/2016 at 20:18 0 comments

    Desk-top oscilloscopes are very common in engineering labs. They are the first aid help devices when wave-forms need to be viewed and analyzed. Taking reads from an AC powered equipment with oscilloscopes may create a low impedance short between an o-scope AC ground and equipment that is being tested. The ground clip on a o-scope is actually tied to the ground. In order to avoid this problem differential probes can be used, but they are costly. Multimeter + has two differential inputs that have 10 M-Ohm input impedance. Both of these inputs can be used to view wave-forms up to 1 kHz (-3dB). High input impedance guarantees that there will be no shorts introduces when taking measurements from an AC powered equipment.

    The USB port of the Multimeter + is electrically isolated from computer.

    Isolated USB ensures that there will be no interference introduced by a PC power supply.

    Typical application schematics:

    The input and output signals are separated by an isolation barrier.


  • Initializing serial communication with Multimeter + LabView UI

    Roman05/16/2016 at 17:40 0 comments

    DVM (Digital Voltage Meter) page:

    DVM (Digital Voltage Meter) shown above serial communication is initialized by running a series of LabView frames. The first frame shown in the image below searches for all enabled COM ports. If none is found it will return string “No COM port found” and the program will exit using “STOP” command.

    The following frame opens a serial communication with the

    selected COM port.

    Once the serial communication is established the program requests board ID from the attached Multimeter +.

    Multimeter + responds with current Board ID:

    void send_board_id(void) {

    The board ID is received and program continues to the next step.

    I give it 1000 ms delay before the main loop starts running.

    The next step is to run the main loop where data gets collected and displayed continuously.

    LabView Files Link.

  • Measuring Soil Resistivity with Multimeter +

    Roman05/10/2016 at 22:35 0 comments

    I was working with my son on his science project “Impressed Current Cathodic Protection in Presence of AC Interference.” Impressed current cathodic protection is used to protect pipes (oil, gas, water lines) from rapid corrosion. Rectifiers are used more than any other source of impressed current power. Cathodic protection is a method of supplying electrons to a pipe such that when chemical corrosion processes occur at the surface of a pipe the pipe will not shed any electrons, but rather the cathodic system will supply electrons from an external power source, rectifier. It is often a difficult task to determine just the right amount of protection. One of the critical components of the experiment is the soil resistivity. Soil resistivity determines the amount of current flow from pipe into the soil. Higher soil resistivity results in lower currents flow. Basically pipe will corrode faster in wet soil than in dry soils or sands. I needed to measure soil resistivity and regular multimeter gives Open Line because it supplies DC current to the soil and soil gets charged like a capacitor. Multimeter + on the other hand measured soil resistivity very accurately. The reason is that instead of supplying DC current, Multimeter + sends a sort pulse during which it takes resistance measurement. After the reading is taken, pulse value drops to zero potential and soil has enough time to discharge. Then the process is repeated.

  • Measuring low currents in presence of noise.

    Roman04/16/2016 at 03:08 20 comments

    Measuring low currents in presence of noise can be a challenge. In my device I use basic current sense configuration with a 1 Ohm shunt resistor and a differential amplifier feeding a 24 bit converter. The differential amplifier is set to gain = 1 to minimize noise and non-linear distortion.

    RF coupled noise in magnitude of a fraction of a millivolt distorts readings and causes fluctuation in hundreds of micro amps. Since noise creates outlier values some basic statistical analysis can applied. Taking average of a large number of readings helps to estimate measured value, but the arithmetic mean is affected by all of the data, not just any selection of it. This is a good characteristic in most cases, but it is undesirable if some of the data are grossly in error, such as ?outliers? that are appreciably larger or smaller than they should be. Median values reduces fluctuation and helps to compute an accurate reading. If all the items with which we are concerned are sorted in order of increasing magnitude (size), from the smallest to the largest, then the median is the middle item. Consider the five items: 12, 13, 21, 27, 31. Then 21 is the median. If the number of items is even, the median is given by the arithmetic mean of the two middle items. Consider the six items: 12, 13, 21, 27, 31, 33. The median is (21 + 27) / 2 = 24.
    Step 1 - take average of 2048 samples
    Step 2 - record 10 averages
    Step 3 - compute mean value of 10 averages.

    The following code snippet computes a mean value of 10 averages:

    if (cntr < 10){        
        vals[cntr] = voltage_val;// Collect data.
        cntr ++;                 // Global data counter   
        cntr = 0;
        for(i = 0; i < 10; i++) {// Calculating mean of 10 numbers          
            for(j = i+1; j < 10; j++) { // j is the next element of i
                    if(vals[j] < vals[i]) { // if(vals[i+1] < vals[i])           
                        temp = vals[i];
                        vals[i] = vals[j];
                        vals[j] = temp;
            voltage_val = ((vals[4] + vals[5]) / 2);

    Computing mean of 10 average values reduced readings fluctuations from +/-0.5mA to +/-0.06mA, which is a major improvement.

  • Data Record and Data Play

    Roman03/19/2016 at 14:45 0 comments

    Data Record and Data Play functions in LabVIEW.

    Data Record block diagram. Very simple :). Input data is "Voltage"

    Play Data block diagram. Also very simple diagram

    Play Data Front Panel. Play data file can be downloaded here.

  • Input Wiring and Coding

    Roman03/11/2016 at 00:03 0 comments

    Simplified input diagram.

    The embedded code size currently is close to 154 k-bytes (153981). It becomes a little tough to maintain and develop further. I have decided to develop a set of library functions to make it easier to develop code and test the unit. The following is an example of using TstAndResetVoltDiv() library function. This function takes care of verifying currently set input voltage dividers.

    #include  "math.h"
    main {
    switch( selection )
    case 1: case 2:
    //Set switch variable for the execute_function()
    rx_function = 13;
    //Starts measurement cycle and collects data samples.
    //Wait until all data is collected
    while (!buffer_full) {}      
    * Function TstAndResetVoltDiv() is a library function. It is the first function called in the main() when
    * selection switch is set to 1 or 2.
    * This function runs continuously, it reads applied voltages witha previously selected voltage 
    * dividers.
    * If the measured voltage is within the
    range, the previously selected divider values will be used
    * and displayCH0CH1() function will re-display
    the updated, more accurate, voltage readings.
    TstAndResetVoltDiv(cflag,rng_srch,c_smple_sum,current_sum_n,curre            nt_sum_p,cal,
                CH1vsftSgn,CH1vshft,dividerCH1,vflag,v_smple_sum,volt            age_sum_n,voltage_sum_p,

  • Working on accuracy

    Roman03/08/2016 at 20:08 0 comments

    Have 2% error in mV range (bad). Volt range seems to be ok.

  • Struggling with 3D modeling

    Roman02/29/2016 at 19:58 0 comments

    I have imported step files for my 1553 case as well as the PCB and aligned them together. Now I need to make all the cutouts for pushbuttons and the LCD. I have created a circle sketch, shown in red color, and tried to make a pocket with

    And I get

  • RMS

    Roman02/27/2016 at 03:33 0 comments

    Root mean square (RMS) is a fundamental measurement of the magnitude of an AC signal. Defined practically, the RMS value assigned to an AC signal is the amount of DC required to produce an equivalent amount of heat in the same load. Defined mathematically, the RMS value of a continuous signal V(t) is defined as:

    For time sampling signals, RMS calculation involves squaring the signal, taking the average, and obtaining the
    square root

    I use equation 2 to compute RMS value of the incoming AC signal. When AC input is detected the instrument
    collects 2048 samples of data if both channels are running or 4096 samples for a single channel. The data gets
    processed according to equation 2 and RMS value is computed. The following is INT2 interrupt routine to compute sum of squares. The interrupt is triggered on data ready pulse from MCP3911.

    void __attribute__((interrupt, no_auto_psv)) _INT2Interrupt(void) {
     union {
     unsigned long nvoltage; // Negative values
      struct {
       unsigned char voltLSB : 8;
       unsigned char voltNSB : 8;
       unsigned char voltMSB : 8;
       unsigned char voltd : 8;
     } negative;
     unsigned long voltage_sum_p_sqr;
     // Compute sum of squares
     voltage_sum_p_sqr =voltage_sum_p_sqr+(negative.voltMSB * negative.voltMSB);

    Most of AC measurement from my experience are high in amplitude, usually in Volts. So, using only MSB
    byte of the 24 bit value gives me good resolution for all of the AC measurements. Once sum of squares is calculated Vrms is computed using equation 2.

    v_smple_sum = (voltage_sum_p_sqr / buffer_lenght);
    RMS = sqrtl((long double) v_smple_sum);

View all 15 project logs

  • 1
    Step 1

    The following image is a snapshot of running 24 bit DMM UI page. The display gets updated every 1.2 seconds, it takes approximately 1.2 sec to collect all data samples. Left Input is connected to DC supply, Right Input connected to an AC line. AC needs to be calibrated.

    Refresh delay in milliseconds. It is the delay time between reads. The image displays 41 milliseconds delay. Number of data points shows how many values have been received (each value is 24 bit).

    Zoom in to the displayed waveform. Expands the waveform in time axis.

    Send sampling rate to ADC. Currently sampling rate can be set to 3560 samples/second or 57000 samples/second.

    DC filter helps to fight noise. Auto / Manual sets how the unit will set a voltage range. Auto will make the unit test applied voltage and select an appropriate voltage range. Manual will allow a user to set the voltage range.

    Manually set voltage ranges: +/0.6V, +/-18V, +/-110V, +/-450V

    If you need to store current reading, just click on “Store”

    Input 2 display window. Input 2 shows a -0.26V DC offset measured on 118.57 VAC line.

    All LabVIEW files you can be downloaded in zip format from the LabVIEW link. Sorry for the mess in my files. I am trying to organize my C source code files, but it might take a while.

View all instructions

Enjoy this project?



Rik Vervenne wrote 07/10/2021 at 15:52 point

Is this project still alive somewhere? Are the software and pcb files available? ECADfiles?

  Are you sure? yes | no

Roman wrote 09/22/2017 at 23:35 point

Thank you for your kind comments. For most part it works fine. I have some voltage fluctuations in mV range, about 0.5mV. This makes it somewhat difficult to measure current in mA range. There is also an issue with USB ground loop. I used a galvanic isolation chip to isolate  my UART from USB ground, but it is not sufficient for high precision measurement. USB ground have a small effect on my readings. To fight it I have to run my laptop on the battery to get accurate results.

Your projects are very impressive.

  Are you sure? yes | no

David H Haffner Sr wrote 09/22/2017 at 23:06 point

Oh man, I am most humbled by this project, my little PLX-DAQ data logger is rather arcane compared to something so eloquent as this :)

  Are you sure? yes | no

Roman wrote 09/22/2017 at 23:37 point

Thank you for your kind comments. For most part it works fine. I have some voltage fluctuations in mV range, about 0.5mV. This makes it somewhat difficult to measure current in mA range. There is also an issue with USB ground loop. I used a galvanic isolation chip to isolate  my UART from USB ground, but it is not sufficient for high precision measurement. USB ground have a small effect on my readings. To fight it I have to run my laptop on the battery to get accurate results.

Your projects are very impressive.

  Are you sure? yes | no

David H Haffner Sr wrote 09/23/2017 at 09:32 point

Ha, the common ground problem, it plagues my current project also, trying to isolate signal ground from common ground, it effects SNR considerably. Believe it or not, one of my problems was my power supply, I was running it off a PWR strip connected to a fan cooling me off this summer and didn't realize since the PWR strip was not grounded properly the buzzing from the fan was effecting the signal.

There is something you may want to try, its called the adum4160 chip, its a usb isolation chip, it will create a new ground reference on the device side which will break any ground loop and remove the noisy ground. 

Hope this may help with your dilemma :)

  Are you sure? yes | no

Roman wrote 09/23/2017 at 19:51 point

ADuM4160 is definitely a better fit.  Built in transformer technology is what is needed.

Thank you.

  Are you sure? yes | no

Roman wrote 06/27/2016 at 18:32 point

Nice circuit, I can see it works perfect for AC coupled configurations. I am not sure if it works for DC coupled circuits. I want to see if I can adapt it to the DC coupled configurations.

Thank you.

  Are you sure? yes | no

K.C. Lee wrote 06/27/2016 at 19:37 point

Just D3/D4,D1/D2,R4/R5 are needed for the protection.  I pull that picture out of google.  For additional channels, just need to add more diode D1/D2 to the existing zener diodes.

It can be used for DC coupled.  I used something like this for my University project.  It was then I went into the same issue.  The old technician told me that I need to pre-bias my Zener diodes.

  Are you sure? yes | no

Roman wrote 06/27/2016 at 16:45 point

You are absolutely right, they do leak. I am using ESD9R3.3S ESD Protection Diodes with Ultra−Low Leakage: They still leak a little. It is especially prominent on the lowest voltage range setting +/- 0.6Vmax. That is one of the reasons I have to calibrate the unit. There other sources of error as well. I am not sure if I can see how to use the external switching diodes. I have never used pre-biased Zener diodes. I need to research it. thank you for your advice, I will look it up.

  Are you sure? yes | no

K.C. Lee wrote 06/27/2016 at 17:23 point

Something like this with the R4/R5 pre-biasing the zeners.  D1/D2 are the switching diodes that steer the input into the zeners.

less than 1nA is actually pretty impressive.  Still hard to beat low leakages diodes.  e.g. BAS416 with 3pA.

  Are you sure? yes | no

K.C. Lee wrote 06/27/2016 at 16:18 point

Zener diodes have a very bad habit of conducting well before their rated voltage.  The small leakages would affect the front end with 10M series resistors.

You can use on external low leakage switching diode to the supply rails or to pre-biased Zener diodes + decoupling caps.  i.e. Zener diodes with series resistors to the supply so that they are already conducting.

  Are you sure? yes | no

Roman wrote 04/21/2016 at 18:50 point

Hi, I have decided to change the name of the project to Multimeter+. It was way too long.

  Are you sure? yes | no

Comedicles wrote 04/16/2016 at 21:07 point

Very cool and nice to see a project like this executed and working. Especially a good analog front end! Any trouble with patents? There are a pile of patent holders on this stuff who are still active. I had one that has expired. We never went into production because of large companies who had later patents but LOTS of money and legal teams.  We were going to call it something like "Desktop Instrumentation" because it was going to originally use Apple Desktop Bus. Final prototypes networked with RS485. The hardware world was a different space back then. So, natural question: What do you think of using more than one of your meters at a time to do a full suite of measurements, like current, voltage, resistance as in strain guage, etc at the same time?

  Are you sure? yes | no

Roman wrote 04/17/2016 at 06:23 point

Thank you for your positive review. I am planning on making this project an open source. I am working on an API library to make code development for this device easier. Once I finalize the hardware and have all code developed I am thinking to release it.

  Are you sure? yes | no

Roman wrote 04/16/2016 at 19:08 point

Based on Jaromir's advice, jaromir.sukuba, I have updated my circuit board with current limiting resistors on the MCU page. They help to reduce current flow from filtering capacitors when a push button is pressed. New file has been uploaded to the "Current schematics files and updates" link.

  Are you sure? yes | no

Roman wrote 02/20/2016 at 03:07 point

Hi, if you following this project, I just posted under "instructions" a brief description of the first page "DMM" GUI. More to come.

  Are you sure? yes | no


[this comment has been deleted]

Roman wrote 02/16/2016 at 02:24 point

I agree my UI needs A LOT of work and improvements. There is a bunch of buttons and menus that allow a user (me) to change settings of the instrument and send control commands. For example you (I) can select to take voltage measurements on one channel or read data from both inputs. The sampling rate can be set on the fly from UI. There is a switch that switches between manual voltage range selection and Auto ranging. I also added a basic Low pass filter. There are windows and controls that I use for debugging my code. Not everything works as it suppose to.

There are separate pages for O-scope, Data-logger, Digital sniffer. I am working on R, C page and some other stuff (sensors, calibration and such). I think I need to shoot a few videos and then hopefully get a feedback about the UI and how to change it. On board pushbuttons call different menus for example current, resistance, capacitance, power measurements, and more.

Current measurements are difficult. I have an internal 1 Ohm 0.1% shunt, which allows me to make measurements up to 1 A at this time (I know it is low for a multimeter). On the low side I was hoping to get into micro-Amp range with my 24 bit converter. Noise gets in the way. I am trying to come up with an algorithm that will allow me to remove outliers. There is useful data in the measurements but it needs to be extracted. I am working on it. It is fun :).

Basically, I am able to measure in mA range up to 1A with the same accuracy as my voltage reads.

  Are you sure? yes | no

Roman wrote 02/15/2016 at 16:08 point

Hi, I just updated and uploaded schematics for the alpha numeric LCD to my Google Drive. It is under Current schematics and updates link.

looking forward for your comments.

  Are you sure? yes | no

jaromir.sukuba wrote 02/14/2016 at 20:24 point

Looking at your schematics - it looks professional, but my eyes hurt when I see capacitor connected directly across mechanical switch contacts - C23, C28, C29 on CPU part of schematics. You better add at least 100Ohm resistor in series with switch, otherwise its life expectancy will be shorter due to current spikes from charged capacitor.

Is R75 needed? It will not hurt, probably, but I've never used parallel resistor across crystal pins on PIC24 devices and AFAIK datasheet doesn't mention this.

  Are you sure? yes | no

Roman wrote 02/14/2016 at 20:40 point

You have a good point about the capacitors. I use them to filter out noise generated by the switches. It is definitely something to think about. Adding a series resistor will help to reduce the inrush current flowing into the capacitors. Switches are big, but still it something to consider. Thank you for pointing it out. R75 is not required, I need to verify if I actually installed it. I believe R75 is there to reduce gain of the inverter, but I see now did not installed it. 

  Are you sure? yes | no

jaromir.sukuba wrote 02/14/2016 at 21:22 point

And another question: What is the function of D9 and D13 diodes around MCLR pin?

If you are not using the shutdown feature of MCP1825 (U16 on power circuit), you may consider using some lower-Iq regulator, like my all-time favourite MCP1702, not sure if the power requirements are OK for this, though. Perhaps the same applies for U10, U11.

Anyway, the more I look at it, the more I like this project.

  Are you sure? yes | no

Roman wrote 02/15/2016 at 14:35 point

The pin RD7 currently is not used, but I thought I might need to use it for something. The SMD resistor footprint allows me to make a connection with a wire to the pin. So, the resistor is not installed. A lot of good points, on the review. How would you connect MCLR pin?

  Are you sure? yes | no

Roman wrote 02/14/2016 at 23:07 point

The diodes help to keep MCLR in reset during power up, but they are not critical. The reason why I used MCP1825 is because I have used it before on another project. I need to look at MCP1702 datasheet. There is no special requirements for the power,  it might work just fine. 

Thank you, I am happy I'm not the only person interested in test and measurement devices. 

  Are you sure? yes | no

Roman wrote 02/15/2016 at 04:11 point

Hi again, I believe the diodes are there to guarantee that the voltage on MCLR will be below Vcc and above Vss only by a diode drop  (0.6-0.7V) at any given time during the power up. A diode has a very low internal capacitance. This should keep MCLR in reset untill Vcc stabilizes and stops to fluctuate. I didn't design it, this circuit was in one of the datasheets or user guides for the MCU. I know I copied it from somewhere. 


  Are you sure? yes | no

jaromir.sukuba wrote 02/15/2016 at 10:13 point

Keeping part in reset until VCC stops fluctuating is job for internal BOD/POR circuit and external diodes doesn't seem to affect this much, at least for me. Adding external POR circuit will not hurt - it is single SOT23 package. The diodes seems not necessary to me.

Another question: what is the purpose of R211 on RD7 pin of MCU?

  Are you sure? yes | no

Roman wrote 02/12/2016 at 16:11 point

Hi everyone, I just updated and uploaded 2 cell Li-ion charger schematics for my handheld device. It is on Google Drive the link is Current schematics files and updates.

  Are you sure? yes | no

Roman wrote 02/10/2016 at 22:20 point

Hi if you following this project, I just posted a couple of pictures that show readings on the handheld compared to Fluke 45. Based on the pictures it looks to me that I need to level the zero volt reading a little lower. 

  Are you sure? yes | no

Roman wrote 02/02/2016 at 04:15 point

Just verified the -3dB frequency on the o-scope and it appears to be 55kHz. I use Lab view software filters to play with testing signals. I set the low pass filter -3dB point at 22kHz, so it looked like my o-scope has 22kHz bandwidth. What frequency range you are working with?

  Are you sure? yes | no

sdwhwk wrote 01/31/2016 at 16:57 point

Finally someone thought of this! I'm just starting to get into the heart of electronics ( been doing pick and placing for years, now I want to get into actually testing and diagnosing). There's a trillion devices out there and not only are they bulky to carry (as you stated) but get very expensive. So from all of us beginners out there, thank you.  This should be fun to build AND enhance quality of future projects for the hobbyist and students

  Are you sure? yes | no

Roman wrote 01/31/2016 at 17:23 point

Hi, thank you for your positive comment. My goal is to make the multimeter as versatile as it possible. I am also trying to make it relatively inexpensive. I am currently working on second revision of the PCB board, trying to reduce the cost. As with most of hardware products out there the cost significantly depends on the quantities produced. Hopefully I can make it affordable for everyone.

  Are you sure? yes | no

Roman wrote 01/31/2016 at 14:30 point

Yes, I am planning to make it open source. I need to get my files in order before the release. I am working on calibration program. At this pont most of measurements, except resistance, are about 0.25 - 0.5 %. Resistance is all over the place. Once I get my cal program running  I am hoping to get better than 0.5% on all measurements.

  Are you sure? yes | no

jaromir.sukuba wrote 01/31/2016 at 09:06 point

This one looks interesting. Looking forward to see verification against known good DMM or voltage/resistance standard.

Are you going to release more construction details and sources?

  Are you sure? yes | no

Similar Projects

Does this project spark your interest?

Become a member to follow this project and never miss any updates