Страница 3 из 3

Re: Вопросы по программированию AVR на ассемблере

Добавлено: Ср май 07, 2014 18:43:24
ИС-пытатель
Согласен. Я ж говорю: читайте! Что не ясно - к нам. А без этого записываться к Вам в учителя никто не будет (нам за это денег не платят, а спасибо - слишком много для нас).

Re: Вопросы по программированию AVR на ассемблере

Добавлено: Ср май 07, 2014 19:28:40
Alkul
Родион@22 писал(а):Я лишь хотел на примере программ узнать как АЦП преобразует свет в цифру, а потом отображает на светодиодах.
Так я же Вам писал пример кода, запускающий преобразование АЦП на AVR.

АЦП у AVR мультиплексированный. Это означает, что непосредственно преобразующий модуль один, но имеется несколько входов (каналов), один из которых можно подключить к преобразующему модулю (ПМ). У ATtiny26, примеру, номер канала, подключенного к преобразующему модулю, определяется комбинацией бит MUX4...MUX0 регистра ADMUX. В каждый конкретный момент к преобразующему модулю (ПМ) всегда подключен только один канал.
Если, к примеру, имеется несколько термопар и нужно измерять температуру одновременно в нескольких местах, то термопары подключают к разным входам АЦП, и начинают измерения последовательным перебором: изменяя MUX4...MUX0, подключают к ПМ первый канал, запускают преобразование, ожидают результата, считывают его из ADCL и ADCH, заносят в память. Затем изменяя MUX4...MUX0, подключают к ПМ второй канал, запускают преобразование, ожидают результата, считывают его, заносят в память и так далее "перебирают" все каналы, к которым подключены преобразователи. Так как в секунду АЦП успевает выполнить несколько тысяч преобразований, а изменение температуры - процесс достаточно инерционный, то для пользователя выполняемые таким способом измерения температур в разных точках будут одновременными, хотя на самом деле это, конечно, не так.
Кроме того, в силу многих причин результат преобразования будет раз от разу отличаться от "истинного" значения то в большую, то в меньшую сторону (как и почему это происходит - отдельная большая тема для разговора), поэтому для получения результата, более-менее приближенного к истинному значению, часто прибегают к такому "трюку" - делают несколько измерений подряд и вычисляют среднее арифметическое, считая именно это значение результатом аналого-цифрового преобразования. Например, одно преобразование длится 100 мкс, выполняют 10 измерений и усредняют их, при этом считают, что измерения выполняются раз в 1 мс.

Что касается "преобразования света в цифру", то здесь все сводится к предварительному преобразованию квантов света в напряжение тем или иным способом, так, чтобы уровень напряжения был пропорционален освещенности, после чего измеряют это напряжение.
Для того, чтобы измерить какую-либо физическую величину, её (схемотехнически) преобразовывают в пропорциональный сигнал по напряжению, который затем подается на вход АЦП для оцифровки. Поэтому именно с точки зрения управления АЦП совершенно неважно, что мы измеряем - температуру, освещенность или давление - АЦП в любом случае оцифровывает уровень напряжения.
После того, как физическая величина оцифрована (микроконтроллер получил числовое значение, соответствующее величине оцифрованного напряжения) с ней можно производить вычисления, и отображать результаты вычислений хоть в виде линейной светодиодной шкалы, хоть в виде цифр на знакосинтезирующем индикаторе. А можно вообще ничего не индицировать, а результат измерения, к примеру, пересылать в компьютер для дальнейшей обработки.

И да, ИС-пытатель прав - читайте, изучайте и задавайте конкретные вопросы.

Re: Вопросы по программированию AVR на ассемблере

Добавлено: Ср май 07, 2014 19:33:27
ИС-пытатель
Например, одно преобразование длится 100 мкс, выполняют 10 измерений и усредняют их, при этом считают, что измерения выполняются раз в 1 мс.
Можно еще сделать усреднение "скользящим окном". тогда эффект точности будет как при 10 измерениях раз в 1 мс, но скорость измерений будет в 10 раз выше. И лучше брать количество измерений кратным степени 2-ки (4, 8, 16 и т.д.), чтобы легче было усреднять. Но, что-то меня в лирику понесло... ))) Чувствую, не пригодятся здесь мои знания.. ))

Re: Вопросы по программированию AVR на ассемблере

Добавлено: Ср май 07, 2014 19:38:32
Alkul
ИС-пытатель писал(а):Можно еще сделать усреднение "скользящим окном". тогда эффект точности будет как при 10 измерениях раз в 1 мс, но скорость измерений будет в 10 раз выше.
Можно и так. Я раньше так делал. Я называю это "скользящий интеграл", вот здесь я писал об этом.
Но полгода назад я открыл для себя фильтр Калмана, после чего все измерения, результат которых допустимо обработать этим фильтром, я обрабатываю им.
Но зачем все это "вываливать" на новичка? Он еще "аз-буки-веди" не изучил, а Вы ему сочинения писать предлагаете :))
Всему свое время.

Re: Вопросы по программированию AVR на ассемблере

Добавлено: Ср май 07, 2014 20:40:23
ИС-пытатель
Посмотрел на фильтр Калмана. Чем-то напоминает ПИД-регулятор. ))) Также, чтобы добиться хорошего результата нужно либо обладать максимально точной моделью процесса (для расчета коэффициентов), либо подбирать коэффициенты в ручную. )) Занимательно. Надо будет опробовать. Но вот вопрос, как это использовать при измерении величин? Ведь мы не можем запрогнозировать изменение солнечной энергии, к примеру. т.е. остается только значение, полученное с датчика. А здесь простое матожидание измерений - по сути тот же эффект, что и коэффициент Калмана.
Т.е. для реализации фильтра Калмана у Вас должны быть два независимых друг от друга источника информации (например, два датчика). Но в этом случае проще и дешевле поставить 1 и сделать усреднение.
А так, по сути, любой фильтр опирается на статистику, т.е. на прошлые значения. Ибо без этого только Ванга может работать. А обработка прошлых результатов - это всегда дополнительные временные затраты (зависят от сложности и точности алгоритма) и разные реализации фильтров могут только сократить их или увеличить.

Re: Вопросы по программированию AVR на ассемблере

Добавлено: Ср май 07, 2014 21:19:20
Alkul
ИС-пытатель писал(а):Также, чтобы добиться хорошего результата нужно либо обладать максимально точной моделью процесса (для расчета коэффициентов), либо подбирать коэффициенты в ручную. )) Занимательно. Надо будет опробовать.
Посмотрите вот здесь
Там в конце статьи дана программа на Си, реализующая вырожденный случай фильтра Калмана, когда входная переменная одна.
Интересен там коэффициент R, определяющий ошибку измерения. Изменяя этот параметр, можно менять глубину сглаживания.

А что касается сравнения фильтра Калмана со скользящим интегралом, то я, построив модель в экселе и взяв реальные данные с одного из своих изделий, нашел следующие закономерности - при одинаковом сглаживании на стохастическом процессе фильтр Калмана быстрее реагирует на импульсное возмущение, и амплитуда импульса, выдаваемого Калманом, при этом выше, чем амплитуда импульса, выдаваемого скользящим интегралом. Причем время реакции Калмана при увеличении коэффициента сглаживания уменьшается гораздо медленней, чем время реакции скользящего интеграла при увеличении размера "окна".
Я для интереса сравнивал Калмана с усреднениями по 10, по 30 и по 300 точкам - тенденция просматривается очень четко.
ИС-пытатель писал(а):А так, по сути, любой фильтр опирается на статистику, т.е. на прошлые значения.
Конечно :)

Но это мы уже сильно оффтопим, Родион, скорее всего, не поймет то, о чем мы тут толкуем :)

Re: Вопросы по программированию AVR на ассемблере

Добавлено: Чт май 08, 2014 00:15:55
ИС-пытатель
С одной переменной там получается по сути масштабирование величины прироста переменной. Это действительно может помочь для уменьшения резких скачков измерений, связанных с теми или иными ошибками (Принцип одной из составляющих ПИД-регулятора)

Re: Вопросы по программированию AVR на ассемблере

Добавлено: Чт май 08, 2014 12:52:01
Jack_A
Родион@22 писал(а): АЦП преобразует свет в цифру, а потом отображает на светодиодах.
Э, батенька ... " Я поняла все, что вы мне объяснили про трансатлантический кабель , но как же все-таки по нему телеграммы сухими доходят ?"
АЦП не преобразует свет в цифру и ничего никуда не отображает. Свет перобразуется фотоприемником в напряжение, АЦП преобразует напряжение в код, МК с учетом калибровочных коэффициентов преобразует код в конкретное значение силы света или освещенности, затем он же преобразует это значение в коды ( но уже другие :) ) 7-сегиентных индикаторов и подает эти коды на эти индикаторы. А АЦП в это время уже пьет пиво и смотрит телявизер. Вот.

Re: Вопросы по программированию AVR на ассемблере

Добавлено: Пт май 09, 2014 22:38:24
Родион@22
Думаю, что вполне подойдет, в качестве неточного, но рабочего "измерителя солнечной энергии" в "попугаях"
Спойлер

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

/*** Использование АЦП. Светодиодная шкала ***/
#include <avr/io.h>
#include <util/delay.h>
int main (void)
{
DDRD = 0xFF;
PORTD = 0x00;
/*** Настройка АЦП ***/
ADCSRA |= (1 << ADEN) // Включение АЦП
                         |(1 << ADPS1)|(1 << ADPS0); // предделитель преобразователя на 8
ADMUX |= (0 << REFS1)|(0 << REFS0) // внешний ИОН
                 |(0 << MUX0)|(0 << MUX1)|(0 << MUX2)|(0 << MUX3); // вход PC0
while(1)
{
unsigned int u;
ADCSRA |= (1 << ADSC); // Начинаем преобразование
while ((ADCSRA&(1 << ADIF))== 0); // Ждем флага окончания преобразования

u = (ADCL|ADCH << 8); // Считываем ADC

if (u > 128) // 0.625V
PORTD = 0b00000001;             
else
PORTD = 0b00000000;

if (u > 256) // 1.25V
PORTD = 0b00000011;     
if (u > 384) // 1.875V
PORTD = 0b00000111;
if (u > 512) // 2.5V
PORTD = 0b00001111;
if (u > 640) // 3.125V
PORTD = 0b00011111;
if (u > 768) // 3.75V
PORTD = 0b00111111;
if (u > 896) // 4.375V
PORTD = 0b01111111;
if (u > 1020) // 5V
PORTD = 0b11111111;

_delay_ms(30);
}
}
http://youtu.be/UlHynhsfWkM

Конечно это собсттвенно вольтметр, но так как АЦП работает только с напряжением, то можно посчитать, что примерно:
Яркое солнце 5В
Солнечный день в тени 4.375В
Обычный день 3.75В
Пасмурный день 3.125В
Сумерки 1.875...

Re: Вопросы по программированию AVR на ассемблере

Добавлено: Пт май 09, 2014 23:13:17
ИС-пытатель
:facepalm: А с чего Вы взяли, что в солнечный день в тени у Вас не будет выдавать 5 В? И что там именно пропорциональное изменение напряжения, а не, скажем, по квадратичному закону?

Для начала, наверное, нужно собрать Ваш "датчик" и снять показания при разных условиях.

Re: Вопросы по программированию AVR на ассемблере

Добавлено: Пт май 09, 2014 23:37:59
Родион@22
нигде не описывается пропорциональное изменение значения напряжения, неужели никто и никогда не выводил эти значения? если да то вот где

Re: Вопросы по программированию AVR на ассемблере

Добавлено: Сб май 10, 2014 07:42:01
Alkul
Родион@22 писал(а):нигде не описывается пропорциональное изменение значения напряжения
Само по себе выражение "пропорциональное изменение значения напряжения" - это сферический конь в вакууме. Оно не имеет никакого смысла, поэтому Вы ничего и не найдете. Это выражение обретает смысл только при добавлении к этой фразе определения на чем или в зависимости от чего происходит изменение значения напряжения.
Фраза "пропорциональное изменение значения напряжения" - бессмысленна, а вот фраза "пропорциональное изменение значения напряжения на выходе измерительного моста при изменении сопротивления резистора в плече моста" очень даже осмысленна.
Родион@22 писал(а):неужели никто и никогда не выводил эти значения?
Куда выводил? Какие значения?

Родион, Вы что-то мечетесь туда-сюда, я не понимаю цели и смысла этих метаний. То Вам надо одно, то другое...

Re: Вопросы по программированию AVR на ассемблере

Добавлено: Сб май 10, 2014 13:57:45
Родион@22
Alkul, а вы прочитайте моё предпоследнее сообщение

Re: Вопросы по программированию AVR на ассемблере

Добавлено: Вс май 11, 2014 07:36:43
Alkul
Родион@22 писал(а):Alkul, а вы прочитайте моё предпоследнее сообщение
Я читал то сообщение. И не понимаю, какая связь между ним и фразой
Родион@22 писал(а):нигде не описывается пропорциональное изменение значения напряжения, неужели никто и никогда не выводил эти значения?
В сообщении, на которое Вы ссылаетесь, приведена программа, запускающая АЦП, и зажигающая светодиоды в зависимости от полученного кода АЦП. И что? В чем вопрос? Объясните уже по-нормальному, что Вы делаете и чего пытаетесь добиться.

Re: Вопросы по программированию AVR на ассемблере

Добавлено: Вс май 11, 2014 17:11:47
Родион@22
Хочу узнать соотношение напряжение/люкс. Допустим, при 5 В сколько будет люкс? Или при коде таком то таком то будет столько то люкс
Изображение

Re: Вопросы по программированию AVR на ассемблере

Добавлено: Вс май 11, 2014 18:49:06
ИС-пытатель
:))) Вы сами-то поняли, о чем попросили? )) Люкс - это сила света на площадь. А вот какое напряжение даст, использованная Вами площадь зависит от того, какой материал используется в Вашем датчике, от его степени загрязненности и даже от текущей фоновой обстановки (радиационный фон, наличие поблизости нагревательных приборов и т.д.). В Вашем случае все меряется опытным путем. Попросите у кого-нибудь люксметр и снимите показания.
Вы, блин, где учитесь? В высшем учебном заведении или в школе, что такие вопросы задаете?

Re: Вопросы по программированию AVR на ассемблере

Добавлено: Вс май 11, 2014 22:22:59
Alkul
Родион@22 писал(а):Или при коде таком то таком то будет столько то люкс
Я Вам уже писал, повторю еще раз - возьмите датчик MAX44009.
Обмен с ним идет по шине I2C, выдает код, напрямую связанный с освещенностью в люксах (таблица связи кода с освещенностью в даташите на датчик).
С аналоговыми самопальными датчиками Вы не получите однозначной зависимости уровня освещенность от выдаваемого датчиком сигнала. Скорее всего, даже линейной зависимости не получите. И придется хранить в памяти таблицу с несколькими основными точками, где определено соотношение освещенности к выходному сигналу датчика, а промежуточные значения считать методом кусочно-линейной аппроксимации.