ATmega + 12bit ADC

Обсуждаем контроллеры компании Atmel.
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Re: ATmega + 12bit ADC

Сообщение Dimon456 »

slav0n, молодец, садись, пять.
Теперь то же самое, только на реальном устройстве.

Я не зря картинку давал
СпойлерИзображение
Столько хватит шума?
Как один человек сказал - что же хваленый СТМ шумит аж в трех младших разрядах. И это на опоре ТЛ431 = 3,3 счем-то там, не помню, лень смотреть.

Что же мы все делаем, берем сумму к примеру из 64 отсчетов и делим на 64.

Первый вопрос slav0n, по чему не на 63, ну взяли бы сумму из 63 и поделили на 63, нет берем сумму кратную степени 2 и делим на степень 2.
slav0n писал(а):та забыли уже про того чувака с его 240
Что же на самом деле произошло у slav0n: он взял сумму из 64 и сдвинул на 3 бита вправо, эти 3 бита несут какую-то информацию.
Второй вопрос slav0n, какую информацию?
далее оставшееся от сдвига на три бита умножил на опору 5000.0 (усилил, просто взял и усилил на какой то К) и поделил на что там не хватает.

Далее мне лень объяснять, может так дойдет.
Верьте в чудо, а Starichok51, просто взял и поставил ADS1115, и молчит, а я stm32f030.
Реклама
Аватара пользователя
slav0n
Опытный кот
Сообщения: 882
Зарегистрирован: Ср дек 01, 2010 00:38:15
Откуда: Харьков
Контактная информация:

Re: ATmega + 12bit ADC

Сообщение slav0n »

Dimon456 писал(а):по чему не на 63, ну взяли бы сумму из 63 и поделили на 63, нет берем сумму кратную степени 2 и делим на степень 2.
ты снова пропустил уроки...
правильно вот так - берем сумму из кратных 4^N выборок и делим на 2^N. целочисленно
Dimon456 писал(а):взял сумму из 64 и сдвинул на 3 бита вправо, эти 3 бита несут какую-то информацию.
Второй вопрос slav0n, какую информацию?
незначащую бесполезную информацию, которую бессмысленно использовать в дальнейших вычислениях.

Добавлено after 2 hours 23 minutes 44 seconds:
кстати, множитель 4^N выборок удобно брать из весов разрядов (2, 4, 8, 16...)
тогда децимацию и усреднение можно делать одновременно одним сдвигом

Добавлено after 2 hours 50 minutes 27 seconds:
Dimon456 писал(а):Столько хватит шума?
а такой шум тебе нравится или нет?

Изображение
Вложения
aref noise.gif
(64.76 КБ) 561 скачивание
ohmycode!
primuss3.com
Реклама
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Re: ATmega + 12bit ADC

Сообщение Dimon456 »

slav0n писал(а):незначащую бесполезную информацию, которую бессмысленно использовать в дальнейших вычислениях.
А ты попробуй

Код: Выделить всё

return adcv_value;	// >> 3;//13 bit

soft = ADCV_Conv() * 5000.0 / (1024UL << (3 + 3));
Аватара пользователя
slav0n
Опытный кот
Сообщения: 882
Зарегистрирован: Ср дек 01, 2010 00:38:15
Откуда: Харьков
Контактная информация:

Re: ATmega + 12bit ADC

Сообщение slav0n »

сколько выборок суммировать?
а впрочем не важно...
ты предлагаешь то что есть умножить на 8 и разделить на 8192
ohmycode!
primuss3.com
Реклама
Эиком - электронные компоненты и радиодетали
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Re: ATmega + 12bit ADC

Сообщение Dimon456 »

Спойлер

Код: Выделить всё

unsigned int ADCV_Conv(void) {
	unsigned long adcv_value = 0; //сброс регистра хранения результата оцифровки напряжения
//	ADMUX &= ~((1 << MUX3) | (1 << MUX2) | (1 << MUX1) | (1 << MUX0)); //выбор канала АЦП ADC0
//	_delay_us(10); //пауза 10мкс
	u16 rounds = 64;//13 bit
	for (u16 i = 0; i < rounds; i++) //цикл суммирования результатов оцифровки 64 замеров
	{
		ADCSRA |= (1 << ADSC); //запуск АЦП
		while ((ADCSRA & (1 << ADSC))); //ожидание окончания преобразования
		adcv_value += ADCW; //прибавим к сумме значений предыдущих измерений значение очередного измерения
	}
	return adcv_value;	// >> 3;//13 bit
}


soft = ADCV_Conv() * 5000.0 / (1024UL << (3 + 3));
Реклама
Аватара пользователя
slav0n
Опытный кот
Сообщения: 882
Зарегистрирован: Ср дек 01, 2010 00:38:15
Откуда: Харьков
Контактная информация:

Re: ATmega + 12bit ADC

Сообщение slav0n »

смотри ответ выше
ohmycode!
primuss3.com
Реклама
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Re: ATmega + 12bit ADC

Сообщение Dimon456 »

slav0n писал(а):то что есть умножить на 8 и разделить на 8192
по чему умножить на 8?
Сумму из 64 выборок умножаем на 5000.0 и делим на 65536, твои 16 бит.
Аватара пользователя
Starichok51
Модератор
Сообщения: 19054
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Re: ATmega + 12bit ADC

Сообщение Starichok51 »

Dimon456, сумму 64 выборок следует делить на 8, чтобы получить 13 бит.
а ты взялся делить на 64.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Аватара пользователя
slav0n
Опытный кот
Сообщения: 882
Зарегистрирован: Ср дек 01, 2010 00:38:15
Откуда: Харьков
Контактная информация:

Re: ATmega + 12bit ADC

Сообщение slav0n »

Dimon456 писал(а):Сумму из 64 выборок умножаем на 5000.0 и делим на 65536
это банальное усреднение, никакого увеличения разрядности не дает
оно даже не может толком отфильтровать мою помеху
ohmycode!
primuss3.com
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Re: ATmega + 12bit ADC

Сообщение Dimon456 »

slav0n, а ты на что делишь?
Сумму из 64 выборок делишь на 8, далее умножаешь на 5000.0 и еще раз делишь на 8192. Результат 13 бит.

А усреднение: сумму из 64 выборок делишь на 64, далее умножаешь на 5000.0 и еще раз делишь на 1024. Результат 10 бит.

В чем проблема?
Последний раз редактировалось Dimon456 Пт авг 13, 2021 21:40:01, всего редактировалось 1 раз.
Аватара пользователя
slav0n
Опытный кот
Сообщения: 882
Зарегистрирован: Ср дек 01, 2010 00:38:15
Откуда: Харьков
Контактная информация:

Re: ATmega + 12bit ADC

Сообщение slav0n »

все правильно
Dimon456 писал(а):Сумму из 64 выборок делишь на 8
получаешь +3 бита разрешения
Dimon456 писал(а):сумму из 64 выборок делишь на 64
получаешь +0 бит разрешения

и наличие шума в сигнале здесь имеет решающую роль
ohmycode!
primuss3.com
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Re: ATmega + 12bit ADC

Сообщение Dimon456 »

Я тебе предлагаю
Dimon456 писал(а):Сумму из 64 выборок умножаем на 5000.0 и делим на 65536, твои 16 бит.
Аватара пользователя
slav0n
Опытный кот
Сообщения: 882
Зарегистрирован: Ср дек 01, 2010 00:38:15
Откуда: Харьков
Контактная информация:

Re: ATmega + 12bit ADC

Сообщение slav0n »

та делал я это - фигня, 10 бит.

я тут поставил опору 4096, так вообще не надо ничего умножать-делить

Код: Выделить всё

unsigned int ADCV_Conv(void) {
	unsigned long adcv_value = 0;
	u16 rounds = 16 * 16;//+2 bit
	for (u16 i = 0; i < rounds; i++){	
		ADCSRA |= (1 << ADSC); //запуск АЦП
		while ((ADCSRA & (1 << ADSC))); //ожидание окончания преобразования
		adcv_value += ADC;
	}
	return adcv_value >> (2 + 4);//+2 bit
}		

    u16 soft = ADCV_Conv();//+2 bit
    ledprint(soft, 5);
ohmycode!
primuss3.com
Аватара пользователя
Starichok51
Модератор
Сообщения: 19054
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Re: ATmega + 12bit ADC

Сообщение Starichok51 »

Dimon456, извини, выше я был не прав, а ты прав.
деление суммы на 8 и последующее деление на 8192 можно заменить одним делением на 65536.
а деление на 65536 после умножения на 5000 можно заменить отбрасыванием двух младших байтов, если на ассемблере делать.
slav0n писал(а):u16 rounds = 16 * 16;//+2 bit
16 * 16 = 256 выборок, а это дает +4 бита. но ты после сдвига оставляешь только 2 дополнительных бита.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Re: ATmega + 12bit ADC

Сообщение Dimon456 »

slav0n, вот смотри
СпойлерИзображение
Добавлено after 4 minutes 26 seconds:
Starichok51 писал(а):деление суммы на 8
при делении на 8 он отбрасывает 3 младших бита, которые несут информацию.
slav0n писал(а):я тут поставил опору 4096
Не всегда можно опору уменьшить, к примеру у stm32f030f4p6 имеется вывод под опору, хотел уменьшить с 3.3В до 2.048, из-за того что чип урезанный и где-то что там внутри не так спаяно, одним словом мк переставал работать.
Аватара пользователя
slav0n
Опытный кот
Сообщения: 882
Зарегистрирован: Ср дек 01, 2010 00:38:15
Откуда: Харьков
Контактная информация:

Re: ATmega + 12bit ADC

Сообщение slav0n »

Dimon456 писал(а):при делении на 8 он отбрасывает 3 младших бита, которые несут информацию.
правильно, потому что там она бесполезна
но при этом я сохраняю 3 дополнительных бита с весьма полезной информацией
а ты мне предлагаешь сдвинуть сразу на 6 бит и все уничтожить
не, так не пойдет

Добавлено after 26 minutes:
кстати, ранее был вопрос про цифры [uquote="parovoZZ",url="/forum/viewtopic.php?p=4074682#p4074682"][uquote="Starichok51",url="/forum/viewtopic.php?p=4074597#p4074597"]тут всё до предела просто:
сумма 4 выборок добавляет 1 бит.
сумма 16 выборок добавляет 2 бита.
сумма 64 выборок добавляет 3 бита.
сумма 256 выборок добавляет 4 бита.
сумма 1024 выборок добавляет 5 бит.[/uquote]
это теорема какая-то или что? Откуда взяты эти цифры?[/uquote]
4 = 1 бит + 1 бит
16 = 2 бита + 2 бита
64 = 3 бита + 3 бита
256 = 4 бита + 4 бита
1024 = 5 бит + 5 бит

Добавлено after 36 minutes 38 seconds:
Dimon456 писал(а):slav0n, вот смотри
и что я вижу - софтовый оверсемплинг меги лучше хардового 12бит ацп
ohmycode!
primuss3.com
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Re: ATmega + 12bit ADC

Сообщение Dimon456 »

slav0n писал(а):и что я вижу - софтовый оверсемплинг меги лучше хардового
Ты слишком то не радуйся, это же протеус, там все идеально.

Я сейчас глянул мануал на stm32f030

Код: Выделить всё

Bit 4:3 RES[1:0]: Data resolution
These bits are written by software to select the resolution of the conversion.
00: 12 bits
01: 10 bits
10: 8 bits
11: 6 bits
Давай проверим в реальном железе, но будем использовать тот шум который есть, то есть без добавления шума на опору? Это вопрос, жду ответа.
Аватара пользователя
slav0n
Опытный кот
Сообщения: 882
Зарегистрирован: Ср дек 01, 2010 00:38:15
Откуда: Харьков
Контактная информация:

Re: ATmega + 12bit ADC

Сообщение slav0n »

к сожалению с железками придется подождать, сломал ногу, еще месяц в гипсе.
А пока вот моя гифка симуляции:
СпойлерИзображение
ohmycode!
primuss3.com
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Re: ATmega + 12bit ADC

Сообщение Dimon456 »

Я прогнал 10 бит
Спойлер

Код: Выделить всё

	  ADC1->CFGR1 |= (uint32_t)(ADC_Resolution_10b | ((uint32_t)(1) << 13) |
			  ADC_ExternalTrigConvEdge_None  |
			  ADC_DataAlign_Right | ADC_ScanDirection_Upward);

#define ARRAYSIZE 2*64

Umax_adc = 3300;

          	for( uint8_t s = 0; s< ARRAYSIZE; s++)
          	{
          		ain[0] += ADC_values[s++];
          		ain[1] += ADC_values[s];
          	}			  
			  ain[0] = (uint16_t) (ain[0] >> 3);
			  ain[1] = (uint16_t) (ain[1] >> 3);
			  
			tlong = ain[0];
			tlong = (uint32_t)((tlong * (uint32_t)Umax_adc)/(1024 << 3));       // 10 бит			  
			u_izm = tlong;		// 0-30 В  
Данные измерения
Спойлер

Код: Выделить всё

На выходе	4,996В		10 бит									
												
											DAC +0,01В		АЦП
		ADC_values[0]	153									
		ADC_values[2]	154							497		5,00
		ADC_values[4]	154							498		5,01
		ADC_values[6]	153							499		5,01
		ADC_values[8]	153							500		5,02
		ADC_values[10]	154							501		5,03
		ADC_values[12]	153							502		5,04
		ADC_values[14]	154							503		5,05
		ADC_values[16]	154							504		5,06
		ADC_values[18]	154							505		5,07
		ADC_values[20]	153							506		5,08
		ADC_values[22]	154							507		5,09
		ADC_values[24]	154							508		5,10
		ADC_values[26]	153							509		
		ADC_values[28]	154									
		ADC_values[30]	153									
		ADC_values[32]	154									
		ADC_values[34]	153									
		ADC_values[36]	154									
		ADC_values[38]	153																	
		ADC_values[40]	153									
		ADC_values[42]	153									
		ADC_values[44]	155									
		ADC_values[46]	154									
		ADC_values[48]	153									
		ADC_values[50]	154									
		ADC_values[52]	154									
		ADC_values[54]	153									
		ADC_values[56]	153									
		ADC_values[58]	153									
		ADC_values[60]	154									
		ADC_values[62]	154									
		ADC_values[64]	153									
		ADC_values[66]	154									
		ADC_values[68]	153									
		ADC_values[70]	153									
		ADC_values[72]	153									
		ADC_values[74]	154									
		ADC_values[76]	153									
		ADC_values[78]	153									
		ADC_values[80]	154									
		ADC_values[82]	154									
		ADC_values[84]	154									
		ADC_values[86]	154									
		ADC_values[88]	153									
		ADC_values[90]	154									
		ADC_values[92]	153									
		ADC_values[94]	153									
		ADC_values[96]	151									
		ADC_values[98]	154									
		ADC_values[100]	153									
		ADC_values[102]	154									
		ADC_values[104]	154									
		ADC_values[106]	154									
		ADC_values[108]	154									
		ADC_values[110]	153									
		ADC_values[112]	154									
		ADC_values[114]	154									
		ADC_values[116]	154									
		ADC_values[118]	153									
		ADC_values[120]	154									
		ADC_values[122]	153									
		ADC_values[124]	153									
		ADC_values[126]	154									
																		
						9825		>>3	1228		499				
мне мало стало, еще 8 бит прогнал
Спойлер

Код: Выделить всё

	  ADC1->CFGR1 |= (uint32_t)(ADC_Resolution_8b | ((uint32_t)(1) << 13) |
			  ADC_ExternalTrigConvEdge_None  |
			  ADC_DataAlign_Right | ADC_ScanDirection_Upward);
			  
              ain[0] = (uint16_t) (ain[0] >> 1);
              ain[1] = (uint16_t) (ain[1] >> 1);

			tlong = ain[0];
			tlong = (uint32_t)((tlong * (uint32_t)Umax_adc)/(256 << 5));       // 8 бит			  
			u_izm = tlong;		// 0-30 В     
измерения
Спойлер

Код: Выделить всё

	4,996В		8 бит									
												
												DAC +0,01В	АЦП
		ADC_values[0]	38									
		ADC_values[2]	38							501		4,99
		ADC_values[4]	38							502		5,00
		ADC_values[6]	38							503		5,02
		ADC_values[8]	38							504		5,03
		ADC_values[10]	38							505		5,03
		ADC_values[12]	38							506		5,03
		ADC_values[14]	38							507		5,04
		ADC_values[16]	38							508		5,05
		ADC_values[18]	38							509		5,06
		ADC_values[20]	38							510		5,07
		ADC_values[22]	38							511		5,07
		ADC_values[24]	38							512		5,08
		ADC_values[26]	38							513		5,09
		ADC_values[28]	38							514		5,11
		ADC_values[30]	38									
		ADC_values[32]	38									
		ADC_values[34]	38									
		ADC_values[36]	38									
		ADC_values[38]	38									
		ADC_values[40]	38									
		ADC_values[42]	38									
		ADC_values[44]	38									
		ADC_values[46]	38									
		ADC_values[48]	38									
		ADC_values[50]	38									
		ADC_values[52]	38									
		ADC_values[54]	38									
		ADC_values[56]	38									
		ADC_values[58]	38									
		ADC_values[60]	38									
		ADC_values[62]	38									
		ADC_values[64]	38									
		ADC_values[66]	38									
		ADC_values[68]	38									
		ADC_values[70]	38									
		ADC_values[72]	38									
		ADC_values[74]	38									
		ADC_values[76]	38									
		ADC_values[78]	38									
		ADC_values[80]	38									
		ADC_values[82]	38									
		ADC_values[84]	38									
		ADC_values[86]	38									
		ADC_values[88]	38									
		ADC_values[90]	38									
		ADC_values[92]	38									
		ADC_values[94]	38									
		ADC_values[96]	38									
		ADC_values[98]	38									
		ADC_values[100]	38									
		ADC_values[102]	38									
		ADC_values[104]	38									
		ADC_values[106]	38									
		ADC_values[108]	38									
		ADC_values[110]	38									
		ADC_values[112]	38									
		ADC_values[114]	38									
		ADC_values[116]	38									
		ADC_values[118]	37									
		ADC_values[120]	38									
		ADC_values[122]	38									
		ADC_values[124]	38									
		ADC_values[126]	38									
																						
						2431		>> 1	1216		492				
DAC прибавляет строго по 0,01В.
У меня смещение задано относительно 0, для 12бит составляет -6 единиц АЦП, может по этому не соответствие 499 и 492.
На ножку АЦП подано с буферного ОУ через RC цепь, 200 Ом и 10нФ.

Еще используется скользящее среднее
Спойлер

Код: Выделить всё

// глубина буфера усреднения. чем больше, тем сильнее фильтрация и медленнее работа
// очень хорошо, если число кратно степени двойки (т.е. 1, 2, 4, 8, 16, 32, 64 и т.д.)
#define AVERAGE_DEPTH	K	//8
// функция получает результат очередного замера и возвращает отфильтрованное значение
uint16_t get_average_u(uint16_t val){
  static uint16_t buf[64];
  static uint8_t cur;
  uint32_t sum = 0;

  buf[cur++] = val;
  if(cur >= AVERAGE_DEPTH) cur = 0;

  for(uint8_t i=0; i < AVERAGE_DEPTH; i++) sum += buf[i];

  return sum / AVERAGE_DEPTH;
}
K = 8, я его пробовал в меню крутить, но так же на 8 оставил.
Аватара пользователя
slav0n
Опытный кот
Сообщения: 882
Зарегистрирован: Ср дек 01, 2010 00:38:15
Откуда: Харьков
Контактная информация:

Re: ATmega + 12bit ADC

Сообщение slav0n »

Dimon456 писал(а):DAC прибавляет строго по 0,01В.
это фигня.
сделай шаг 0.001В в секунду
ohmycode!
primuss3.com
Ответить

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