я тожеStarichok51 писал(а):это ты не в "ту степь" попал я считал по коду от Dimon456 для АТмеги.
ATmega + 12bit ADC
- slav0n
- Опытный кот
- Сообщения: 882
- Зарегистрирован: Ср дек 01, 2010 00:38:15
- Откуда: Харьков
- Контактная информация:
Re: ATmega + 12bit ADC
ohmycode!
primuss3.com
primuss3.com
Re: ATmega + 12bit ADC
Starichok51,
Добавь в прерывание счетчик. 1/104мкс = ~9615 прерываний на 1 секунду.
Спойлер
Код: Выделить всё
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;
}
Прерывание идет с частотой 104мкс, ну милли секунды ты же не отображаешь на экране.slav0n писал(а):и в моих проектах есть секундомер.
Добавь в прерывание счетчик. 1/104мкс = ~9615 прерываний на 1 секунду.
- Starichok51
- Модератор
- Сообщения: 19039
- Зарегистрирован: Сб авг 14, 2010 15:05:51
- Откуда: г. Озерск, Челябинская обл.
Re: ATmega + 12bit ADC
Dimon456, мне не надо приближенное число прерываний за 1 секунду.
но тут могу согласиться, что можно сделать непрерывные измерения по счетчику, по 1024 (или даже по 4096) напряжения и тока. а оставшееся время до окончания секунды АЦП будет отдыхать.
но зачем мне перелопачивать прошивку ради таких изменений, если меня полностью устраивает существующая прошивка?
но тут могу согласиться, что можно сделать непрерывные измерения по счетчику, по 1024 (или даже по 4096) напряжения и тока. а оставшееся время до окончания секунды АЦП будет отдыхать.
но зачем мне перелопачивать прошивку ради таких изменений, если меня полностью устраивает существующая прошивка?
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Re: ATmega + 12bit ADC
Насколько мне помнится [uquote="Starichok51",url="/forum/viewtopic.php?p=4077242#p4077242"]а вы оба приводили текст на Си, где вообще нет привязки к реальному времени - "тупое" непрерывное суммирование в цикле.[/uquote]вот я предложил свой вариант, а использовать его или нет, это ваше право.
все равно у тебя, как и у меня, нет прибора, что бы измерить с точностью до 9 знака. Точно идут только DS3231.Starichok51 писал(а):мне не надо приближенное число прерываний за 1 секунду.
- Starichok51
- Модератор
- Сообщения: 19039
- Зарегистрирован: Сб авг 14, 2010 15:05:51
- Откуда: г. Озерск, Челябинская обл.
Re: ATmega + 12bit ADC
если ты про точность времени, то мне не нужна офигенная точность. мне достаточно купленного кварца на 8 МГц.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
-
Alexeyslav
- Друг Кота
- Сообщения: 4550
- Зарегистрирован: Чт май 05, 2011 21:26:34
- Откуда: Украина, Славутич
- Контактная информация:
Re: ATmega + 12bit ADC
шум как раз накапливать не нужно, его нужно усреднять. За счет шума проявляется дробная часть разряда в пределах которого находится измеряемая величина. Но для этого шум должен быть с нормальным распределением(а не тот цифровой что проникает на вход контроллера) и усреднением он не теряется.здесь это не подходит, здесь надо накапливать шум
мало. Это аккуратно прямо впритык к необходимому, а надо чтобы надёжно перекрывало, ибо фильтр 1 порядка очень плавный. Поскольку тебе не надо измерять напряжение настолько быстро, можно фильтровать с частотой среза 10Гц.на входе стоит у меня фильтр - делитель 51к-10к и параллельно 10к конденсатор 220 нФ. то есть, постоянная времени около 2 мс, что соответствует предлагаемым тобой 500 Гц.
Альтернативный вариант, как увеличить разрядность - сделать небольшой ЦАП с выходом в 2...4мВ(сколько там доля младшего разряда?) на 3 бита и использовать его как "землю" делителя входного, таким образом у вас появится возможность перемещать входной сигнал на кратные доли младшего разряда, 8 измерений с перебором этой опоры и подсчет статистики(усреднение?) даст вам дополнительную разрядность, уже не зависящую от наличия шума в исходном сигнале.
- slav0n
- Опытный кот
- Сообщения: 882
- Зарегистрирован: Ср дек 01, 2010 00:38:15
- Откуда: Харьков
- Контактная информация:
Re: ATmega + 12bit ADC
просто накапливать и усреднять шум нужно окном не короче 4^NAlexeyslav писал(а):шум как раз накапливать не нужно, его нужно усреднять. За счет шума проявляется дробная часть разряда в пределах которого находится измеряемая величина. Но для этого шум должен быть с нормальным распределением(а не тот цифровой что проникает на вход контроллера) и усреднением он не теряется.
ohmycode!
primuss3.com
primuss3.com
Re: ATmega + 12bit ADC
Да вы, уж 10мкф поставьте и будем вам счастье, а лучше 200мкф или 4700мкф.Alexeyslav писал(а):можно фильтровать с частотой среза 10Гц.
Частота среза фильтра должна быть половине частоты работы ацп. Если вы будете еще резать, вы будете урезать динамический диапазон АЦП.
Шум, не зависимо какой он носит характер, амплитудой к примеру 2милли вольта, а при режиме ограничения тока он может достигать 100 милли вольт, нельзя идентифицировать как полезный сигнал.Alexeyslav писал(а):даст вам дополнительную разрядность, уже не зависящую от наличия шума в исходном сигнале.
Хоть заусредняйтесь, всему есть предел.
Хотите еще тест, давайте, к примеру, попробуем измерить микро амперы, сейчас у меня максимум 15 ампер на 12 битный АЦП, на 1 бит получается 3,6 милли ампера, давайте микроамперы попробуем измерить?
- slav0n
- Опытный кот
- Сообщения: 882
- Зарегистрирован: Ср дек 01, 2010 00:38:15
- Откуда: Харьков
- Контактная информация:
Re: ATmega + 12bit ADC
а если при этом полезный сигнал будет не менее 100 мВ, то почему нет?Dimon456 писал(а):Шум, не зависимо какой он носит характер, амплитудой к примеру 2милли вольта, а при режиме ограничения тока он может достигать 100 милли вольт, нельзя идентифицировать как полезный сигнал.
ohmycode!
primuss3.com
primuss3.com
Re: ATmega + 12bit ADC
slav0n, давай так. не менее 100 мВ, у Starichok51, 20 вольт максимум 10 бит АЦП, на 1 бит получается 20 милли вольт, шум идет амплитудой 100 милли вольт, 10 бит АЦП с легкостью справляется без всякого там оверсемплинга.
Давай мой пример, 1 миро ампер, 10 битный АЦП не пойдет, слишком много отсчетов надо.
12 битный АЦП, 32768 отсчетов, получается 28 бит, сдвигаем на 3 бита, получаем 25 бит, чисто теоретически 15000000*1/16777216=0,8 микро ампера. Правильно или нет?
Давай мой пример, 1 миро ампер, 10 битный АЦП не пойдет, слишком много отсчетов надо.
12 битный АЦП, 32768 отсчетов, получается 28 бит, сдвигаем на 3 бита, получаем 25 бит, чисто теоретически 15000000*1/16777216=0,8 микро ампера. Правильно или нет?
- slav0n
- Опытный кот
- Сообщения: 882
- Зарегистрирован: Ср дек 01, 2010 00:38:15
- Откуда: Харьков
- Контактная информация:
Re: ATmega + 12bit ADC
неправильно.Dimon456 писал(а):12 битный АЦП, 32768 отсчетов, получается 28 бит, сдвигаем на 3 бита, получаем 25 бит, чисто теоретически 15000000*1/16777216=0,8 микро ампера. Правильно или нет?
32768 отсчета могут дать максимум +7 бит с усреднением 2.
(4^7 + 4^7 = 32768)
ohmycode!
primuss3.com
primuss3.com
Re: ATmega + 12bit ADC
slav0n, правильно, не правильно, не важно.
1 видео
Верхняя строка сумма после сдвига на 5 бит
2 видео
Верхняя строка сумма без сдвига, сдвиг не требуется
Микро амперы не удалось померить, померим милли амперы
3 видео
Верхняя строка сумма после сдвига на 6 бит
да, я тут нагрузку добавил дополнительную в ~1 ампер
Вот это можно усреднять.
1 видео
Спойлер
без СС, АЦП 12 бит, скорость одного преобразования 6 мкс, количество отсчетов 131072Верхняя строка сумма после сдвига на 5 бит
Спойлер
без СС, АЦП 12 бит, скорость одного преобразования 18 мкс, количество отсчетов 4096Верхняя строка сумма без сдвига, сдвиг не требуется
3 видео
Спойлер
без СС, АЦП 10 бит, скорость одного преобразования 18 мкс, количество отсчетов 1024Верхняя строка сумма после сдвига на 6 бит
да, я тут нагрузку добавил дополнительную в ~1 ампер
Вот это можно усреднять.
- Starichok51
- Модератор
- Сообщения: 19039
- Зарегистрирован: Сб авг 14, 2010 15:05:51
- Откуда: г. Озерск, Челябинская обл.
Re: ATmega + 12bit ADC
у тебя в первых двух видео 24 бита, а на экран выведено только 16 бит.Dimon456 писал(а):Верхняя строка сумма после сдвига на 5 бит
какие биты выведены и где остальные?
если тебе интересно смотреть в двоичном виде, как скачут самые младшие биты, то могу посоветовать старшие (стабильные) биты выводить в 16-ричном виде, а младшие, прыгающие, в двоичном. тогда можно увидеть все 24 бита и даже больше.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
- slav0n
- Опытный кот
- Сообщения: 882
- Зарегистрирован: Ср дек 01, 2010 00:38:15
- Откуда: Харьков
- Контактная информация:
Re: ATmega + 12bit ADC
ну как же не важно.Dimon456 писал(а):slav0n, правильно, не правильно, не важно.
ты же сам видишь, что самое правильное 3-е видео, ибо оно сделано согласно правилам.
первые два видоса показывают мусор
ohmycode!
primuss3.com
primuss3.com
Re: ATmega + 12bit ADC
младшие 16 бит, блин, я только сейчас заметил, на верхнию строку выведен результат преобразованияStarichok51 писал(а):какие биты выведены и где остальные?
Код: Выделить всё
sum*15000000UL/(4096UL << 12)по чему мусор, как раз шум который нельзя идентифицировать как полезный сигнал.slav0n писал(а):первые два видоса показывают мусор
- slav0n
- Опытный кот
- Сообщения: 882
- Зарегистрирован: Ср дек 01, 2010 00:38:15
- Откуда: Харьков
- Контактная информация:
Re: ATmega + 12bit ADC
это и есть мусор, который бесполезно учитывать и тем более показыватьDimon456 писал(а):шум который нельзя идентифицировать как полезный сигнал.
ohmycode!
primuss3.com
primuss3.com
Re: ATmega + 12bit ADC
ну вот, значит у оверсемплинга есть предел, бесполезно повышать количество отсчетов вытягивая разрядность оверсемплинга.slav0n писал(а):который бесполезно учитывать и тем более показывать
Жаль АЦП на 1мкс не завелся, отказался калибровку проходить, а так бы я бы его нагнул 500к выборок.
- slav0n
- Опытный кот
- Сообщения: 882
- Зарегистрирован: Ср дек 01, 2010 00:38:15
- Откуда: Харьков
- Контактная информация:
Re: ATmega + 12bit ADC
сколько тебе надо добавить бит, что бы померить микроамперы?Dimon456 писал(а):Микро амперы не удалось померить
Добавлено after 13 minutes 21 second:
у него там не 24 бита, а полная ерунда и хаос.Starichok51 писал(а):у тебя в первых двух видео 24 бита
чтобы получить 24 бита, т.е. +12, надо сделать сумму 4^12 = 16777216 семплов и сдвинуть ее на 12
ohmycode!
primuss3.com
primuss3.com
- Starichok51
- Модератор
- Сообщения: 19039
- Зарегистрирован: Сб авг 14, 2010 15:05:51
- Откуда: г. Озерск, Челябинская обл.
Re: ATmega + 12bit ADC
Dimon456, что-то мне кажется, что при таком малом времени преобразования когда главный цикл увидит флаг готовности, успеет что-то просуммироваться перед обнулением сумм.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Re: ATmega + 12bit ADC
А мне не кажется.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;
}
}