Страница 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:
примерно так
Prot.png
(22.42 КБ) 119 скачиваний

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;
		   
    }
    
}



Proteus AUTO.png
(32.67 КБ) 86 скачиваний
Добавлено 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
Это делается двумя одинаковыми делителями с общей землёй и двумя диодами Шоттки. :tea:

Изображение

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
.

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

Изображение

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

Добавлено: Пт июн 10, 2022 17:58:55
Bodden
Спасибо, попробую такой вариант
2022-06-10_195600.png
(27.11 КБ) 95 скачиваний
Добавлено 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) ).

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

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

Изображение