Вопросы по программированию AVR на ассемблере
Согласен. Я ж говорю: читайте! Что не ясно - к нам. А без этого записываться к Вам в учителя никто не будет (нам за это денег не платят, а спасибо - слишком много для нас).
- Реклама
Так я же Вам писал пример кода, запускающий преобразование АЦП на AVR.Родион@22 писал(а):Я лишь хотел на примере программ узнать как АЦП преобразует свет в цифру, а потом отображает на светодиодах.
АЦП у AVR мультиплексированный. Это означает, что непосредственно преобразующий модуль один, но имеется несколько входов (каналов), один из которых можно подключить к преобразующему модулю (ПМ). У ATtiny26, примеру, номер канала, подключенного к преобразующему модулю, определяется комбинацией бит MUX4...MUX0 регистра ADMUX. В каждый конкретный момент к преобразующему модулю (ПМ) всегда подключен только один канал.
Если, к примеру, имеется несколько термопар и нужно измерять температуру одновременно в нескольких местах, то термопары подключают к разным входам АЦП, и начинают измерения последовательным перебором: изменяя MUX4...MUX0, подключают к ПМ первый канал, запускают преобразование, ожидают результата, считывают его из ADCL и ADCH, заносят в память. Затем изменяя MUX4...MUX0, подключают к ПМ второй канал, запускают преобразование, ожидают результата, считывают его, заносят в память и так далее "перебирают" все каналы, к которым подключены преобразователи. Так как в секунду АЦП успевает выполнить несколько тысяч преобразований, а изменение температуры - процесс достаточно инерционный, то для пользователя выполняемые таким способом измерения температур в разных точках будут одновременными, хотя на самом деле это, конечно, не так.
Кроме того, в силу многих причин результат преобразования будет раз от разу отличаться от "истинного" значения то в большую, то в меньшую сторону (как и почему это происходит - отдельная большая тема для разговора), поэтому для получения результата, более-менее приближенного к истинному значению, часто прибегают к такому "трюку" - делают несколько измерений подряд и вычисляют среднее арифметическое, считая именно это значение результатом аналого-цифрового преобразования. Например, одно преобразование длится 100 мкс, выполняют 10 измерений и усредняют их, при этом считают, что измерения выполняются раз в 1 мс.
Что касается "преобразования света в цифру", то здесь все сводится к предварительному преобразованию квантов света в напряжение тем или иным способом, так, чтобы уровень напряжения был пропорционален освещенности, после чего измеряют это напряжение.
Для того, чтобы измерить какую-либо физическую величину, её (схемотехнически) преобразовывают в пропорциональный сигнал по напряжению, который затем подается на вход АЦП для оцифровки. Поэтому именно с точки зрения управления АЦП совершенно неважно, что мы измеряем - температуру, освещенность или давление - АЦП в любом случае оцифровывает уровень напряжения.
После того, как физическая величина оцифрована (микроконтроллер получил числовое значение, соответствующее величине оцифрованного напряжения) с ней можно производить вычисления, и отображать результаты вычислений хоть в виде линейной светодиодной шкалы, хоть в виде цифр на знакосинтезирующем индикаторе. А можно вообще ничего не индицировать, а результат измерения, к примеру, пересылать в компьютер для дальнейшей обработки.
И да, ИС-пытатель прав - читайте, изучайте и задавайте конкретные вопросы.
Последний раз редактировалось Alkul Чт май 08, 2014 06:37:07, всего редактировалось 2 раза.
Можно еще сделать усреднение "скользящим окном". тогда эффект точности будет как при 10 измерениях раз в 1 мс, но скорость измерений будет в 10 раз выше. И лучше брать количество измерений кратным степени 2-ки (4, 8, 16 и т.д.), чтобы легче было усреднять. Но, что-то меня в лирику понесло... ))) Чувствую, не пригодятся здесь мои знания.. ))Например, одно преобразование длится 100 мкс, выполняют 10 измерений и усредняют их, при этом считают, что измерения выполняются раз в 1 мс.
Можно и так. Я раньше так делал. Я называю это "скользящий интеграл", вот здесь я писал об этом.ИС-пытатель писал(а):Можно еще сделать усреднение "скользящим окном". тогда эффект точности будет как при 10 измерениях раз в 1 мс, но скорость измерений будет в 10 раз выше.
Но полгода назад я открыл для себя фильтр Калмана, после чего все измерения, результат которых допустимо обработать этим фильтром, я обрабатываю им.
Но зачем все это "вываливать" на новичка? Он еще "аз-буки-веди" не изучил, а Вы ему сочинения писать предлагаете
Всему свое время.
Посмотрел на фильтр Калмана. Чем-то напоминает ПИД-регулятор. ))) Также, чтобы добиться хорошего результата нужно либо обладать максимально точной моделью процесса (для расчета коэффициентов), либо подбирать коэффициенты в ручную. )) Занимательно. Надо будет опробовать. Но вот вопрос, как это использовать при измерении величин? Ведь мы не можем запрогнозировать изменение солнечной энергии, к примеру. т.е. остается только значение, полученное с датчика. А здесь простое матожидание измерений - по сути тот же эффект, что и коэффициент Калмана.
Т.е. для реализации фильтра Калмана у Вас должны быть два независимых друг от друга источника информации (например, два датчика). Но в этом случае проще и дешевле поставить 1 и сделать усреднение.
А так, по сути, любой фильтр опирается на статистику, т.е. на прошлые значения. Ибо без этого только Ванга может работать. А обработка прошлых результатов - это всегда дополнительные временные затраты (зависят от сложности и точности алгоритма) и разные реализации фильтров могут только сократить их или увеличить.
Т.е. для реализации фильтра Калмана у Вас должны быть два независимых друг от друга источника информации (например, два датчика). Но в этом случае проще и дешевле поставить 1 и сделать усреднение.
А так, по сути, любой фильтр опирается на статистику, т.е. на прошлые значения. Ибо без этого только Ванга может работать. А обработка прошлых результатов - это всегда дополнительные временные затраты (зависят от сложности и точности алгоритма) и разные реализации фильтров могут только сократить их или увеличить.
- Реклама
Посмотрите вот здесьИС-пытатель писал(а):Также, чтобы добиться хорошего результата нужно либо обладать максимально точной моделью процесса (для расчета коэффициентов), либо подбирать коэффициенты в ручную. )) Занимательно. Надо будет опробовать.
Там в конце статьи дана программа на Си, реализующая вырожденный случай фильтра Калмана, когда входная переменная одна.
Интересен там коэффициент R, определяющий ошибку измерения. Изменяя этот параметр, можно менять глубину сглаживания.
А что касается сравнения фильтра Калмана со скользящим интегралом, то я, построив модель в экселе и взяв реальные данные с одного из своих изделий, нашел следующие закономерности - при одинаковом сглаживании на стохастическом процессе фильтр Калмана быстрее реагирует на импульсное возмущение, и амплитуда импульса, выдаваемого Калманом, при этом выше, чем амплитуда импульса, выдаваемого скользящим интегралом. Причем время реакции Калмана при увеличении коэффициента сглаживания уменьшается гораздо медленней, чем время реакции скользящего интеграла при увеличении размера "окна".
Я для интереса сравнивал Калмана с усреднениями по 10, по 30 и по 300 точкам - тенденция просматривается очень четко.
КонечноИС-пытатель писал(а):А так, по сути, любой фильтр опирается на статистику, т.е. на прошлые значения.
Но это мы уже сильно оффтопим, Родион, скорее всего, не поймет то, о чем мы тут толкуем
С одной переменной там получается по сути масштабирование величины прироста переменной. Это действительно может помочь для уменьшения резких скачков измерений, связанных с теми или иными ошибками (Принцип одной из составляющих ПИД-регулятора)
Э, батенька ... " Я поняла все, что вы мне объяснили про трансатлантический кабель , но как же все-таки по нему телеграммы сухими доходят ?"Родион@22 писал(а): АЦП преобразует свет в цифру, а потом отображает на светодиодах.
АЦП не преобразует свет в цифру и ничего никуда не отображает. Свет перобразуется фотоприемником в напряжение, АЦП преобразует напряжение в код, МК с учетом калибровочных коэффициентов преобразует код в конкретное значение силы света или освещенности, затем он же преобразует это значение в коды ( но уже другие
- Сообщения: 49
- Зарегистрирован: Ср апр 16, 2014 18:46:46
Думаю, что вполне подойдет, в качестве неточного, но рабочего "измерителя солнечной энергии" в "попугаях"
http://youtu.be/UlHynhsfWkM
Конечно это собсттвенно вольтметр, но так как АЦП работает только с напряжением, то можно посчитать, что примерно:
Яркое солнце 5В
Солнечный день в тени 4.375В
Обычный день 3.75В
Пасмурный день 3.125В
Сумерки 1.875...
Спойлер
Код: Выделить всё
/*** Использование АЦП. Светодиодная шкала ***/
#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);
}
}Конечно это собсттвенно вольтметр, но так как АЦП работает только с напряжением, то можно посчитать, что примерно:
Яркое солнце 5В
Солнечный день в тени 4.375В
Обычный день 3.75В
Пасмурный день 3.125В
Сумерки 1.875...
Для начала, наверное, нужно собрать Ваш "датчик" и снять показания при разных условиях.
- Сообщения: 49
- Зарегистрирован: Ср апр 16, 2014 18:46:46
нигде не описывается пропорциональное изменение значения напряжения, неужели никто и никогда не выводил эти значения? если да то вот где
Само по себе выражение "пропорциональное изменение значения напряжения" - это сферический конь в вакууме. Оно не имеет никакого смысла, поэтому Вы ничего и не найдете. Это выражение обретает смысл только при добавлении к этой фразе определения на чем или в зависимости от чего происходит изменение значения напряжения.Родион@22 писал(а):нигде не описывается пропорциональное изменение значения напряжения
Фраза "пропорциональное изменение значения напряжения" - бессмысленна, а вот фраза "пропорциональное изменение значения напряжения на выходе измерительного моста при изменении сопротивления резистора в плече моста" очень даже осмысленна.
Куда выводил? Какие значения?Родион@22 писал(а):неужели никто и никогда не выводил эти значения?
Родион, Вы что-то мечетесь туда-сюда, я не понимаю цели и смысла этих метаний. То Вам надо одно, то другое...
- Сообщения: 49
- Зарегистрирован: Ср апр 16, 2014 18:46:46
Alkul, а вы прочитайте моё предпоследнее сообщение
Я читал то сообщение. И не понимаю, какая связь между ним и фразойРодион@22 писал(а):Alkul, а вы прочитайте моё предпоследнее сообщение
В сообщении, на которое Вы ссылаетесь, приведена программа, запускающая АЦП, и зажигающая светодиоды в зависимости от полученного кода АЦП. И что? В чем вопрос? Объясните уже по-нормальному, что Вы делаете и чего пытаетесь добиться.Родион@22 писал(а):нигде не описывается пропорциональное изменение значения напряжения, неужели никто и никогда не выводил эти значения?
- Сообщения: 49
- Зарегистрирован: Ср апр 16, 2014 18:46:46
Вы, блин, где учитесь? В высшем учебном заведении или в школе, что такие вопросы задаете?
Я Вам уже писал, повторю еще раз - возьмите датчик MAX44009.Родион@22 писал(а):Или при коде таком то таком то будет столько то люкс
Обмен с ним идет по шине I2C, выдает код, напрямую связанный с освещенностью в люксах (таблица связи кода с освещенностью в даташите на датчик).
С аналоговыми самопальными датчиками Вы не получите однозначной зависимости уровня освещенность от выдаваемого датчиком сигнала. Скорее всего, даже линейной зависимости не получите. И придется хранить в памяти таблицу с несколькими основными точками, где определено соотношение освещенности к выходному сигналу датчика, а промежуточные значения считать методом кусочно-линейной аппроксимации.


