Author Topic: Milliohm meter Picuino  (Read 1050 times)

0 Members and 1 Guest are viewing this topic.

Offline PicuinoTopic starter

  • Super Contributor
  • ***
  • Posts: 1033
  • Country: es
    • Picuino web
Milliohm meter Picuino
« on: May 12, 2024, 08:25:03 pm »
In this thread I am going to post the results of an active and reactive milliohm measuring device that I have developed in this other thread:
https://www.eevblog.com/forum/projects/homebrew-lock-in-amplifier/

Characteristics:
Measuring: resistance, capacitance and inductance with ESR.
Operating principle: Synchronous detection of a triangular signal of 512Hz and 1mA
Full scale: 2000 milli Ohms approx
Resolution: 0.1 milli Ohms
Kelvin connection (4 wires sense)
Arduino Nano powered.
Single 5V power supply.
Measurements are sent via USB to a computer. (Pending the addition of an LCD display).

Open source hardware and software.


Tasks to do:
1. Calibrate the instrument and check its linearity, accuracy, etc.
2. Select a cheaper instrumentation amplifier.
3. Add a signal input protected against charged capacitors.
4. Extend the measurement range.


Arduino Program:
Code: [Select]
/*
   Version 5.0 (12/05/2024)

   Copyright 2024 Picuino

   Permission is hereby granted, free of charge, to any person obtaining a copy
   of this software and associated documentation files (the "Software"), to deal
   in the Software without restriction, including without limitation the rights
   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
   copies of the Software, and to permit persons to whom the Software is
   furnished to do so, subject to the following conditions:

   The above copyright notice and this permission notice shall be included
   in all copies or substantial portions of the Software.

   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
   FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
   IN THE SOFTWARE.
*/
#include <stdint.h>

#define CLK_BOARD  16000000
#define UART_BAUDS  115200
#define MEASURE_TIME  1.0

#define PIN_SIGNAL_OUT 3
#define PIN_ANALOG  A6
#define PIN_ANALOG_MUX 6
#define PIN_DEBUG_OUT 6


#define SAMPLES_16

#ifdef  SAMPLES_16
#define SAMPLES_PER_WAVE 16
#define ADC_PRESCALER (0b111)

#define TIMER2_PERIOD  244
#define TIMER2_FREQ  (CLK_BOARD / (1.0 * TIMER2_PERIOD * 64 * 2))

#define TIMER0_PERIOD (244 - 1)
#define TIMER0_PHASE_ADJUST (0.40)
#define TIMER0_FREQ  (CLK_BOARD / (1.0 * (TIMER0_PERIOD + 1) * 8))

#define SAMPLES_PER_MEASURE (SAMPLES_PER_WAVE * (long) ((MEASURE_TIME) * (TIMER0_FREQ) / SAMPLES_PER_WAVE))

const float BOARD_CALIBRATION = 0.2410 / (SAMPLES_PER_MEASURE);  // Converts measure to milliohms
const float BOARD_PHASE_ADJUST = -0.079;  // Radians adjust
const float BOARD_ADDED_RESISTOR = 0.0;  // Board probes resistor in milliohms. Sistematic Error

const int16_t SIN_INTEGER[SAMPLES_PER_WAVE + SAMPLES_PER_WAVE / 4] = {
  12, 34, 51, 60,
  60, 51, 34, 12,
  -12, -34, -51, -60,
  -60, -51, -34, -12,
  12, 34, 51, 60,
};
#endif


volatile int32_t adc_acc_inphase;
volatile int32_t adc_acc_quadrature;
volatile int32_t adc_samples;
volatile uint8_t adc_measuring;
volatile uint8_t level_state;
volatile uint8_t level_state_old;

float impedance_inphase;
float impedance_quadrature;
float impedance_sign;


void setup() {
  Serial.begin(UART_BAUDS);

  // Set up output reference signal pin
  pinMode(PIN_SIGNAL_OUT, OUTPUT);
  pinMode(PIN_DEBUG_OUT, OUTPUT);

  // Print initial info
  print_info();

  // Set up peripherals
  timer0_setup();
  timer2_setup();
  timer_synchronize();
  adc_setup();

  // Inits measure
  measure_init();
  while (adc_measuring == 1);
  measure_init();
}


void loop() {
  // Main Loop
  while (1) {
    if (adc_measuring == 0) {
      read_float_values();
      phase_adjust();
      print_values();

      measure_init();
    }
  }
}


void read_float_values(void) {
  // Read accumulator values
  impedance_inphase = -adc_acc_inphase;
  impedance_quadrature = -adc_acc_quadrature;

  // Rescale values
  impedance_inphase *= BOARD_CALIBRATION;
  impedance_quadrature *= BOARD_CALIBRATION;
}


void phase_adjust(void) {

  // Get impedance sign
  if (impedance_quadrature > 0) {
    impedance_sign = 1;
  }
  else {
    impedance_sign = -1;
  }
  impedance_quadrature = abs(impedance_quadrature);

   
  // Phase adjust
  float module = sqrt(impedance_inphase * impedance_inphase + impedance_quadrature * impedance_quadrature);
  float phase;
  if (abs(impedance_inphase) < 0.1) {
    phase = 90;
  }
  else {
    phase = atan(impedance_quadrature / impedance_inphase);
  }
  phase *= impedance_sign;
  phase += BOARD_PHASE_ADJUST;
  impedance_inphase = module * cos(phase);
  impedance_quadrature = module * sin(phase);
 
  // Get new impedance sign
  if (impedance_quadrature > 0) {
    impedance_sign = 1;
  }
  else {
    impedance_sign = -1;
  }
  impedance_quadrature = abs(impedance_quadrature);
 
  // Substract board resistance (sistematic error)
  impedance_inphase -= BOARD_ADDED_RESISTOR;
}



void print_info(void) {
  Serial.println();
  Serial.print("SAMPLE_FREQUENCY = ");
  Serial.print(1.0 * TIMER0_FREQ);
  Serial.println(" Hz");

  Serial.print("MEASURE_SIGNAL_FREQUENCY = ");
  Serial.print(1.0 * TIMER2_FREQ);
  Serial.println(" Hz");

  Serial.print("SAMPLE_TIME = ");
  Serial.print(1.0 * SAMPLES_PER_MEASURE / TIMER0_FREQ);
  Serial.println(" s");
}


void print_values(void) {
  Serial.print(impedance_inphase, 1);
  Serial.print("\tmOhm R  \t");

  if (impedance_sign > 0) {
    Serial.print(impedance_quadrature, 1);
    Serial.print("\tmOhm Z_L \t");
    if (impedance_quadrature > 5.0) {
      Serial.print(impedance_quadrature * 1000.0 / (TIMER2_FREQ * 2.0 * 3.1415927));
      Serial.println("\tuHenrys");
    }
    else {
      Serial.println();
    }
  }
  else {
    Serial.print(impedance_quadrature, 1);
    Serial.print("\tmOhm Z_C \t");
    if (impedance_quadrature > 5.0) {
      Serial.print(1000000000.0 / (impedance_quadrature * TIMER2_FREQ * 2.0 * 3.1415927));
      Serial.println("\tuFarads");
    }
    else {
      Serial.println();
    }
  }
}


void adc_setup(void) {
  analogRead(PIN_ANALOG);
  cli(); // Stop interrupts

  ADMUX = (1 << 6) |
          (0 << ADLAR) |
          (PIN_ANALOG_MUX << 0);
  ADCSRA = (1 << ADEN) |
           (0 << ADSC) |
           (0 << ADATE) |
           (0 << ADIE) |
           (ADC_PRESCALER);  // Division factor
  ADCSRB = 0x00;

  sei(); // Allow interrupts
}


void measure_init(void) {
  delayMicroseconds(1000);
  cli();
  adc_acc_inphase = 0;
  adc_acc_quadrature = 0;
  level_state = SAMPLES_PER_WAVE * 0.25;
  level_state_old = 0;
  adc_samples = 0;
  ADCW = 0;
  sei();

  while ((PIND & (1 << PIN_SIGNAL_OUT)) != 0);
  while ((PIND & (1 << PIN_SIGNAL_OUT)) == 0);
  adc_measuring = 1;
}


void timer0_setup(void) {
  cli(); // Stop interrupts

  // set compare match register
  TCCR0A = (0 << 6) | // OOM0A. 0=OC0A disconnected. 1=Toggle OC0A on compare match (p.84)
           (0 << 4) | // COM0B. 0=OC0B disconnected. 1=Toggle OC0B on compare match (p.85)
           (2 << 0);  // WGM0.  PWM mode. 1=phase correct 2=CTC  (p.86)
  TCCR0B = (0 << 7) | // FOC0A.
           (0 << 6) | // FOC0B.
           (0 << 3) | // WGM02.
           (2 << 0);  // CLOCK source.
  OCR0A = TIMER0_PERIOD;
  OCR0B = TIMER0_PERIOD / 2;
  TIMSK0 = (0 << 2) | // OCIE0B. Match B Interrupt Enable
           (1 << 1) | // OCIE0A. Match A Interrupt Enable
           (0 << 0);  // TOIE0. Overflow Interrupt Enable
  TIFR0 = 0;
  TCNT0 = 0; // Initialize Timer0 counter

  sei(); // Allow interrupts
}


void timer2_setup(void) {
  cli(); // Stop interrupts

  TCCR2A = (1 << 6) | // OOM2A. 0=OC2A disconnected. 1=Toggle OC2A on compare match (p.128)
           (2 << 4) | // COM2B. 2=Clear OC2B on compare match (p.129)
           (1 << 0);  // WGM2.  PWM mode. 1=phase correct   (p.130)
  TCCR2B = (0 << 7) | // FOC2A.
           (0 << 6) | // FOC2B.
           (1 << 3) | // WGM22.
           (4 << 0);  // CLOCK source.
  OCR2A = TIMER2_PERIOD;
  OCR2B = TIMER2_PERIOD / 2;
  TIMSK2 = (0 << 2) | // OCIE2B. Match B Interrupt Enable
           (0 << 1) | // OCIE2A. Match A Interrupt Enable
           (0 << 0);  // TOIE2. Overflow Interrupt Enable
  TIFR2 = 0;
  TCNT2 = 0; // Initialize Timer2 counter

  sei(); // Allow interrupts
}


void timer_synchronize(void) {
  cli(); // Stop interrupts
  GTCCR = (1 << TSM) | (1 << PSRASY) | (1 << PSRSYNC); // halt all timers
  TCNT0 = 0; // Initialize Timer0 counter
  TCNT2 = 0; // Initialize Timer2 counter
  GTCCR = 0; // release all timers
  sei(); // Allow interrupts

  while ((PIND & (1 << PIN_SIGNAL_OUT)) != 0);
  while ((PIND & (1 << PIN_SIGNAL_OUT)) == 0);

  TCNT0 = TIMER0_PERIOD * TIMER0_PHASE_ADJUST; // Initialize Timer0 counter
}


// Timer0 interrupt handler
ISR(TIMER0_COMPA_vect) {
  int16_t adc_value;

  if (adc_measuring == 1) {

    // ADC Start Conversion
    ADCSRA |= (1 << ADSC);
   
    // Read last conversion
    adc_value = ADCW;

    // Accumulate values (10us)
    adc_acc_inphase += (int32_t) adc_value * SIN_INTEGER[level_state_old];
    adc_acc_quadrature += (int32_t) adc_value * SIN_INTEGER[level_state_old + SAMPLES_PER_WAVE / 4];


    // Update next state
    level_state_old = level_state;
    level_state++;
    if (level_state >= SAMPLES_PER_WAVE)
      level_state = 0;

    adc_samples++;
    if (adc_samples > SAMPLES_PER_MEASURE) {
      adc_measuring = 0;
    }
  }
}


// Timer2 interrupt handler
ISR(TIMER2_COMPA_vect) {

}


void debug_pin_pulse(void) {
  PORTD |= (1 << PIN_DEBUG_OUT);
  delayMicroseconds(4);
  PORTD &= ~(1 << PIN_DEBUG_OUT);
}



Schematic:
Attached


Related articles:
https://circuitcellar.com/cc-blog/build-an-accurate-milliohm-meter/
https://www.electronicsforu.com/electronics-projects/milliohm-meter
https://www.eevblog.com/forum/projects/design-review-ac-milliohm-meter/
« Last Edit: May 15, 2024, 01:23:48 pm by Picuino »
 
The following users thanked this post: croma641, thm_w

Offline PicuinoTopic starter

  • Super Contributor
  • ***
  • Posts: 1033
  • Country: es
    • Picuino web
Re: Milliohm meter Picuino
« Reply #1 on: May 12, 2024, 08:27:01 pm »
Some Measurements (uncalibrated):

Resistor of 1 Ohm:
Code: [Select]
SAMPLE_FREQUENCY = 8196.72 Hz
MEASURE_SIGNAL_FREQUENCY = 512.30 Hz
SAMPLE_TIME = 1.00 s
1085.3 mOhm R  1.3 mOhm Z_C
1085.3 mOhm R  1.3 mOhm Z_C
1085.2 mOhm R  1.4 mOhm Z_C
1085.2 mOhm R  1.4 mOhm Z_C
1085.2 mOhm R  1.4 mOhm Z_C
1085.1 mOhm R  1.4 mOhm Z_C
1085.1 mOhm R  1.5 mOhm Z_C
1085.0 mOhm R  1.4 mOhm Z_C
1085.0 mOhm R  1.4 mOhm Z_C
1085.1 mOhm R  1.4 mOhm Z_C
1085.2 mOhm R  1.4 mOhm Z_C
1085.0 mOhm R  1.3 mOhm Z_C
1085.1 mOhm R  1.4 mOhm Z_C
1085.0 mOhm R  1.4 mOhm Z_C
1085.0 mOhm R  1.4 mOhm Z_C
1085.0 mOhm R  1.4 mOhm Z_C
1085.0 mOhm R  1.4 mOhm Z_C
1085.0 mOhm R  1.4 mOhm Z_C
1085.0 mOhm R  1.4 mOhm Z_C
1085.0 mOhm R  1.4 mOhm Z_C
1085.0 mOhm R  1.4 mOhm Z_C
1085.0 mOhm R  1.3 mOhm Z_C
1084.9 mOhm R  1.3 mOhm Z_C
1085.0 mOhm R  1.4 mOhm Z_C
1085.0 mOhm R  1.3 mOhm Z_C
1085.0 mOhm R  1.4 mOhm Z_C


Capacitor of 1000uF:
Code: [Select]
SAMPLE_FREQUENCY = 8196.72 Hz
MEASURE_SIGNAL_FREQUENCY = 512.30 Hz
SAMPLE_TIME = 1.00 s
-0.5 mOhm R  0.8 mOhm Z_C
63.2 mOhm R  237.2 mOhm Z_C 1309.69 uFarads
96.0 mOhm R  362.8 mOhm Z_C 856.42 uFarads
95.7 mOhm R  362.3 mOhm Z_C 857.52 uFarads
95.8 mOhm R  362.4 mOhm Z_C 857.16 uFarads
95.9 mOhm R  362.5 mOhm Z_C 856.97 uFarads
95.8 mOhm R  362.6 mOhm Z_C 856.74 uFarads
95.9 mOhm R  362.7 mOhm Z_C 856.62 uFarads
95.8 mOhm R  362.7 mOhm Z_C 856.47 uFarads
95.9 mOhm R  362.5 mOhm Z_C 856.92 uFarads
95.9 mOhm R  362.7 mOhm Z_C 856.56 uFarads
95.8 mOhm R  362.7 mOhm Z_C 856.54 uFarads
95.8 mOhm R  362.6 mOhm Z_C 856.84 uFarads
95.8 mOhm R  362.7 mOhm Z_C 856.57 uFarads
95.9 mOhm R  362.7 mOhm Z_C 856.59 uFarads
95.9 mOhm R  362.7 mOhm Z_C 856.58 uFarads
95.9 mOhm R  362.6 mOhm Z_C 856.69 uFarads
95.9 mOhm R  362.7 mOhm Z_C 856.61 uFarads
95.8 mOhm R  362.6 mOhm Z_C 856.77 uFarads
95.8 mOhm R  362.7 mOhm Z_C 856.55 uFarads
95.9 mOhm R  362.7 mOhm Z_C 856.66 uFarads
95.9 mOhm R  362.7 mOhm Z_C 856.64 uFarads
95.8 mOhm R  362.7 mOhm Z_C 856.64 uFarads
95.9 mOhm R  362.7 mOhm Z_C 856.57 uFarads


Inductor of 68uH:
Code: [Select]
SAMPLE_FREQUENCY = 8196.72 Hz
MEASURE_SIGNAL_FREQUENCY = 512.30 Hz
SAMPLE_TIME = 1.00 s
44.0 mOhm R  185.3 mOhm Z_L 57.56 uHenrys
44.1 mOhm R  185.6 mOhm Z_L 57.66 uHenrys
44.2 mOhm R  185.9 mOhm Z_L 57.75 uHenrys
44.1 mOhm R  186.0 mOhm Z_L 57.77 uHenrys
43.8 mOhm R  185.9 mOhm Z_L 57.76 uHenrys
43.9 mOhm R  186.0 mOhm Z_L 57.79 uHenrys
43.9 mOhm R  185.8 mOhm Z_L 57.71 uHenrys
44.1 mOhm R  185.7 mOhm Z_L 57.69 uHenrys
44.2 mOhm R  185.6 mOhm Z_L 57.65 uHenrys
44.1 mOhm R  185.4 mOhm Z_L 57.59 uHenrys
43.9 mOhm R  185.2 mOhm Z_L 57.54 uHenrys
44.0 mOhm R  185.1 mOhm Z_L 57.51 uHenrys
44.1 mOhm R  185.0 mOhm Z_L 57.47 uHenrys
44.2 mOhm R  185.0 mOhm Z_L 57.46 uHenrys
44.1 mOhm R  184.9 mOhm Z_L 57.44 uHenrys
44.0 mOhm R  184.7 mOhm Z_L 57.37 uHenrys
43.8 mOhm R  184.6 mOhm Z_L 57.36 uHenrys
43.8 mOhm R  184.6 mOhm Z_L 57.35 uHenrys
43.8 mOhm R  184.6 mOhm Z_L 57.34 uHenrys
43.8 mOhm R  184.6 mOhm Z_L 57.36 uHenrys
43.9 mOhm R  184.7 mOhm Z_L 57.38 uHenrys
43.9 mOhm R  184.7 mOhm Z_L 57.37 uHenrys
43.9 mOhm R  184.8 mOhm Z_L 57.40 uHenrys
43.9 mOhm R  184.8 mOhm Z_L 57.40 uHenrys
43.8 mOhm R  184.8 mOhm Z_L 57.40 uHenrys
« Last Edit: May 12, 2024, 08:30:26 pm by Picuino »
 

Offline PicuinoTopic starter

  • Super Contributor
  • ***
  • Posts: 1033
  • Country: es
    • Picuino web
Re: Milliohm meter Picuino
« Reply #2 on: May 12, 2024, 08:33:46 pm »
Breadboard of analog section (without Arduino Nano)
 

Offline PicuinoTopic starter

  • Super Contributor
  • ***
  • Posts: 1033
  • Country: es
    • Picuino web
Re: Milliohm meter Picuino
« Reply #3 on: May 13, 2024, 08:28:34 pm »
Script of gf (https://www.eevblog.com/forum/profile/?u=176249) to calculate the multiplier for the least distorting discrete sine function.
The discrete sine function is used to multiply by the ADC samples that read the signal at the impedance under test. When multiplying the sine function by the received signal, only the signal that has the exact same frequency as the sine function will be measured.

Code: [Select]

nsamples = 16;
MAXMUL = 127;

% sampling phase = 0
% x = repmat(exp(-1j*[0:nsamples-1]/nsamples*2*pi)',1,MAXMUL);

% sampling phase = pi/nsamples
x = repmat(exp(-1j*[0:2*nsamples-1]/2/nsamples*2*pi)(2:2:end)',1,MAXMUL);

y = zeros(nsamples,MAXMUL);
for i=1:MAXMUL
  % quantize to 2*i+1 levels
  y(:,i) = floor(0.5+0.5i+x(:,i)*i)/i;
end

Y = zeros(nsamples,MAXMUL);
for i=1:MAXMUL
  Y(:,i) = fft(y(:,i))/nsamples;
end

P = abs(Y).^2;
Pfund = P(2,:);
harmidx = [ 1 3:nsamples ];
Pharm = sum(P(harmidx,:));
Pspur = max(P(harmidx,:));

plot(10*log10(Pharm./Pfund),";THD;");
hold on
plot(10*log10(Pspur./Pfund),";SFDR;");
title(sprintf("%d samples/period",nsamples))
grid on
hold off
ylabel("dB")
xlim([20 MAXMUL])
ylim([-65 -30])



Attached: results


Python script for create integer sines table:
Code: [Select]
SAMPLES_PER_WAVE = 16
MULTIPLIER = 61

import math

dots = [d/2 for d in range(1, SAMPLES_PER_WAVE*3 + 1, 2)]
angles = [d*2*math.pi/SAMPLES_PER_WAVE for d in dots]
sines = [round(MULTIPLIER * math.sin(angle)) for angle in angles]

print("const int16_t SIN_INTEGER[SAMPLES_PER_WAVE + SAMPLES_PER_WAVE / 4] = {")
for i in range(SAMPLES_PER_WAVE//4 + 1):
    row = [str(s) for s in sines[i*4:i*4+4]]
    print("  " + ", ".join(row) + ',')
print("};")


integer sine table with  multiplier=61:
Code: [Select]
const int16_t SIN_INTEGER[SAMPLES_PER_WAVE + SAMPLES_PER_WAVE / 4] = {
  12, 34, 51, 60,
  60, 51, 34, 12,
  -12, -34, -51, -60,
  -60, -51, -34, -12,
  12, 34, 51, 60,
};

« Last Edit: May 13, 2024, 09:02:13 pm by Picuino »
 

Online gf

  • Super Contributor
  • ***
  • Posts: 1353
  • Country: de
Re: Milliohm meter Picuino
« Reply #4 on: May 13, 2024, 09:11:41 pm »
The discrete sine function is used to multiply by the ADC samples that read the signal at the impedance under test.
When multiplying the sine function by the received signal, only the signal that has the exact same frequency as the sine function will be measured.

Not exactly. Other frequencies can also pass through, but they are more or less attenuated. It acts like a filter and has a frequency response. Only a few frequencies that fall on the zeros of the frequency response are completely rejected.

Attached is the frequency response of the equivalent bandpass filter, when 8192 Samples are multiplied with the complex sine wave and accumulated.

The three spurs result from the integer quantization of the sine tables. They are undesired, but they are below -60 dBc. These spurs are located at odd harhomics of the carrier frequency, and therefore determine how well the filter rejects carrier harmonics.

Figure2 is a zoom-in to the peak.
« Last Edit: May 14, 2024, 09:21:28 am by gf »
 

Offline jbb

  • Super Contributor
  • ***
  • Posts: 1241
  • Country: nz
Re: Milliohm meter Picuino
« Reply #5 on: May 13, 2024, 09:22:58 pm »
I had a quick look at the schematic, and I have a question.

U1 is an instrumentation amp, and applies quite some gain. It seems to run from a single +5V supply. It looks like the +ve input signal will be near ground. Will U1 work OK with such a low input common mode voltage?
 

Online gf

  • Super Contributor
  • ***
  • Posts: 1353
  • Country: de
Re: Milliohm meter Picuino
« Reply #6 on: May 13, 2024, 09:47:01 pm »
The datasheet says it works down to -0.1V.
 
The following users thanked this post: jbb

Offline PicuinoTopic starter

  • Super Contributor
  • ***
  • Posts: 1033
  • Country: es
    • Picuino web
Re: Milliohm meter Picuino
« Reply #7 on: May 13, 2024, 09:54:49 pm »
The maximum output voltage is 5V and the gain is 1050, as a result the minimum input voltage before saturating the amplifier will be -4.7 millivolts.

In practice it works without problems.
« Last Edit: May 17, 2024, 06:26:15 pm by Picuino »
 

Offline PicuinoTopic starter

  • Super Contributor
  • ***
  • Posts: 1033
  • Country: es
    • Picuino web
Re: Milliohm meter Picuino
« Reply #8 on: May 14, 2024, 06:44:57 am »
One problem with the meter I just found is that the input is not protected against charged capacitors. One improvement I can think of is to add two diodes in antiparallel to the input.
 

Offline croma641

  • Regular Contributor
  • *
  • Posts: 51
  • Country: it
Re: Milliohm meter Picuino
« Reply #9 on: May 14, 2024, 10:58:46 am »

I believe that this project represents the best design/program for implementing a diy micro-ohmmeter. It can be used to derive interesting insights for your own project.

https://www.pittnerovi.com/jiri/hobby/electronics/milliohmmeter/index.html

 
The following users thanked this post: Picuino


Share me

Digg  Facebook  SlashDot  Delicious  Technorati  Twitter  Google  Yahoo
Smf