ATmega + 12bit ADC

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

Re: ATmega + 12bit ADC

Сообщение slav0n »

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

Re: ATmega + 12bit ADC

Сообщение Dimon456 »

Starichok51,
Спойлер

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

volatile bool ain_status;

volatile uint16_t sum_u;
volatile uint16_t sum_i;

volatile uint16_t u_izm;
volatile uint16_t i_izm;

// ADC interrupt service routine
// with auto input scanning
ISR(ADC_vect)
{
static uint8_t count = 0;
static uint16_t adc_data[2]={0,0};

// Read the AD conversion result
adc_data[count%2] += ADCW;

   if (count++ > ((63*2)))  {
      count = 0;
      sum_u = adc_data[0]; adc_data[0]=0;
      sum_i = adc_data[1]; adc_data[1]=0;
	  ain_status = 1;
   }

// Select next ADC input
ADMUX=(0 | ADC_VREF_TYPE) + count%2;

// Delay needed for the stabilization of the ADC input voltage
_delay_us(10);	// если требуется, если без нее будет работать то хорошо

// Start the AD conversion
ADCSRA|=(1<<ADSC);

}


// где-то в цикле while
		if(ain_status) {
			ain_status = 0;

			  u_izm = sum_u >> 3;	// 13 bit
			  i_izm = sum_i >> 3;
		}
slav0n писал(а):и в моих проектах есть секундомер.
Прерывание идет с частотой 104мкс, ну милли секунды ты же не отображаешь на экране.
Добавь в прерывание счетчик. 1/104мкс = ~9615 прерываний на 1 секунду.
Аватара пользователя
Starichok51
Модератор
Сообщения: 19039
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Re: ATmega + 12bit ADC

Сообщение Starichok51 »

Dimon456, мне не надо приближенное число прерываний за 1 секунду.
но тут могу согласиться, что можно сделать непрерывные измерения по счетчику, по 1024 (или даже по 4096) напряжения и тока. а оставшееся время до окончания секунды АЦП будет отдыхать.
но зачем мне перелопачивать прошивку ради таких изменений, если меня полностью устраивает существующая прошивка?
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Re: ATmega + 12bit ADC

Сообщение Dimon456 »

Насколько мне помнится [uquote="Starichok51",url="/forum/viewtopic.php?p=4077242#p4077242"]а вы оба приводили текст на Си, где вообще нет привязки к реальному времени - "тупое" непрерывное суммирование в цикле.[/uquote]вот я предложил свой вариант, а использовать его или нет, это ваше право.
Starichok51 писал(а):мне не надо приближенное число прерываний за 1 секунду.
все равно у тебя, как и у меня, нет прибора, что бы измерить с точностью до 9 знака. Точно идут только DS3231.
Аватара пользователя
Starichok51
Модератор
Сообщения: 19039
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Re: ATmega + 12bit ADC

Сообщение Starichok51 »

если ты про точность времени, то мне не нужна офигенная точность. мне достаточно купленного кварца на 8 МГц.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

Re: ATmega + 12bit ADC

Сообщение Alexeyslav »

здесь это не подходит, здесь надо накапливать шум
шум как раз накапливать не нужно, его нужно усреднять. За счет шума проявляется дробная часть разряда в пределах которого находится измеряемая величина. Но для этого шум должен быть с нормальным распределением(а не тот цифровой что проникает на вход контроллера) и усреднением он не теряется.
на входе стоит у меня фильтр - делитель 51к-10к и параллельно 10к конденсатор 220 нФ. то есть, постоянная времени около 2 мс, что соответствует предлагаемым тобой 500 Гц.
мало. Это аккуратно прямо впритык к необходимому, а надо чтобы надёжно перекрывало, ибо фильтр 1 порядка очень плавный. Поскольку тебе не надо измерять напряжение настолько быстро, можно фильтровать с частотой среза 10Гц.

Альтернативный вариант, как увеличить разрядность - сделать небольшой ЦАП с выходом в 2...4мВ(сколько там доля младшего разряда?) на 3 бита и использовать его как "землю" делителя входного, таким образом у вас появится возможность перемещать входной сигнал на кратные доли младшего разряда, 8 измерений с перебором этой опоры и подсчет статистики(усреднение?) даст вам дополнительную разрядность, уже не зависящую от наличия шума в исходном сигнале.
Аватара пользователя
slav0n
Опытный кот
Сообщения: 882
Зарегистрирован: Ср дек 01, 2010 00:38:15
Откуда: Харьков
Контактная информация:

Re: ATmega + 12bit ADC

Сообщение slav0n »

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

Re: ATmega + 12bit ADC

Сообщение Dimon456 »

Alexeyslav писал(а):можно фильтровать с частотой среза 10Гц.
Да вы, уж 10мкф поставьте и будем вам счастье, а лучше 200мкф или 4700мкф.
Частота среза фильтра должна быть половине частоты работы ацп. Если вы будете еще резать, вы будете урезать динамический диапазон АЦП.
Alexeyslav писал(а):даст вам дополнительную разрядность, уже не зависящую от наличия шума в исходном сигнале.
Шум, не зависимо какой он носит характер, амплитудой к примеру 2милли вольта, а при режиме ограничения тока он может достигать 100 милли вольт, нельзя идентифицировать как полезный сигнал.
Хоть заусредняйтесь, всему есть предел.

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

Re: ATmega + 12bit ADC

Сообщение slav0n »

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

Re: ATmega + 12bit ADC

Сообщение Dimon456 »

slav0n, давай так. не менее 100 мВ, у Starichok51, 20 вольт максимум 10 бит АЦП, на 1 бит получается 20 милли вольт, шум идет амплитудой 100 милли вольт, 10 бит АЦП с легкостью справляется без всякого там оверсемплинга.

Давай мой пример, 1 миро ампер, 10 битный АЦП не пойдет, слишком много отсчетов надо.
12 битный АЦП, 32768 отсчетов, получается 28 бит, сдвигаем на 3 бита, получаем 25 бит, чисто теоретически 15000000*1/16777216=0,8 микро ампера. Правильно или нет?
Аватара пользователя
slav0n
Опытный кот
Сообщения: 882
Зарегистрирован: Ср дек 01, 2010 00:38:15
Откуда: Харьков
Контактная информация:

Re: ATmega + 12bit ADC

Сообщение slav0n »

Dimon456 писал(а):12 битный АЦП, 32768 отсчетов, получается 28 бит, сдвигаем на 3 бита, получаем 25 бит, чисто теоретически 15000000*1/16777216=0,8 микро ампера. Правильно или нет?
неправильно.
32768 отсчета могут дать максимум +7 бит с усреднением 2.
(4^7 + 4^7 = 32768)
ohmycode!
primuss3.com
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Re: ATmega + 12bit ADC

Сообщение Dimon456 »

slav0n, правильно, не правильно, не важно.
1 видео
Спойлербез СС, АЦП 12 бит, скорость одного преобразования 6 мкс, количество отсчетов 131072
Верхняя строка сумма после сдвига на 5 бит
2 видео
Спойлербез СС, АЦП 12 бит, скорость одного преобразования 18 мкс, количество отсчетов 4096
Верхняя строка сумма без сдвига, сдвиг не требуется
Микро амперы не удалось померить, померим милли амперы
3 видео
Спойлербез СС, АЦП 10 бит, скорость одного преобразования 18 мкс, количество отсчетов 1024
Верхняя строка сумма после сдвига на 6 бит

да, я тут нагрузку добавил дополнительную в ~1 ампер
Вот это можно усреднять.
Аватара пользователя
Starichok51
Модератор
Сообщения: 19039
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Re: ATmega + 12bit ADC

Сообщение Starichok51 »

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

Re: ATmega + 12bit ADC

Сообщение slav0n »

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

Re: ATmega + 12bit ADC

Сообщение Dimon456 »

Starichok51 писал(а):какие биты выведены и где остальные?
младшие 16 бит, блин, я только сейчас заметил, на верхнию строку выведен результат преобразования

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

sum*15000000UL/(4096UL << 12)
Добавлено after 1 minute 58 seconds:
slav0n писал(а):первые два видоса показывают мусор
по чему мусор, как раз шум который нельзя идентифицировать как полезный сигнал.
Аватара пользователя
slav0n
Опытный кот
Сообщения: 882
Зарегистрирован: Ср дек 01, 2010 00:38:15
Откуда: Харьков
Контактная информация:

Re: ATmega + 12bit ADC

Сообщение slav0n »

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

Re: ATmega + 12bit ADC

Сообщение Dimon456 »

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

Жаль АЦП на 1мкс не завелся, отказался калибровку проходить, а так бы я бы его нагнул 500к выборок.
Аватара пользователя
slav0n
Опытный кот
Сообщения: 882
Зарегистрирован: Ср дек 01, 2010 00:38:15
Откуда: Харьков
Контактная информация:

Re: ATmega + 12bit ADC

Сообщение slav0n »

Dimon456 писал(а):Микро амперы не удалось померить
сколько тебе надо добавить бит, что бы померить микроамперы?

Добавлено after 13 minutes 21 second:
Starichok51 писал(а):у тебя в первых двух видео 24 бита
у него там не 24 бита, а полная ерунда и хаос.
чтобы получить 24 бита, т.е. +12, надо сделать сумму 4^12 = 16777216 семплов и сдвинуть ее на 12
ohmycode!
primuss3.com
Аватара пользователя
Starichok51
Модератор
Сообщения: 19039
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Re: ATmega + 12bit ADC

Сообщение Starichok51 »

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

Re: ATmega + 12bit ADC

Сообщение Dimon456 »

Starichok51 писал(а):что-то мне кажется,
А мне не кажется.
Есть stm32 - это 32 битная шина данных, есть PLP, и есть 48МГц, есть DMA, есть буфер на 1024, прерывание DMA срабатывает по половинке и полный,
грубо говоря у меня есть половина времени 1024 буфера, 512 * на скорость АЦП, что там в 1 видео было, 6мкс, и того 512*6=3072мкс, вот мое время.

Вот мой код прерывания DMA
Спойлер

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

#define dsp_count 4UL	// 1024 выборки

void DMA1_Channel1_IRQHandler(void)
{
	static uint32_t avg_u;
	static uint32_t avg_i;
	static uint32_t avg_t_u;
	static uint32_t avg_t_i;
	static uint16_t count=0;
	uint16_t *dp;
	uint32_t irq; uint16_t n;

	DMA1->IFCR = irq = DMA1->ISR & DDS_IRQ_MASK;	/* Get and clear the irq flags */
	dp = &ADC_values[(irq & DMA_ISR_TCIF1) ? ARRAYSIZE / 2 : 0];	/* Last or Half transfer? (determins which part of circular buffer to be filled) */

	n = ARRAYSIZE / 4;			/* Number of samples (fill half of the circular buffer) */
	avg_u = 0; avg_i=0;
	do {
	avg_u += *dp; dp += 1;
	avg_i += *dp; dp += 1;
	} while (--n != 0);

	avg_t_u += avg_u;
	avg_t_i += avg_i;

	if(count++ == (dsp_count-1)) {

	ain[0] = avg_t_u;
	ain[1] = avg_t_i;

	ain_status = 1;

	count=0; avg_t_u=0; avg_t_i=0;
	}

}
А если рассматривать с такой стороны, когда флаг ain_status, а он поднимается раз в 1024 выборки на каждый канал, а это 2048 всего выборок, то 6мкс * 2048 уже получается 12288мкс - вагон времени когда ain[0] и ain[1] обновятся.
Ответить

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