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

Обсуждаем контроллеры компании Atmel.
Ответить
Вымогатель припоя
Аватара пользователя
Сообщения: 577
Зарегистрирован: Ср июн 19, 2013 08:10:48
Откуда: Москва, СПб, Липецк, Рязань

Сообщение ИС-пытатель »

Согласен. Я ж говорю: читайте! Что не ясно - к нам. А без этого записываться к Вам в учителя никто не будет (нам за это денег не платят, а спасибо - слишком много для нас).
Реклама
Держит паяльник хвостом
Сообщения: 933
Зарегистрирован: Ср апр 13, 2011 11:09:20
Откуда: Екатеринбург

Сообщение Alkul »

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

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

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

И да, ИС-пытатель прав - читайте, изучайте и задавайте конкретные вопросы.
Последний раз редактировалось Alkul Чт май 08, 2014 06:37:07, всего редактировалось 2 раза.
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 577
Зарегистрирован: Ср июн 19, 2013 08:10:48
Откуда: Москва, СПб, Липецк, Рязань

Сообщение ИС-пытатель »

Например, одно преобразование длится 100 мкс, выполняют 10 измерений и усредняют их, при этом считают, что измерения выполняются раз в 1 мс.
Можно еще сделать усреднение "скользящим окном". тогда эффект точности будет как при 10 измерениях раз в 1 мс, но скорость измерений будет в 10 раз выше. И лучше брать количество измерений кратным степени 2-ки (4, 8, 16 и т.д.), чтобы легче было усреднять. Но, что-то меня в лирику понесло... ))) Чувствую, не пригодятся здесь мои знания.. ))
Держит паяльник хвостом
Сообщения: 933
Зарегистрирован: Ср апр 13, 2011 11:09:20
Откуда: Екатеринбург

Сообщение Alkul »

ИС-пытатель писал(а):Можно еще сделать усреднение "скользящим окном". тогда эффект точности будет как при 10 измерениях раз в 1 мс, но скорость измерений будет в 10 раз выше.
Можно и так. Я раньше так делал. Я называю это "скользящий интеграл", вот здесь я писал об этом.
Но полгода назад я открыл для себя фильтр Калмана, после чего все измерения, результат которых допустимо обработать этим фильтром, я обрабатываю им.
Но зачем все это "вываливать" на новичка? Он еще "аз-буки-веди" не изучил, а Вы ему сочинения писать предлагаете :))
Всему свое время.
Реклама
Эиком - электронные компоненты и радиодетали
Вымогатель припоя
Аватара пользователя
Сообщения: 577
Зарегистрирован: Ср июн 19, 2013 08:10:48
Откуда: Москва, СПб, Липецк, Рязань

Сообщение ИС-пытатель »

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

Сообщение Alkul »

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

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

Но это мы уже сильно оффтопим, Родион, скорее всего, не поймет то, о чем мы тут толкуем :)
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 577
Зарегистрирован: Ср июн 19, 2013 08:10:48
Откуда: Москва, СПб, Липецк, Рязань

Сообщение ИС-пытатель »

С одной переменной там получается по сути масштабирование величины прироста переменной. Это действительно может помочь для уменьшения резких скачков измерений, связанных с теми или иными ошибками (Принцип одной из составляющих ПИД-регулятора)
Друг Кота
Аватара пользователя
Сообщения: 6325
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

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

Сообщение Родион@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...
Вымогатель припоя
Аватара пользователя
Сообщения: 577
Зарегистрирован: Ср июн 19, 2013 08:10:48
Откуда: Москва, СПб, Липецк, Рязань

Сообщение ИС-пытатель »

:facepalm: А с чего Вы взяли, что в солнечный день в тени у Вас не будет выдавать 5 В? И что там именно пропорциональное изменение напряжения, а не, скажем, по квадратичному закону?

Для начала, наверное, нужно собрать Ваш "датчик" и снять показания при разных условиях.
Открыл глаза
Сообщения: 49
Зарегистрирован: Ср апр 16, 2014 18:46:46

Сообщение Родион@22 »

нигде не описывается пропорциональное изменение значения напряжения, неужели никто и никогда не выводил эти значения? если да то вот где
Держит паяльник хвостом
Сообщения: 933
Зарегистрирован: Ср апр 13, 2011 11:09:20
Откуда: Екатеринбург

Сообщение Alkul »

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

Родион, Вы что-то мечетесь туда-сюда, я не понимаю цели и смысла этих метаний. То Вам надо одно, то другое...
Открыл глаза
Сообщения: 49
Зарегистрирован: Ср апр 16, 2014 18:46:46

Сообщение Родион@22 »

Alkul, а вы прочитайте моё предпоследнее сообщение
Держит паяльник хвостом
Сообщения: 933
Зарегистрирован: Ср апр 13, 2011 11:09:20
Откуда: Екатеринбург

Сообщение Alkul »

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

Сообщение Родион@22 »

Хочу узнать соотношение напряжение/люкс. Допустим, при 5 В сколько будет люкс? Или при коде таком то таком то будет столько то люкс
Изображение
Вымогатель припоя
Аватара пользователя
Сообщения: 577
Зарегистрирован: Ср июн 19, 2013 08:10:48
Откуда: Москва, СПб, Липецк, Рязань

Сообщение ИС-пытатель »

:))) Вы сами-то поняли, о чем попросили? )) Люкс - это сила света на площадь. А вот какое напряжение даст, использованная Вами площадь зависит от того, какой материал используется в Вашем датчике, от его степени загрязненности и даже от текущей фоновой обстановки (радиационный фон, наличие поблизости нагревательных приборов и т.д.). В Вашем случае все меряется опытным путем. Попросите у кого-нибудь люксметр и снимите показания.
Вы, блин, где учитесь? В высшем учебном заведении или в школе, что такие вопросы задаете?
Держит паяльник хвостом
Сообщения: 933
Зарегистрирован: Ср апр 13, 2011 11:09:20
Откуда: Екатеринбург

Сообщение Alkul »

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

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