Хочу сделать простейший измеритель индуктивности на ардуйне

Тема в разделе "Технологии радиолюбителя", создана пользователем akl, 14 июл 2021.

  1. akl

    akl Гуру

    нужна консультация ГУР
    хочу сделать простейший измеритель индуктивности на ардуйне (конечно с использованием моднейшего input capture, а не каких-то ардуиновских пульсынов)
    но возник вопрос по аналоговой части. придумал два варианта схемы - какой же будет лучше работать?
    в одном используется светодиод чтоб не резалось снизу, а потом через конденсатор на подтянутый к полпитанию вход ОУ LC_led.png

    в другом к полпитания подтянут непосредственно колебательный контур путем некой подпорки снизу - сомнительно, но в симуляторе работает.
    LC_podpor.png
    R1 это типа сопротивление катушки чтоб видно было снаружи положил
    как же быть в итоге? и если какая-то схема лучше другой, то как ее еще улучшить?
     
    Последнее редактирование: 14 июл 2021
  2. parovoZZ

    parovoZZ Гуру

    Все современные малогабаритные измерители - импульсные. По фазе тока определяется ESR. По скорости нарастания/спадания тока - емкость или индуктивность.
     
  3. akl

    akl Гуру

    это надо использовать ацп? у ардуины мне кажется скорости не хватит
     
  4. Airbus

    Airbus Радиохулиган Модератор

    Зачем? Вполне хватит. Тестер Маркуса на Меге 328. Вполне работает. Меряет индуктивность и емкость. ESR не измеряет. Вполне неплохо я раньше пользовался теперь у меня НВ14. Но сейчас придет ParovoZZ и скажет что его точности недостаточно для полетов на Марс
     
    Последнее редактирование: 15 июл 2021
    Daniil нравится это.
  5. akl

    akl Гуру

    интересная штука, но такое паять не хочу, может куплю. но паять не хочу это
     
    Airbus нравится это.
  6. Airbus

    Airbus Радиохулиган Модератор

    Правильно! Сейчас их на Али валом. И стоят дешевле и дисплеи красивые не то что раньше
     
  7. akl

    akl Гуру

    купил :D
    [​IMG]

    а схему соберу ту что со светодиодом :rolleyes:
     
  8. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Верхняя - Та, в которой нижний отвод индуктивности на "земле". Здесь цепи операционника отделены конденсатором от цепи индуктивности. Ведь, как я понимаю - прибор работает на ударном возбуждении контура, индуктивность будет подключаться-отключаться. С точки же зрения переменных составляющих напряжения - обе схемы эквивалентны. Что и показывают симуляторы.
     
    Последнее редактирование: 15 июл 2021
    akl нравится это.
  9. akl

    akl Гуру

    не, у верхней выхлоп больше. практически от 0 до 4,8
    а у второй всего от 1 до 3,5 и даже меньше
     
  10. Ariadna-on-Line

    Ariadna-on-Line Гуру

    На обоих графиках красный сигнал 0-4В. В обеих схемах нет цепей ООС. Выход определяется напряжением питания, и разным быть не может в принципе. Ну разве что увеличьте С3 до 47мкф и параллельно поставьте керамический 0.47мкф.
     
  11. akl

    akl Гуру

    красный это квадрат после компаратора, но за эффективность отвечает зеленый. если он будет слишком слабым, то и на выходе будет либо шум либо отсутствие сигнала
     
  12. parovoZZ

    parovoZZ Гуру

  13. akl

    akl Гуру

    это слишком сложно. у меня цель не измерять, а немного попаять и попогромировать. но не сильно.

    схема кстати работает более-менее. хотя затухает быстрее чем в симуляторе.



    IMG_20210717_092443_559.jpg
     
    Последнее редактирование: 17 июл 2021
  14. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Чтоб вычислить индуктивность как раз нужен сигнал после компаратора. А вот затухающая синусоида лучше подходит для вычисления добротности контура. И еще - паразитного активного сопротивления индуктивности. Только не знаю зачем его вычислять.
     
  15. akl

    akl Гуру

    мне нужен сигнал с компаратора, но в компараторе он получается из того что приходит на вход компаратора, так что если вместо четкой и долгой синусоиды туда будет приходить что-то вялое, то из компаратора может не выйти даже одного полноценного квадрата.
     
  16. akl

    akl Гуру

    в целом приблуда работает.

    спонтанный бякокот
    Код (C++):
    #define F_CPU 16000000L
    #include <avr/io.h>
    #include <util/delay.h>
    #include <avr/interrupt.h>

    #define setH(port,bit)  do{port |= (1 << bit);}while(0)
    #define setL(port,bit)  do{port &= ~(1 << bit);}while(0)
    #define readP(reg,bit)    (reg & (1 << bit))

    void timer1_init(){
      uint8_t oldSREG = SREG;
      SREG &= ~(0b10000000);
      TCCR1A = 0;
      TCCR1B = 0;
      //TCCR1B |= (1 << CS11)|(1 << CS10);//prescaler 64 (1 tick = 4 us)
      TCCR1B |= (1 << CS11);//prescaler 8 (1 tick = 0.5 us)
      TCCR1B |= (1 << ICES1);//up front
      TCCR1B |= (1 << ICNC1);//filter icp
      //TCCR1B |= (1 << WGM12);//CTC
      //TIMSK1 |= (1 << ICIE1);//input capture interrupt enable
      //TIMSK1 |= (1 << TOIE1);//overflow interrupt enable
      //TIMSK1 |= (1 << OCIE1A);//compare interrupt OCR1A
      //OCR1A = 0; //
      //OCR1B = 0; //
      TIFR1 |= (1 << ICF1);
      TIFR1 |= (1 << TOV1);// clear any pending interrupts
      TCNT1 = 0;
      SREG = oldSREG;
    }
    //__________________
    #define ICP_N 4 //catches N
    #define ICPE_1 1
    #define ICPE_2 2
    #define ICPE_3 4
    #define ICPE_4 8
    #define ICPE_5 16
    #define ICPE_6 32
    #define ICPE_7 64
    #define ICPE_8 128
    //#define ICP_DDR DDRB //ICP1 interrupt capture pin
    //#define ICP_PORT PORTB
    //#define ICP_PIN PINB
    //#define ICP_P 0 //Digital 8
    #define IMPULSE_DDR DDRD//impulse output pin
    #define IMPULSE_PORT PORTD
    #define IMPULSE_PIN PIND
    #define IMPULSE_P 5 //Digital 5
    volatile uint8_t icp_flag=0;
    volatile uint8_t icp_ovf=0;
    volatile uint16_t icp_array[ICP_N+1];
    volatile uint8_t icp_arr_i=0;
    uint16_t per_arr[ICP_N];
    ISR (TIMER1_CAPT_vect) {
      icp_array[icp_arr_i]=ICR1;
      if(icp_arr_i == ICP_N-1){
        icp_flag=1;
      }
      icp_arr_i++;
      if(icp_arr_i > ICP_N){
        icp_arr_i = ICP_N;
      }
    }
    ISR (TIMER1_OVF_vect) {
      icp_ovf=1;
    }
    uint8_t icp_error=0;
    uint8_t ICPcatch(){
      uint8_t oldSREG = SREG;
      SREG &= ~(0b10000000);
      icp_error=0;
      icp_flag=0;
      icp_ovf=0;
      for(uint8_t i=0; i<ICP_N+1; i++){icp_array[i]=0;}
      for(uint8_t i=0; i<ICP_N; i++){per_arr[i]=0;}
      icp_arr_i=0;
      TCNT1 = 0;
      ICR1 = 0;
      setH(IMPULSE_PORT,IMPULSE_P);
      _delay_us(100);
      setL(IMPULSE_PORT,IMPULSE_P);
      TIMSK1 |= (1 << ICIE1);//input capture interrupt on
      TIMSK1 |= (1 << TOIE1);//overflow interrupt on
      TIFR1 |= (1 << ICF1);
      TIFR1 |= (1 << TOV1);// clear any pending interrupts
      SREG = oldSREG;
      while(1==1){
        if(icp_flag){break;}
        if(icp_ovf){icp_error|=ICPE_1;break;}
      }
      TIMSK1 &= ~(1 << ICIE1);//input capture interrupt off
      TIMSK1 &= ~(1 << TOIE1);//overflow interrupt off
      return icp_error;
    }
    uint8_t ICPcalculate(unsigned int * per_ticks, unsigned int *delta_ticks){
      *per_ticks=0;
      *delta_ticks=0;
      if(icp_array[ICP_N]!=0){
        icp_error|=ICPE_2;
      }
      for(uint8_t i=0; i<ICP_N-1; i++){
        int32_t d=icp_array[i+1]-icp_array[i];
        if(d<0){icp_error|=ICPE_3;break;}
        if(d>0xFFFF){icp_error|=ICPE_4;break;}
        per_arr[i]=(uint16_t)d;
      }
      if(!icp_error){
        uint32_t per_avg = 0;
        for(uint8_t i=0; i<ICP_N-1; i++){
          per_avg+=per_arr[i];
        }
        per_avg/=ICP_N-1;
        *per_ticks=(unsigned int)per_avg;
        uint16_t p_max=per_arr[0];
        uint16_t p_min=p_max;
        for(uint8_t i=1; i<ICP_N-1; i++){
          if(per_arr[i]>p_max){p_max=per_arr[i];}
          if(per_arr[i]<p_min){p_min=per_arr[i];}
        }
        *delta_ticks=p_max-p_min;
      }
      return icp_error;
    }

    unsigned int period_ti=0;
    unsigned int delta_ti=0;
    unsigned char error;
    char str[] = "avg: 00000 +-00000 err=000\n";
    void setup() {
      setH(IMPULSE_DDR,IMPULSE_P);
      timer1_init();
      Serial.begin(9600);
    }

    void loop() {
      error=ICPcatch();
      if(!error){
        error=ICPcalculate(&period_ti, &delta_ti);
      }
      Serial.print("ICP: ");
      for(int i=0;i<ICP_N;i++){
        Serial.print(icp_array[i]);
        Serial.print(" ");
      }
      Serial.print("\n");
      Serial.print("ICPd: ");
      for(int i=0;i<ICP_N-1;i++){
        Serial.print(per_arr[i]);
        Serial.print(" ");
      }
      Serial.print("\n");
      sprintf(str,"avg: %d +-%d err=%d\n",period_ti,delta_ti,error);
      Serial.print(str);

      _delay_ms(2000);

    }
    выводит тики таймера в моменты срабатывания ICP1, разницу между ними, среднее из разниц и типа того, доделывать пока лень - саму индуктивность пока считаю в екселе. В итоге мелкие катушки из магазина показывает неплохо -
    100 микрогенри показывает 99-101 в зависимости от конденсатора,
    10 миллигенри получается 10,6 - 11,
    а вот 1 миллигенри почему-то 0,78, но это скорее всего сама катушка кривая, неизвестно какие там допуски.

    С большими жирными дросселями типа Д15, Д39 сложнее. там почему-то периуды волн получаются разные - затухающие со временем. на Д39 например ваще можно словить до 15 волн, получается что-то типа
    3600 3516 3440 3392 3364 3352 3344 3336 3328 3320 3320 микросекунд
    то есть от 2,8 до 3,3 генри или типа того (по номиналу дроссель 2,5 генри)
    Д15 аналогично - затухает от 11,7 до 9,6 (дроссель на 10 генри)

    Выходит надо как-то узнать какие из волн больше всего соответствуют, начальные или конечные.

    Как приедет приборчик https://aliexpress.ru/item/4000366255405.html
    можно будет померить хоть сколько там в этих дросселях на самом деле индуктивности
     
  17. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Вроде бы можно обойтись без внешнего операционника, на встроенных компараторах процессора.
     
  18. akl

    akl Гуру

    тогда все равно нужна куча деталей снаружи, но еще и не получится использовать инпут капчур таймера.

    товарищи Гуры! объясните чудо-эффект, из-за которого волны укорачиваются, и один и тот же дроссель с каждой последующей волной имеет уменьшающуюся индуктивность от 3,3 до 2,8 генри.
     
  19. parovoZZ

    parovoZZ Гуру

    низкая добротность конутра.

    для этого необходимо использовать МК с системой событий внутри.
     
  20. Airbus

    Airbus Радиохулиган Модератор

    Причём тут добротность?Прибор должен измерять индуктивность хоть зубочистки.
    Это как?Что именно уменьшается?