Страница 1 из 1
Мультиметр на AVR
Добавлено: Чт май 26, 2022 13:46:50
Bodden
Здравствуйте. Понимаю что тема замусолена, но покоя не дает один вопрос.
Как на мультиметре реализуется смена полярности? + - +, com - com и наоборот + - com, com - +?
Сколько схем любительских не смотрел, везде надо соблюдать полярность на щупах, а про реализацию смены полярности не слово. У меня в голове только идея с диодным мостом и контролем питания на входе моста.
Подскажите пожалуйста, как это можно реализовать?
Спасибо.
Re: Мультиметр на AVR
Добавлено: Чт май 26, 2022 13:50:42
Martian
просто сдвинуть входной сигнал на половину измеряемого диапазона относительно земли.
Добавлено after 1 minute 26 seconds:
вот тут что-то такое обсуждалось:
https://electronix.ru/forum/index.php?a ... 2#comments
Re: Мультиметр на AVR
Добавлено: Чт май 26, 2022 14:39:00
Bodden
[uquote="Martian",url="/forum/viewtopic.php?p=4236955#p4236955"]просто сдвинуть входной сигнал на половину измеряемого диапазона относительно земли.
Добавлено after 1 minute 26 seconds:
вот тут что-то такое обсуждалось:
https://electronix.ru/forum/index.php?a ... 2#comments[/uquote]
Спасибо. Но там как я понял обсуждается измерение 2 х полярного напряжения. А мне интересно, что бы меняя провода на мультиметре относительно "+" появлялся "-" на дисплее. Как это реализовано на заводских мультиметрах?
Re: Мультиметр на AVR
Добавлено: Чт май 26, 2022 14:49:24
Martian
ну дык, это оно и есть.
Предположим, мы решили мерять какое-то напряжение какой-то полярности. Наш АЦП может выдать число от 0 до 255, при измерении напряжения от 0 до 5 вольт.
Смещаем входной сигнал на 2.5 вольта. Теперь просто программа должна также сместить все значения. То есть, если мы получили на АЦП число 127, высвечиваем 0, если меньше 127 - высвечиваем значение напряжения, соответствующее результату АЦП, но со знаком "-" на индикаторе. Если больше 127, то на индикаторе значение = результат AЦП - 127, и без знака "-"
Re: Мультиметр на AVR
Добавлено: Чт май 26, 2022 14:53:47
Bodden
Прошу прощения, возможно я не правильно изложил свою мысль.
Мне надо :
красный провод(мультиметра) на плюс - на экране плюс;
черный провод(мультиметра) на плюс - на экране минус.
Re: Мультиметр на AVR
Добавлено: Чт май 26, 2022 15:00:03
Martian
выше именно это.
попробую ещё раз.
ещё проще.
у Вас батарейка 1.5 вольта. Вы её подключили к мультиметру, плюс к плюсу, минус к минусу.
Что придёт на AЦП, если вход смещён на 2.5 вольта? Придёт сумма напряжений, 4 вольта.
Теперь перевернули батарейку, её плюс к минусу мультиметра, а минус - к плюсу, как Вы и хотите.
Что придёт на АЦП, если вход смещён на 2.5 вольта? Разница напряжений, 2.5 - 1.5 = 1.
Теперь вопрос: что должен высветить индикатор, если на АЦП пришло 4 и что, если 1?
Re: Мультиметр на AVR
Добавлено: Чт май 26, 2022 16:03:32
Bodden
[uquote="Martian",url="/forum/viewtopic.php?p=4236986#p4236986"]выше именно это.
попробую ещё раз.
ещё проще.
у Вас батарейка 1.5 вольта. Вы её подключили к мультиметру, плюс к плюсу, минус к минусу.
Что придёт на AЦП, если вход смещён на 2.5 вольта? Придёт сумма напряжений, 4 вольта.
Теперь перевернули батарейку, её плюс к минусу мультиметра, а минус - к плюсу, как Вы и хотите.
Что придёт на АЦП, если вход смещён на 2.5 вольта? Разница напряжений, 2.5 - 1.5 = 1.
Теперь вопрос: что должен высветить индикатор, если на АЦП пришло 4 и что, если 1?[/uquote]
Блин- блинский, я понял...
Спасибо огромное, чуток не в том направлении думал.
Добавлено after 1 hour 17 seconds:
примерно так
Re: Мультиметр на AVR
Добавлено: Вт май 31, 2022 16:30:52
><8>
Bodden писал(а):идея с диодным мостом
идея то правильная, если мост из мосфетов. а сдвиг уменьшит эффективную разрядность ацп.
Re: Мультиметр на AVR
Добавлено: Ср июн 08, 2022 17:05:17
Bodden
Здравствуйте друзья.
Попытка реализоваться с мультиметром имеет переменный успех. С одной стороны все получилось, с другой от -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;
}
}
Добавлено after 5 minutes 4 seconds:
У меня у самого такие варианты:
1. Сделать swap;
2. использовать промышленный ADC;
3. использовать мысль - ><8>
Re: Мультиметр на AVR
Добавлено: Ср июн 08, 2022 17:08:07
Ivanoff-iv
поищи "выпрямитель на ОУ"
Re: Мультиметр на AVR
Добавлено: Чт июн 09, 2022 19:53:18
ddr4
Это делается двумя одинаковыми делителями с общей землёй и двумя диодами Шоттки.

Re: Мультиметр на AVR
Добавлено: Чт июн 09, 2022 20:15:33
Martian
[uquote="><8>",url="/forum/viewtopic.php?p=4239400#p4239400"]если мост из мосфетов. а сдвиг уменьшит эффективную разрядность ацп.[/uquote]
Если мост из MOSFET, то им придётся достаточно сложно управлять.
Сдвиг ничего не уменьшает. Эффективная разрядность AЦП какой была, такой и остаётся.
Re: Мультиметр на AVR
Добавлено: Чт июн 09, 2022 20:43:05
ddr4
.
Если нужно отображение минуса на экране при изменении полярности, то используем два АЦП-пина.

Re: Мультиметр на AVR
Добавлено: Пт июн 10, 2022 17:58:55
Bodden
Спасибо, попробую такой вариант
Добавлено after 1 minute 26 seconds:
Программно еще не корректировал. По тестирую.
Re: Мультиметр на AVR
Добавлено: Пт июн 10, 2022 19:59:04
korsaj
Поигрался от скуки..
Re: Мультиметр на AVR
Добавлено: Пт июн 10, 2022 22:27:33
ddr4
.
Обновлённый вариант на двух дифф.усилителях, 4-х делителях, и с 4-мя АЦП-пинами.
Положительное входное напряжение на Vin1, Vin2, отрабатывается через АЦП-pin1 и pin2, отрицательное через АЦП-pin-3/4. Смешанное через смешанные состояние АЦП-пинов.

Re: Мультиметр на AVR
Добавлено: Сб июн 11, 2022 08:49:41
Bodden
Подскажите пожалуйста, для чего задействовали по два пина ADC?
Re: Мультиметр на AVR
Добавлено: Сб июн 11, 2022 10:05:28
ddr4
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) ).
Недостаток такой схемы это настройка, подборка транзисторов с близким КУ и прочее. Положительная сторона схемы, что она почти не потребляет в режиме простоя, в отличии от большинства ОУ.
В данной схеме можно попробовать заменить диф.усилители на ОУ, но так как ОУ имеет только один выход т.е. сразу выдают разницу, то придётся делать двухполярное напряжение.
