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

Обсуждаем контроллеры компании Atmel.
Ответить
Bodden
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Чт дек 27, 2018 18:36:11

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

Сообщение Bodden »

Здравствуйте. Понимаю что тема замусолена, но покоя не дает один вопрос.
Как на мультиметре реализуется смена полярности? + - +, com - com и наоборот + - com, com - +?
Сколько схем любительских не смотрел, везде надо соблюдать полярность на щупах, а про реализацию смены полярности не слово. У меня в голове только идея с диодным мостом и контролем питания на входе моста.
Подскажите пожалуйста, как это можно реализовать?
Спасибо.
Реклама
Martian
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32
Контактная информация:

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

Сообщение Martian »

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

Добавлено after 1 minute 26 seconds:
вот тут что-то такое обсуждалось:
https://electronix.ru/forum/index.php?a ... 2#comments
Реклама
Bodden
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Чт дек 27, 2018 18:36:11

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

Сообщение 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 х полярного напряжения. А мне интересно, что бы меняя провода на мультиметре относительно "+" появлялся "-" на дисплее. Как это реализовано на заводских мультиметрах?
Martian
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32
Контактная информация:

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

Сообщение Martian »

ну дык, это оно и есть.
Предположим, мы решили мерять какое-то напряжение какой-то полярности. Наш АЦП может выдать число от 0 до 255, при измерении напряжения от 0 до 5 вольт.
Смещаем входной сигнал на 2.5 вольта. Теперь просто программа должна также сместить все значения. То есть, если мы получили на АЦП число 127, высвечиваем 0, если меньше 127 - высвечиваем значение напряжения, соответствующее результату АЦП, но со знаком "-" на индикаторе. Если больше 127, то на индикаторе значение = результат AЦП - 127, и без знака "-"
Реклама
Эиком - электронные компоненты и радиодетали
Bodden
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Чт дек 27, 2018 18:36:11

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

Сообщение Bodden »

Прошу прощения, возможно я не правильно изложил свою мысль.
Мне надо :
красный провод(мультиметра) на плюс - на экране плюс;
черный провод(мультиметра) на плюс - на экране минус.
Реклама
Martian
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32
Контактная информация:

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

Сообщение Martian »

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

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

Теперь вопрос: что должен высветить индикатор, если на АЦП пришло 4 и что, если 1?
Реклама
Bodden
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Чт дек 27, 2018 18:36:11

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

Сообщение 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 КБ) 117 скачиваний
><8>
Открыл глаза
Сообщения: 45
Зарегистрирован: Чт апр 28, 2022 23:44:25

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

Сообщение ><8> »

Bodden писал(а):идея с диодным мостом
идея то правильная, если мост из мосфетов. а сдвиг уменьшит эффективную разрядность ацп.
Bodden
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Чт дек 27, 2018 18:36:11

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

Сообщение 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 КБ) 85 скачиваний
Добавлено after 5 minutes 4 seconds:
У меня у самого такие варианты:
1. Сделать swap;
2. использовать промышленный ADC;
3. использовать мысль - ><8>
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

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

Сообщение Ivanoff-iv »

поищи "выпрямитель на ОУ"
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Аватара пользователя
ddr4
Потрогал лапой паяльник
Сообщения: 352
Зарегистрирован: Ср дек 30, 2020 23:05:29

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

Сообщение ddr4 »

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

Изображение
Последний раз редактировалось ddr4 Чт июн 09, 2022 20:48:32, всего редактировалось 4 раза.
Martian
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32
Контактная информация:

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

Сообщение Martian »

[uquote="><8>",url="/forum/viewtopic.php?p=4239400#p4239400"]если мост из мосфетов. а сдвиг уменьшит эффективную разрядность ацп.[/uquote]
Если мост из MOSFET, то им придётся достаточно сложно управлять.
Сдвиг ничего не уменьшает. Эффективная разрядность AЦП какой была, такой и остаётся.
Аватара пользователя
ddr4
Потрогал лапой паяльник
Сообщения: 352
Зарегистрирован: Ср дек 30, 2020 23:05:29

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

Сообщение ddr4 »

.

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

Изображение
Bodden
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Чт дек 27, 2018 18:36:11

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

Сообщение Bodden »

Спасибо, попробую такой вариант
2022-06-10_195600.png
(27.11 КБ) 93 скачивания
Добавлено after 1 minute 26 seconds:
Программно еще не корректировал. По тестирую.
Аватара пользователя
korsaj
Потрогал лапой паяльник
Сообщения: 330
Зарегистрирован: Чт июн 23, 2011 07:55:51

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

Сообщение korsaj »

Поигрался от скуки..
Вложения
Ashampoo_Snap_2022.06.10_19h55m47s_001_.png
(16.41 КБ) 91 скачивание
Аватара пользователя
ddr4
Потрогал лапой паяльник
Сообщения: 352
Зарегистрирован: Ср дек 30, 2020 23:05:29

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

Сообщение ddr4 »

.
Обновлённый вариант на двух дифф.усилителях, 4-х делителях, и с 4-мя АЦП-пинами.
Положительное входное напряжение на Vin1, Vin2, отрабатывается через АЦП-pin1 и pin2, отрицательное через АЦП-pin-3/4. Смешанное через смешанные состояние АЦП-пинов.
Изображение
Bodden
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Чт дек 27, 2018 18:36:11

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

Сообщение Bodden »

Подскажите пожалуйста, для чего задействовали по два пина ADC?
Аватара пользователя
ddr4
Потрогал лапой паяльник
Сообщения: 352
Зарегистрирован: Ср дек 30, 2020 23:05:29

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

Сообщение 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) ).

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

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

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

Вернуться в «AVR»