Обсуждаем контроллеры компании Atmel.
Ответить

Мультиметр на AVR

Чт май 26, 2022 13:46:50

Здравствуйте. Понимаю что тема замусолена, но покоя не дает один вопрос.
Как на мультиметре реализуется смена полярности? + - +, com - com и наоборот + - com, com - +?
Сколько схем любительских не смотрел, везде надо соблюдать полярность на щупах, а про реализацию смены полярности не слово. У меня в голове только идея с диодным мостом и контролем питания на входе моста.
Подскажите пожалуйста, как это можно реализовать?
Спасибо.

Re: Мультиметр на AVR

Чт май 26, 2022 13:50:42

просто сдвинуть входной сигнал на половину измеряемого диапазона относительно земли.

Добавлено after 1 minute 26 seconds:
вот тут что-то такое обсуждалось:
https://electronix.ru/forum/index.php?a ... 2#comments

Re: Мультиметр на AVR

Чт май 26, 2022 14:39:00

просто сдвинуть входной сигнал на половину измеряемого диапазона относительно земли.

Добавлено after 1 minute 26 seconds:
вот тут что-то такое обсуждалось:
https://electronix.ru/forum/index.php?a ... 2#comments


Спасибо. Но там как я понял обсуждается измерение 2 х полярного напряжения. А мне интересно, что бы меняя провода на мультиметре относительно "+" появлялся "-" на дисплее. Как это реализовано на заводских мультиметрах?

Re: Мультиметр на AVR

Чт май 26, 2022 14:49:24

ну дык, это оно и есть.
Предположим, мы решили мерять какое-то напряжение какой-то полярности. Наш АЦП может выдать число от 0 до 255, при измерении напряжения от 0 до 5 вольт.
Смещаем входной сигнал на 2.5 вольта. Теперь просто программа должна также сместить все значения. То есть, если мы получили на АЦП число 127, высвечиваем 0, если меньше 127 - высвечиваем значение напряжения, соответствующее результату АЦП, но со знаком "-" на индикаторе. Если больше 127, то на индикаторе значение = результат AЦП - 127, и без знака "-"

Re: Мультиметр на AVR

Чт май 26, 2022 14:53:47

Прошу прощения, возможно я не правильно изложил свою мысль.
Мне надо :
красный провод(мультиметра) на плюс - на экране плюс;
черный провод(мультиметра) на плюс - на экране минус.

Re: Мультиметр на AVR

Чт май 26, 2022 15:00:03

выше именно это.
попробую ещё раз.
ещё проще.
у Вас батарейка 1.5 вольта. Вы её подключили к мультиметру, плюс к плюсу, минус к минусу.
Что придёт на AЦП, если вход смещён на 2.5 вольта? Придёт сумма напряжений, 4 вольта.

Теперь перевернули батарейку, её плюс к минусу мультиметра, а минус - к плюсу, как Вы и хотите.
Что придёт на АЦП, если вход смещён на 2.5 вольта? Разница напряжений, 2.5 - 1.5 = 1.

Теперь вопрос: что должен высветить индикатор, если на АЦП пришло 4 и что, если 1?

Re: Мультиметр на AVR

Чт май 26, 2022 16:03:32

выше именно это.
попробую ещё раз.
ещё проще.
у Вас батарейка 1.5 вольта. Вы её подключили к мультиметру, плюс к плюсу, минус к минусу.
Что придёт на AЦП, если вход смещён на 2.5 вольта? Придёт сумма напряжений, 4 вольта.

Теперь перевернули батарейку, её плюс к минусу мультиметра, а минус - к плюсу, как Вы и хотите.
Что придёт на АЦП, если вход смещён на 2.5 вольта? Разница напряжений, 2.5 - 1.5 = 1.

Теперь вопрос: что должен высветить индикатор, если на АЦП пришло 4 и что, если 1?


Блин- блинский, я понял...
Спасибо огромное, чуток не в том направлении думал.

Добавлено after 1 hour 17 seconds:
примерно так
Prot.png
(22.42 KiB) Скачиваний: 100

Re: Мультиметр на AVR

Вт май 31, 2022 16:30:52

Bodden писал(а):идея с диодным мостом

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

Re: Мультиметр на AVR

Ср июн 08, 2022 17:05:17

Здравствуйте друзья.
Попытка реализоваться с мультиметром имеет переменный успех. С одной стороны все получилось, с другой от -36 В. до 0, имеется постоянный коэффициент, уверенная линейность. От 0 до 36 ADC нелинейна, коэффициент постоянно увеличивается. Приходится корректировать на каждые 10 вольт. Предполагаю, что в настоящем железе нелинейность просто зашкалит. Если есть какие нибудь мысли, подскажите пожалуйста.

Спойлер
Код:
/*
 * Max7219.c
 *
 * Created: 5/23/2022 3:14:02 PM
 * Author : Bodden007
 */

#define F_CPU 8000000L
#include <avr/io.h>
#include <avr/delay.h>
#include <math.h>
#include <avr/interrupt.h>

#define SPI_DDR      DDRB
#define SPI_PORT   PORTB
#define SPI_SS      PB2
#define SPI_MOSI   PB3
#define SPI_MISO   PB4
#define SPI_SCK      PB5

char d[19] ={                                    //character encoding for a seven-segment indicator
   0x7E,                                       //0
   0x30,                                       //1
   0x6D,                                       //2
   0x79,                                       //3
   0x33,                                       //4
   0x5B,                                       //5
   0x5F,                                       //6
   0x70,                                       //7
   0x7F,                                       //8
   0x7B,                                       //9
   0x1,                                       //-      10
   0x77,                                       //a      11
   0x1F,                                       //b      12
   0x4E,                                       //c      13
   0x3D,                                       //d      14
   0x4F,                                       //e      15
   0x47,                                       //f      16
   0x80,                                       //.      17
   0x00                                       //NON   18
};

int Kfactor (int DataADC)
{
         
   if ((DataADC>=480) && (DataADC<=611)) {DataADC = (DataADC-480)/0.13;}
      else
         if ((DataADC>611) && (DataADC<=677)) {DataADC = (DataADC-480)/0.131;}
            else
               if ((DataADC>677) && (DataADC<=743)) {DataADC = (DataADC-480)/0.1315;}
                  else
                     if ((DataADC>743) && (DataADC<=809)) {DataADC = (DataADC-480)/0.1316;}
                        else
                           if ((DataADC>809) && (DataADC<=875)) {DataADC = (DataADC-480)/0.1316;}
                              else
                                 if ((DataADC>875) && (DataADC<=955)) {DataADC = (DataADC-480)/0.1319;}
      
      DataADC = DataADC/10;   
            
   return DataADC;
   
}

void Razryd(int CorADC, int *pRazr2, int *pRazr3, int *pRazr4)
{
   
   *pRazr4 = CorADC%10;
   *pRazr3 = CorADC%100/10;
   *pRazr2 = CorADC%1000/100;
   
}

ISR(ADC_vect)
{
      
   ADCSRA |=(1<<ADSC);
}

void ADC_init()
{
   ADCSRA |=(1<<ADEN)|(1<<ADSC)|(1<<ADFR)|(1<<ADIE)
   |(1<<ADPS2)|(1<<ADPS1);                           //ADC - ON, divider - 64
   ADMUX |=(1<<REFS0);                              //External ION
}

void SPI_init()
{
   SPI_DDR = (1<<SPI_MOSI)|(1<<SPI_SCK)|(1<<SPI_SS);      //setting up MOSI, SCK, SS as outputs
   SPI_PORT |=(1<<SPI_SS);                           //setting SS to 1
   SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR1)|(1<<SPR0);         //through the SPSR register, we configure the hardware SPI
   
   spi(0x0C,0x00);                                 //Disabling indicators
   spi(0x09,0x00);                                 //Disabling decoding
   spi(0x0A,0x0A);                                 //The intensity of the glow of the indicators
   spi(0x0B,0x04);                                 //Number of indicators starting from 0
   spi(0x0F,0x00);                                 //Disabling the indicator test
   spi(0x0C,0x01);                                 //Enabling indicators
   
}

void spi(char cmd,char data)                        //The function of transmitting two 8-bit packets over the SPI protocol
{
   
   SPI_PORT &= ~(1<<SPI_SS);                        //reset SS to 0
   SPDR = cmd;                                    //we send the data to the SPI address
   while(!(SPSR&(1<<SPIF)));                        //we are waiting for the end of sending
   SPDR = data;                                 //we send data by SPI data
   while(!(SPSR&(1<<SPIF)));                        //we are waiting for the end of sending
   SPI_PORT |= (1<<SPI_SS);                        //setting SS to 1
   
}

void Send_SPI(char d[], int Razr1, int Razr2, int Razr3, int Razr4)
{
   int Dp = 0x80;
   
   spi(1,d[Razr1]);
   spi(2,d[Razr2]);
   spi(3,d[Razr3] | Dp);
   spi(4,d[Razr4]);
}

void clrdig ()                                    //Indicator cleaning function
{
   spi(0x01,d[17]);
   spi(0x02,d[17]);
   spi(0x03,d[17]);
   spi(0x04,d[17]);
   spi(0x05,d[17]);
   
}

int main(void)
{
   int DataADC = 0;
   int CorADC = 0;
   int Razr1 = 0;
   int Razr2 = 0;
   int Razr3 = 0;
   int Razr4 = 0;
   
   ADC_init();
   sei();
   SPI_init();
   clrdig();                                    //Clearing all indicators
   
    while(1){   
            
      DataADC = ADC;
      
      if (DataADC <= 2 ){Razr1=10; Razr2=10; Razr3=10; Razr4=10;}
         else
            if ((DataADC >= 0) && (DataADC < 479)){Razr1=10; CorADC = (480-DataADC)/1.323; Razryd(CorADC, &Razr2, &Razr3, &Razr4);}
               else
                  if (DataADC == 479){Razr1=18; CorADC=0; Razryd(CorADC, &Razr2, &Razr3, &Razr4);}
                     else
                        if (DataADC > 955){Razr1=10; Razr2=10; Razr3=10; Razr4=10;}
                           else
                              if (DataADC >= 480){Razr1=18; CorADC = Kfactor(DataADC); Razryd(CorADC, &Razr2, &Razr3, &Razr4);}
                           
      Send_SPI(d, Razr1, Razr2, Razr3, Razr4);                                    
                                        
       DataADC = 0;
         
    }
   
}




Proteus AUTO.png
(32.67 KiB) Скачиваний: 63


Добавлено after 5 minutes 4 seconds:
У меня у самого такие варианты:
1. Сделать swap;
2. использовать промышленный ADC;
3. использовать мысль - ><8>

Re: Мультиметр на AVR

Ср июн 08, 2022 17:08:07

поищи "выпрямитель на ОУ"

Re: Мультиметр на AVR

Чт июн 09, 2022 19:53:18

Это делается двумя одинаковыми делителями с общей землёй и двумя диодами Шоттки. :tea:

Изображение
Последний раз редактировалось ddr4 Чт июн 09, 2022 20:48:32, всего редактировалось 4 раз(а).

Re: Мультиметр на AVR

Чт июн 09, 2022 20:15:33

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

Если мост из MOSFET, то им придётся достаточно сложно управлять.
Сдвиг ничего не уменьшает. Эффективная разрядность AЦП какой была, такой и остаётся.

Re: Мультиметр на AVR

Чт июн 09, 2022 20:43:05

.

Если нужно отображение минуса на экране при изменении полярности, то используем два АЦП-пина. :tea:

Изображение

Re: Мультиметр на AVR

Пт июн 10, 2022 17:58:55

Спасибо, попробую такой вариант
2022-06-10_195600.png
(27.11 KiB) Скачиваний: 72


Добавлено after 1 minute 26 seconds:
Программно еще не корректировал. По тестирую.

Re: Мультиметр на AVR

Пт июн 10, 2022 19:59:04

Поигрался от скуки..
Вложения
Ashampoo_Snap_2022.06.10_19h55m47s_001_.png
(16.41 KiB) Скачиваний: 62

Re: Мультиметр на AVR

Пт июн 10, 2022 22:27:33

.
Обновлённый вариант на двух дифф.усилителях, 4-х делителях, и с 4-мя АЦП-пинами.
Положительное входное напряжение на Vin1, Vin2, отрабатывается через АЦП-pin1 и pin2, отрицательное через АЦП-pin-3/4. Смешанное через смешанные состояние АЦП-пинов.
Изображение

Re: Мультиметр на AVR

Сб июн 11, 2022 08:49:41

Подскажите пожалуйста, для чего задействовали по два пина ADC?

Re: Мультиметр на AVR

Сб июн 11, 2022 10:05:28

1. Положительные входные напряжения на Vin1, Vin2 отрабатываются через АЦП-pin1 и pin2. Но данные АЦП будут перевёрнуты, то есть при Vin1 = 0, регистр АЦП будет выдавать 0xFF, а когда Vin1 = Vmax, то транзистор полностью открыт и pin = 0x00.
2. Отрицательные входное напряжение отрабатывается через АЦП-pin-3 и 4.
3. Смешанное - через смешанные состояние АЦП-пинов.

Пример на Vin1, Vin2 подано (3В, 5В), положительные напряжения, поэтому работает только левый диф.усилитель, начальные значения pin1 = 0xFF, pin2 = 0xFF.
На регистрах АЦП к примеру имеем pin1 = 240, pin2 = 224. Разницу pin1 - pin2 интерпретируем как напряжение между Vin1, Vin2, причём в зависимости от того какой у нас обозначен за чёрный вход (COM), устанавливаем минус на экране.

Тоже самое для отрицательных значений Vin1, Vin2, но там работает правый диф.усилитель pin3, pin4, c начальными значениями пинов (0x00, 0x00).

Смешанные состояния пинов, когда на вход Vin1 подано положительное напряжение на Vin2 отрицательное. Тогда (pin1, pin2, pin3, pin4) = (0xFF, 240, 0x00, 99) => U = k* ((0xFF - 240) + (99 - 0x00) ).

Недостаток такой схемы это настройка, подборка транзисторов с близким КУ и прочее. Положительная сторона схемы, что она почти не потребляет в режиме простоя, в отличии от большинства ОУ.

В данной схеме можно попробовать заменить диф.усилители на ОУ, но так как ОУ имеет только один выход т.е. сразу выдают разницу, то придётся делать двухполярное напряжение.

Изображение
Ответить