АЦП. Разбор полётов

Обсуждаем контроллеры компании Atmel.
bolek
Сверлит текстолит когтями
Сообщения: 1178
Зарегистрирован: Пт авг 21, 2009 03:22:12

Re: АЦП. Разбор полётов

Сообщение bolek »

КРАМ писал(а):...Я писАл, что обработку лучше делать сразу после занесения очередного результата в массив, но при невысоких требованиях к фильтру - можно и в мэйн. Никакой особой проблемы с прерыванием расчета и изменением массива не будет. Совсем немного размоет АЧХ, много меньше, чем в первом пункте...
Поясните, pls, Вашу мысль насчет размытия АЧХ: разве стабильность АЧХ не зависит только от стабильности и равномерности проведения выборки отсчетов (запуска АЦП)?
Собственно процесс вычисления на АЧХ не должен влиять никак, при условии что он успевает выполниться за время между отсчетами. Нет?
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: АЦП. Разбор полётов

Сообщение Аlex »

Собственно процесс вычисления на АЧХ не должен влиять никак, при условии что он успевает выполниться за время медлу отсчетами. Нет?
Это условие и есть
сразу после занесения очередного результата в массив
Или нет ? :)
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: АЦП. Разбор полётов

Сообщение Аlex »

Блин, не поверите. Сижу сейчас и занимаюсь вот этой "хренью" :)))
Вчера насяльника добавил в ТЗ девайса измерение 2-х токовых сигналов. Вот сижу с этими массивами, окнами, усреднениями... :kill:
Сделал 2 буфера по 128 байт (память уже вся потрачена, иначе сделал бы больше :( ), и семплирование каждую 1мс. Сумма обновляется после каждого преобразования. Только не перебирается каждый раз весь массив, а вычитается из суммы значение текущщего элемента, затем заносится в него новое(только что преобразованное) значение и приплюсовывается к сумме.
bolek
Сверлит текстолит когтями
Сообщения: 1178
Зарегистрирован: Пт авг 21, 2009 03:22:12

Re: АЦП. Разбор полётов

Сообщение bolek »

Аlex писал(а):...Сделал 2 буфера по 128 байт (память уже вся потрачена, иначе сделал бы больше, и семплирование каждую 1мс...
Смысл то какой в таких больших буферах? Какой сигнал измеряете и с какой помехой боретесь?
Я сам ни разу реально буфера больше 32 отсчетов не использовал, обычно и 16 достаточно.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: АЦП. Разбор полётов

Сообщение Аlex »

Размер буфера выбирался из расчёта оставшейся свободной памяти и необходимого времени опроса (1 раз в сек.). Меряется обычный токовый сигнал.
Какие будут помехи и как это всё будет работать - пока неизвестно. :))

PS: Тьфу, ошибся. 2 буфера по 256 у меня...
bolek
Сверлит текстолит когтями
Сообщения: 1178
Зарегистрирован: Пт авг 21, 2009 03:22:12

Re: АЦП. Разбор полётов

Сообщение bolek »

Аlex писал(а):...Это условие и есть
сразу после занесения очередного результата в массив
Или нет ? :)
Нет. Пусть отсчеты делаются через 1 мс, время вычисления 100 мкс.
Сразу после занесения в массив означает, что после получения отсчета 100 мкс тратим на вычисления потом 900 мкс занимаемся другими делами.
IMHO неважно, когда фактически проведено вычисление: сразу после получения отсчета (0 мкс), через 450 мкс, или 890 мкс, главное, что до получения очередного отсчета вычисления завершены.

Аlex писал(а):Меряется обычный токовый сигнал.
Какие будут помехи и как это всё будет работать - пока неизвестно.
Тогда все эти гигантские буферы не имеют особого смысла - архитектурное излишество. Сам по себе токовый сигнал достаточно устойчив к помехам.
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25121
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: АЦП. Разбор полётов

Сообщение КРАМ »

bolek писал(а):
КРАМ писал(а):...Я писАл, что обработку лучше делать сразу после занесения очередного результата в массив, но при невысоких требованиях к фильтру - можно и в мэйн. Никакой особой проблемы с прерыванием расчета и изменением массива не будет. Совсем немного размоет АЧХ, много меньше, чем в первом пункте...
Поясните, pls, Вашу мысль насчет размытия АЧХ: разве стабильность АЧХ не зависит только от стабильности и равномерности проведения выборки отсчетов (запуска АЦП)?
Собственно процесс вычисления на АЧХ не должен влиять никак, при условии что он успевает выполниться за время между отсчетами. Нет?

Строго говоря, никто не гарантирует выполнение расчета между отсчетами. Весьма вероятно (частоту совпадений можно вычислить как частоту биений между частотой расчета и частотой отсчетов), что между вычитанием и суммированием при вычислении суммы произойдет добавление отсчета в массив. Это приведет к ошибке и размытию АЧХ (отсутствию нулей и сдвигам частот). Конечно, интегральная величина ошибки будет пропорциональна скважности события этой ошибки, что весьма немного.
Если считать массив полностью, то влияние ошибки практически исчезает...
Аватара пользователя
просто КОТ
Друг Кота
Сообщения: 12364
Зарегистрирован: Пт дек 17, 2010 15:07:50
Откуда: Крымский Федеральный Округ
Контактная информация:

Re: АЦП. Разбор полётов

Сообщение просто КОТ »

На основе своих мыслей и кода Барсика, сделал вроде то, что мне надо. Правильно?!
Спойлер

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

#define F_CPU 1200000 // Инициализация
#include <io.h>
#include <delay.h>
#include <tiny13.h>

#define ADC_BUFFER_SIZE 8 // размер массива, куда будем складывать результаты АЦП
#define ADC_BUFFER_MASK 0b00000111 // маска для индекса массива
#define ADC_DATA_SHIFT 3 // на сколько разрядов сдвинуть переменную, чтобы получилось деление на размер массива
volatile unsigned int adc_data[ADC_BUFFER_SIZE]; // это массив, где будем накапливать результат.
volatile unsigned int adc_result = 0; // а это результат усреднения. обнуляем её перед использованием
volatile unsigned char adc_pointer = 0; // это индекс, который указывает на элемент массива, в который заносится результат измерений
void peripheralInit(void); // настройка железа микроконтроллера

interrupt [TIM0_COMPA] void timer0_compa_isr(void)
{
    unsigned char i;
        }
    for(i=0; i<ADC_BUFFER_SIZE; i++)
    {
        adc_sum = adc_sum + adc_data[i];
    }
    adc_result = adc_sum >> ADC_DATA_SHIFT;
}

// Это прерывание от АЦП. Оно случается, когда готов результат преобразования
interrupt [ADC_INT] void adc_isr(void)
{
    adc_data[(adc_pointer++) & ADC_BUFFER_MASK] = ADCW; // заносим результат АЦП в массив
}


void main(void)
{
peripheralInit(); // настраиваем железо (переферию) микроконтроллера
#asm("sei")

while (1)
{
if (adc_sum>800)   // Если насчитал больше 800, зажечь Синий светик
{
PORTB=000001;
delay_ms(5000);
PORTB=000000;
}
else if (adc_sum>600)   // Если более 600, то Зелёный
{
PORTB=000010;
delay_ms(2000);
PORTB=000000;
}
else if (adc_sum>400)  // Если хоть более 400, то Жёлтый
{
PORTB=010000;
delay_ms(2000);
PORTB=000000;
}
else if (adc_sum<200)  // А если менее 200, то Красный!
{
PORTB=001000;
delay_ms(2000);
PORTB=000000;
}
}

void peripheralInit(void) // настройка железа микроконтроллера
PORTB=0;
DDRB=0b11111011;

//---------- настраиваем АЦП ----------
ADMUX = 0b01000001;
ADCSRA = 0b10101110;
ADCSRB = 0b00000011;
DIDR0=0B00000100;

// ---------- таймер----------------------------
TCCR0A=0b00000010;
TCCR0B=0b00000010;
TCNT0=0;
OCR0A = 150;
TIMSK0=0b00001100;
}
}
Изображение
И ты врёшь!!! © Vladisman
Изображение
bolek
Сверлит текстолит когтями
Сообщения: 1178
Зарегистрирован: Пт авг 21, 2009 03:22:12

Re: АЦП. Разбор полётов

Сообщение bolek »

unsigned char i;
}
Скобка лишняя. Неужели компилятор не ругнулся по поводу непарных скобок?
А остальное... Похоже, смысл обсуждаемого на последних страницах, до Вас не дошел :(
Попробуйте прошить, если будет мигать так как хотелось, на этом можно успокоиться.
Аватара пользователя
просто КОТ
Друг Кота
Сообщения: 12364
Зарегистрирован: Пт дек 17, 2010 15:07:50
Откуда: Крымский Федеральный Округ
Контактная информация:

Re: АЦП. Разбор полётов

Сообщение просто КОТ »

Так вот, чё он ругалсо! А я то думаю!

Про прошит -- если прошивка плохая, то смысл прошивать -- можно попробовать додумать. Только во думат с МК у мя пока плохо сочитается. . .
Изображение
И ты врёшь!!! © Vladisman
Изображение
Аватара пользователя
Барсик
Друг Кота
Сообщения: 3459
Зарегистрирован: Ср сен 27, 2006 16:18:57

Re: АЦП. Разбор полётов

Сообщение Барсик »

просто КОТ писал(а):Так вот, чё он ругалсо
А он ещё будет ругаться - мало не покажется. Переменная adc_sum должна быть определена как локальная внутри прерывания, где подсчитывается среднее. И где же? И результат преобразования находится не в adc_sum, а в adc_result. И где, нафиг, открывающая скобка в описании функции void peripheralInit(void) ? Зато в конце аж две закрывающие скобки. :)
И вообще, если компилятор сообщает об ошибках, то о прошивке и речи быть не может - сначала исправьте ошибки.
Аватара пользователя
siamds
Встал на лапы
Сообщения: 99
Зарегистрирован: Вт мар 20, 2012 20:50:22
Откуда: Краснодар

Re: АЦП. Разбор полётов

Сообщение siamds »

Читаю сообщения форума и диву даюсь, да это же целая кладезь мудрости. Хоть сейчас бери и пиши диссертацию. Но, слава Богу, Господь на сие меня не сподобил, поэтому напишу просто: проблема, которую Вы обсуждаете выведенного яйца не стоит. Пока же я не видел ничего конкретного, ни схемы, ни программы – одни слова. Например, КРАМ, ну до чего красиво пишет аж слеза прошибает, а когда попросил написать конкретную программу такую ахинею понес хоть Святых выноси. Аналогичный случай был с танцором, которому вечно что-то мешает. Просто КОТ напишите четкое Т.З. и я постараюсь решить Вашу проблему.
На каждого Моцарта есть свой Сальери.
Аватара пользователя
Барсик
Друг Кота
Сообщения: 3459
Зарегистрирован: Ср сен 27, 2006 16:18:57

Re: АЦП. Разбор полётов

Сообщение Барсик »

siamds писал(а):Пока же я не видел ничего конкретного, ни схемы, ни программы – одни слова.
Вероятно, Вы плохо смотрели. Вот здесь, я приводил текст программ и результаты их работы в реальном железе: viewtopic.php?p=1375530#p1375530 Ну слова там тоже были - куда же без них... Схема подключения описана на словах. В том числе, в комментариях к программам.
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25121
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: АЦП. Разбор полётов

Сообщение КРАМ »

siamds писал(а):.........а когда попросил написать конкретную программу такую ахинею понес хоть Святых выноси.

Вы бы вместо пустого флуда лучше напишите КОНКРЕТНО, в чем состоит ахинея?
Пока тут ахинея слышна лишь от Вас.
siamds писал(а):Уважаемый КРАМ! Честно говоря, ваше утверждение вызывает у меня большие сомнения. И чтобы не считать Ваше утверждение голословным выложите на форум hex. файл чтобы желающие могли протестировать Вашу программу. Когда я выложил на форум программу “Чтение АЦП”, у нашего коллеги Совесть закрались сомнения в ее работоспособности (и это его законное право) и я убедил его выложив результат работы программы. Так и мне хотелось бы, чтобы Вы убедили меня и наших коллег в правомерности Ваших утверждений реальным примером.

Причем в чем состоит ВАША ахинея, я написал ранее и по пунктам.
Добавлю лишь одно.
Подобную ВАШЕЙ чушь может написать лишь человек, который никогда сам ни одного устройства с МК не разрабатывал. Чужие делал, а свои - нет...
В теме разобрано все, что требуется для написания кода и сравнения алгоритмов.... Если Вы не в состоянии это понять, значит оно Вам и не требуется. Пользуйтесь тем, что есть...
:wink:
ЗЫ. Кстати, Вы просили не программу, а ХЕКС..., есличо... :)
Аватара пользователя
просто КОТ
Друг Кота
Сообщения: 12364
Зарегистрирован: Пт дек 17, 2010 15:07:50
Откуда: Крымский Федеральный Округ
Контактная информация:

Re: АЦП. Разбор полётов

Сообщение просто КОТ »

siamds писал(а):Просто КОТ напишите четкое Т.З. и я постараюсь решить Вашу проблему.

Надо через АЦП смотрет напряжение на делителе и в зависимости от напряжения зажигать один из 4 светодиодов!
Изображение
И ты врёшь!!! © Vladisman
Изображение
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25121
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: АЦП. Разбор полётов

Сообщение КРАМ »

Так как шкала АЦП в Вашем контроллере - это 0...1023, то следует так же указать диапазон этой шкалы на каждый светодиод и точность переключения на границах между диапазонами диодов. Для 4 светодиодов достаточно 2 старших разрядов АЦП... Причем, если не интересуют границы переключения, то и ничего фильтровать не требуется... :)
Аватара пользователя
просто КОТ
Друг Кота
Сообщения: 12364
Зарегистрирован: Пт дек 17, 2010 15:07:50
Откуда: Крымский Федеральный Округ
Контактная информация:

Re: АЦП. Разбор полётов

Сообщение просто КОТ »

А границы ещё не до конца определены. .. :oops: :wink:
Ещё пару дней надо!
Изображение
И ты врёшь!!! © Vladisman
Изображение
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: АЦП. Разбор полётов

Сообщение Аlex »

Какие суровые парни в Краснодаре :)))
siamds, во первых, никто никому тут не обязан ничего писать (это о камушке в огород КРАМа), а во вторых - какое нафиг ТЗ ? Человек просто разбирается с модулем и общими принципами преобразования.
Не вижу никакой ахинеи ни от кого. Напрасно Вы так...
И то, что Вы напишите человеку программу, ума ему не прибавит. Вы считаете, что этого, кроме Вас, тут никто бы не смог ? :)
Аватара пользователя
siamds
Встал на лапы
Сообщения: 99
Зарегистрирован: Вт мар 20, 2012 20:50:22
Откуда: Краснодар

Re: АЦП. Разбор полётов

Сообщение siamds »

Уважаемый просто КОТ! Я уже высылал на форум рабочую проверенную программу, но Вы вероятно просто не обратили на это внимания.

Уважаемый Аlex! Вы абсолютно правы и посему прошу моих коллег извинить меня за столь резкие высказывания.
Последний раз редактировалось siamds Вт авг 21, 2012 15:08:17, всего редактировалось 1 раз.
На каждого Моцарта есть свой Сальери.
Аватара пользователя
просто КОТ
Друг Кота
Сообщения: 12364
Зарегистрирован: Пт дек 17, 2010 15:07:50
Откуда: Крымский Федеральный Округ
Контактная информация:

Re: АЦП. Разбор полётов

Сообщение просто КОТ »

Хм, как-то не заметил. Сейчас посмотрим!

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

#include <tiny13.h>
#include <stdio.h>
#include <delay.h>

#define ADC_VREF_TYPE 0x00

int ad;

// Read the AD conversion result
void read_adc(void)
{
ad=ADCW;
ADMUX=0;
delay_us(10);
ADCSRA|=0x40;
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}

void led_show(void)
{
if (ad>=600) PORTB.0=1;
else
PORTB.0=0;

if (ad>=640) PORTB.1=1;
else
PORTB.1=0;

if (ad>=700) PORTB.2=1;
else
PORTB.2=0;
}

void main(void)
{
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

// Port B initialization
PORTB=0x00;
DDRB=0x07;

// ADC initialization
// ADC Clock frequency: 250,000 kHz
// ADC Bandgap Voltage Reference: Off
// ADC Auto Trigger Source: None
// Digital input buffers on ADC0: On, ADC1: On, ADC2: On, ADC3: On
DIDR0&=0x03;
DIDR0|=0x00;
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x82;

while (1)
      {
      read_adc();
      led_show();
      };
}

Вот она. Кстати, а получается вклучены все входы у АЦП?! А мне надо только тот, что на РВ2. Ну это мя поправлю!
Изображение
И ты врёшь!!! © Vladisman
Изображение
Ответить

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