domowoj 0 3 августа, 2008 Опубликовано 3 августа, 2008 · Жалоба ADC=1023*Vin/Vref так будет понятней. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lost_Viking 0 3 августа, 2008 Опубликовано 3 августа, 2008 · Жалоба А ЖК от чего? не помню. Вас в школе пропорцию составлять учили? Когда Vin=Vref получаем максимальное число которое ADC=Vin/Vref*1023 с какого перепуга в ДАТАШИТЕ пишут 1024??? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 3 августа, 2008 Опубликовано 3 августа, 2008 · Жалоба с какого перепуга в ДАТАШИТЕ пишут 1024??? Господи, как же тяжело с недоученными школьниками! :( В микроконтроллере AVR 10-ти разрядный АЦП. С помощью 10-и двоичных разрядов можно представить 1024 числа, но максимальное значение такого 10-и разрядного числа составляет 0b1111111111=0x03FF=1023. Если мне не верите, воспользуйтесь виндовым калькулятором для перевода из одной системы счисления в другую ;) Также не нужно забывать о том, что нуль это тоже число! 1023+1=1024 числа. Так понятно? Ну про прямую линию, ее графическое изображение и аналитическое представление (в виде формулы y=a*x+b ) вам надеюсь все-же объяснить не нужно? АЦП квантует входной сигнал по линейному закону (по крайней мере разработчики АЦП к этому очень стремятся :) ) _y_ = ________________ a _______________ *_x_ + __b__ ADC=(ADC(max)-ADC(min))/(Uref(max)-Uref(min))*Uin+ADC(min) поскольку значения ADC(min)=0 и Uref(min)=0V, а ADC(max)=1023, то формула приводится к виду ADC=1023/Uref(max)*Uin=1023*Uin/Uref(max) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lost_Viking 0 3 августа, 2008 Опубликовано 3 августа, 2008 · Жалоба вопрос остается открытым: почему в Даташите в этой формуле стоит 1024? Я-то прекрасно понимаю, что нуль - это тоже число, но мне непонятно почему в ДАТАШИТЕ для рассчета значения АЦП используют 1024. Ведь при этом совсем другое значение. Не веришь - сам посмотри, только там есть небольшая поправка к этому. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
domowoj 0 4 августа, 2008 Опубликовано 4 августа, 2008 · Жалоба Если в даташите написано - верь, но тогда диапазон входных будет от 0 до (Uref-Uref/1024) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dopler 0 4 августа, 2008 Опубликовано 4 августа, 2008 · Жалоба where VIN is the voltage on the selected input pin and VREF the selected voltage reference (see Table 22-2 on page 255 and Table 22-3 on page 256). 0x000 represents analog ground, and 0x3FF represents the selected reference voltage minus one LSB. Вот что написано в документации, а переводится это так - значение 0 говорит о том, что входное напряжение равно земле, значение 0x3FF говорит о том, что входное напряжение равно опорному минус напряжение одного младшего разряда (а не опорному!), т.е. верна формула из документации и в эксель надо писать 1024. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lost_Viking 0 4 августа, 2008 Опубликовано 4 августа, 2008 · Жалоба Вот что написано в документации, а переводится это так - значение 0 говорит о том, что входное напряжение равно земле, значение 0x3FF говорит о том, что входное напряжение равно опорному минус напряжение одного младшего разряда (а не опорному!), т.е. верна формула из документации и в эксель надо писать 1024. Короче, почти понятно. Нашел в инете понятный учебник по цифорвым фильтрам, в отличие от того, который мне тут предлагали. Вот ссылка. Там найдете "Уолт Кестер - Цифровые Фильтры". Кроме этого там много чего есть! Попробовал сделать осреднение результата АЦП. Примерно так: АЦП в режиме постоянного преобразования (free run) По совпадению таймера с OCR0 вызывается прерывание, при помощи которого реализована дин.индикация В этом же обработчике прерывания: 1 for (i=1;i<=9;i++) 2 {current_temp=ADCL; 3 current_temp+=((int)ADCH << 8); 4 summ+=current_temp;} 5 current_temp=summ/9; 6 summ=0; /*дальше идет разбиение числа по десятичным разрядам*/ Т.е. просто суммирую девять преобразований, и делю на их число. Т.е. нахожу среднее значение. В итоге младший разряд на индикаторе по-меньше стал дрыгаться. Noice Reduction (с прерыванием) не особо помог. Сдается мне, что у меня что-то работает как антена :). Сделал отдельный провод со входа АЦП, что бы вольтметром мерить напряжение на нем, и при касании этого провода рукой - циферки начинают бегать вплоть до второго разряда. Или все-таки в "коленной" разводке? Все сделано на макетке, спаяно медным лакированным проводом 0.2мм. Земля приходит почти везде в одну точку. Вот только аналоговая часть ненмого крива разведена. Вобщем, буду травить плату, посмотрю что получится. Как я понял рекомендации такие: разявязать аналоговую часть от цифровой конденсаторами, все землянные выводы в одну точку, конденсаторы по-ближе к микросхеме, на вход АЦП RC ФНЧ с частотой среза 10..50Гц. Так? Завтра попробую создать промежутки между включением анодов, что бы в эти промежутки впихнуть измерение сигнала. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 4 августа, 2008 Опубликовано 4 августа, 2008 · Жалоба вопрос остается открытым: почему в Даташите в этой формуле стоит 1024? Я-то прекрасно понимаю, что нуль - это тоже число, но мне непонятно почему в ДАТАШИТЕ для рассчета значения АЦП используют 1024. Ведь при этом совсем другое значение. Не веришь - сам посмотри, только там есть небольшая поправка к этому.Ну раз в даташите написано, то спорить не буду. :laughing: Тем более, что там в самом начале раздела описания ADC указано The ADC converts an analog input voltage to a 10-bit digital value through successive approxi- mation. The minimum value represents GND and the maximum value represents the voltage on the AREF pin minus 1 LSB. Т.е. входной диапазон напряжений для ADC: Uin(min)=0V, Uin(max)=Uref-Uref/1024 и на вход АЦП напряжение равное AREF подавать нельзя. Точнее конечно можно, но не имеет смысла. Тогда вполне логично получается. Подставляем в вышеуказанноую мной формулу ADC=(ADC(max)-ADC(min))/(Uref(max)-Uref(min))*Uin+ADC(min) значения ADC(max)=1023, ADC(min)=0, Uref(min)=0V, Uref(max)=Uref-Uref/1024=(1023*Uref)/1024 и получаем ADC=(1023-0)/((1023*Uref)/1024)-0V)*Uin+0, а после преобразований ADC=1024/Uref*Uin. Выходит формула в даташите верная. Просто таковы особенности этого АЦП в AVR, о которых я не знал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lost_Viking 0 4 августа, 2008 Опубликовано 4 августа, 2008 · Жалоба Попробуйте смоделировать (хоть в ёкселе) реакцию фильтра на единичный скачок (x=0 при i<0, x=1 при i>=0), поиграйтесь с A, и все станет просто и понятно. :07: :a14: и уважуха! Все, теперь я знаю "Простое скользящее среднее", "Взвешенное скользящее среднее" и "Экспоненциальное скользящее среднее". Возникло сразу несколько вопросов: (WMA) - как правильно рассчитать коэффициенты? Я пока беру 4 отсчета, соответственно ставлю 1/4. (EMA) - было бы интересно привязать коэфф. "А" к помехам, т.е. если вдруг начинается частое мельтишение младших разрядов, то уменьшить А. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VCucumber 0 4 августа, 2008 Опубликовано 4 августа, 2008 · Жалоба Все, теперь я знаю "Простое скользящее среднее", "Взвешенное скользящее среднее" и "Экспоненциальное скользящее среднее". Бугагага: // SMA - Simple Moving Average // EMA - Exponential Moving Average // WMA - Weighted Moving Average // DEMA - Double Exponential Moving Average // TEMA - Triple Exponential Moving Average // TRIMA - Triangular Moving Average // KAMA - Kaufman Adaptive Moving Average // MAMA - MESA Adaptive Moving Average // T3 - Triple Exponential Moving Average Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lost_Viking 0 5 августа, 2008 Опубликовано 5 августа, 2008 · Жалоба Бугагага: // SMA - Simple Moving Average // EMA - Exponential Moving Average // WMA - Weighted Moving Average // DEMA - Double Exponential Moving Average // TEMA - Triple Exponential Moving Average // TRIMA - Triangular Moving Average // KAMA - Kaufman Adaptive Moving Average // MAMA - MESA Adaptive Moving Average // T3 - Triple Exponential Moving Average пилять! :07: Вопрос такой: при использовании EMA метода, коэфф-т A должен быть вещественным. Т.е. в итоге функция получается вещественной. Но у меня дальше идет оператор "остаток от деления". Как мне согласовать вщественный тип с получением остатка от деления? Простое приведение типов не катит - нет округления. Т.е. мне нужно вещественное число округлить, а потом это число привести в целый тип. Как это реализовать на Си? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lost_Viking 0 5 августа, 2008 Опубликовано 5 августа, 2008 · Жалоба Так, все сделал. Сглаживает здорово! Огурцов, можешь дать ссылки на формулы для DEMA...MAMA? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xemul 0 5 августа, 2008 Опубликовано 5 августа, 2008 · Жалоба Вопрос такой: при использовании EMA метода, коэфф-т A должен быть вещественным. Т.е. в итоге функция получается вещественной. Но у меня дальше идет оператор "остаток от деления". Как мне согласовать вщественный тип с получением остатка от деления? Простое приведение типов не катит - нет округления. Т.е. мне нужно вещественное число округлить, а потом это число привести в целый тип. Как это реализовать на Си? Помните, что такое подмножество рациональных чисел? Правильно, это подмножество чисел, которые могут быть представлены в виде отношения (ratio = дробь, отношение) двух целых чисел. И примерно в то же время Вам должны были сообщить, что любое вещественное число может быть с любой точностью приближено рациональным (хотя нет - года на 3-4 позже). Дальше сами догадаетесь? Это в качестве посказки: Простейший НЧ фильтр 1-го порядка: Yi = a * Yi-1 + b * Xi, a+b = 1 Т.е. Y = a * Y + b * X; Для целочисленной арифметики удобно делать a=c/2^N, b=(2^N-c)/2^N. Чтобы не набегала погрешность при обработке, разрядность Y должна быть не менее (разрядность X) + N. Y = a * Y + b * X; // это фильтр на С; X - новое входное значение, Y - справа предыдущее выходное значение, слева - новое. u16_t Yavg; for(;;) { Yavg -= Yavg/256; Yavg += ADCH; } А это целочисленная реализация приведенного выше фильтра с коэффиентами a=255/256, b=1/256. Ну и уж совсем на всякий случай: деление целого числа на 2^N компилятор заменит на N сдвигов вправо. 256 = 2^8. ЗЫЖ я к своему детенышу (которому, думаю, примерно столько же годочков, сколько и Вам) за серьезной беседой обращаюсь на "Вы". ЗЗЫЖ радует, что в Ваших постах не так уж много проблем с русским языком. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VCucumber 0 5 августа, 2008 Опубликовано 5 августа, 2008 · Жалоба Огурцов, можешь дать ссылки на формулы для DEMA...MAMA? Держи http://ta-lib.org/hdr_dw.html Надеюсь, дальше сам найдешь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lost_Viking 0 5 августа, 2008 Опубликовано 5 августа, 2008 · Жалоба ЗЫЖ я к своему детенышу (которому, думаю, примерно столько же годочков, сколько и Вам) за серьезной беседой обращаюсь на "Вы". ЗЗЫЖ радует, что в Ваших постах не так уж много проблем с русским языком. Ну, извинните, я думал, что тут люди простые. Лично я не люблю когда меня на "Вы". Мне проще на "Ты". Сразо как-то "по-свойски". Если чем-то задел, то прошу прощения. Кстати, я себе EMA сделал. смотрю на девайс и радуюсь =) Позже поэксперементирую с другими фильтрами. Ко всем: EMA - это КИХ или БИХ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться