freebits

Members
  • Content count

    50
  • Joined

  • Last visited

Community Reputation

1 Обычный

About freebits

  • Rank
    Осваивающийся

Электроника

  • Стаж в электронике
    Менее года
  1. Atmega16 - значения с АЦП "пляшут"

    Ок, спасибо
  2. Atmega16 - значения с АЦП "пляшут"

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

    Все разобрался. Проблема была в гнезде. Все из-за того, что в гнезде земля сажалась на корпус аппарата. Соединил датчик напрямую и все заработало как надо. Даже пробовал тестить на больших температурах. замерял другим термометром вроде бы все правильно показывает. По отдельности не проверял, запустил только после всех переделок, аппаратных и программных. Думаю, все в кипе было - п.1+2, хотя как мне кажется больше всего влияние оказывал способ замера, т.е. п.1.
  4. Atmega16 - значения с АЦП "пляшут"

    Всем отписавшимся огромное спасибо за помощь - все получилось! Измерение стало стабильно и точно - даже до десятых вольт, притом даже без усреднения. Выводимые показания абсолютно нисколько не скачут, притом реагирует моментально на изменение напряжения. Что было сделано: 1. Программно: переделал постоянное измерение на измерение по таймеру. 2. Аппаратно: подключил блокировочные конденсаторы 100 нФ к опорному напряжению и входу АЦП, а также добавил фильтр питания АЦП, состоящий из катушки 10 мкГн и конденсатора 100 нФ (схема внизу). Питание АЦП завел из точки подачи 5-ти Вольт на плату, без подключения к этой линии цифровых потребителей. На текущий момент с переменным резистором все работает как надо - показания меняются в требуемом диапазоне, все как нужно.Даже уже сделал конвертацию в температуру и при 10 омах показывает 27°С. Единственное - с датчиком почему-то картина немного другая - при его подключении вместо переменного резистора, его сопротивление как-будто падает с 10 Ом до 0, хотя КЗ по этой линии нет - сопротивление измеряется. Странное поведение, но это уже другая история, буду разбираться, возможно другие датчики буду пробовать. Главное - теперь измерение регистрируется как мне нужно. Всем спасибо еще раз.
  5. Atmega16 - значения с АЦП "пляшут"

    Понял, спасибо.
  6. Atmega16 - значения с АЦП "пляшут"

    Спасибо за код! Подскажите здесь при каждом вызове функции массив buf будет переинициализироваться или как раз конструкция static защищает от этого?
  7. Atmega16 - значения с АЦП "пляшут"

    Давайте внесу ясность, чтобы предметно говорить и не гадать на кофейной гуще, что есть по факту и для чего все. В общем, я конструирую паяльную станцию. На данный момент все подключено в точности по схеме ниже (только что зарисовал) и все работает прекрасно, кроме, конечно же, регистрации температуры. Даже интерфейсная оболочка уже написана (выбор одного из 5-ти термопрофилей: два готовых (бессвинцовый и свинцовосодержащий припой) и три ручных). На данном этапе произвожу наладку регистрации температуры. Имеется датчик температуры до 500°С - позистор, у которого сопротивление меняется от 0 до 60 Ом (при комнатной температуре 10 Ом). Предусилительный каскад отлажен и испытан при помощи на 100-омного переменного резистора вместо датчика температуры. На выходе каскада, как и задумано, напряжение меняется от 0 до 2,6 Вольт при изменении сопротивления от 0 до 60 Ом. Есть калибровка через подстроечный резистор. Осталось теперь оцифровать значение на аналоговом входе для дальнейшей обработки. Порт С пока не задействован, т.к. на данном контроллере находится в неисправном состоянии. После замены микросхемы, порт С планируется задействовать на управление 5-ью секциями нагревателей (каждая секция - это два 1 кВт-ных нагревателя, подключенных последовательно; итого 10 нагревателей общей мощностью 2,5 кВт). Секции можно отключать/включать в зависимости от заданных настроек. Плюс также порт С будет задействован на индикацию 3-х светодиодов. Итого свободным будет только 1 пин PA7 (DCA7), который возможно тоже будет задействован в качестве обратной связи с драйверов нагревателей. Как мне подсказали выше, предстоит переделать аналоговое питание, ввести фильтры, в т.ч. опорного напряжения, аналогового питания и, я так думаю, еще аналогового сигнала. Скорее всего так и сделаю - буду производить измерение по таймеру. По поводу "посадки на землю" я погорячился)) я имел в виду, что на выходе предусилительного каскада присутствовал 0, это конечно не одно и тоже. Но осциллографом отчетливо было видно, что там нет шума амплитудой 0,4 Вольта. В выходные реализую переделки по питанию, и фильтры. До выходных переделаю постоянное измерение на измерение по таймеру.
  8. Atmega16 - значения с АЦП "пляшут"

    Спасибо! Оказывается про это есть в даташите. Надо даташит внимательнее изучить. Ясно, спасибо! Действительно в программе еще обрабатывается прерывание переполнения таймера , поэтому запросто оно может вклиниться, учту и этот момент. Как появится время, реализую все переделки, потом отпишусь о результатах.
  9. Atmega16 - значения с АЦП "пляшут"

    Ммм, про данные тонкости я был вообще не вкурсе. Спасибо! Тогда вначале переделаю аналоговое питание и добавлю фильтры! Вы имеете в виду схему в протеусе выше? Если да, то да - она работает, но только на замедленной скорости можно что-то увидеть. На той скорости, на которой сейчас работает отрисовка реального дисплея, в протеусе совершенно другой эффект, и лишь видно как иногда, почти в хаотичном порядке зажигаются светодиоды. Я использовал эту модель для отладки отрисовки.
  10. Atmega16 - значения с АЦП "пляшут"

    Ок, понял, спасибо. AVCC у меня подключено к выводу VCC, а VCC запитывается от стабилизированного источника питания (БП от принтера). Проверю осциллографом форму напряжения, но думаю что там напряжение должно быть без скачков. Про UART погляжу сейчас. Наименование отсутствует. Он от китайского цифрового вольтметра, заказывал через алиэекспресс, т.к. они уже были с внешней оправкой и цена не сильно большая. Электрическую схему зарисовал, даже пытался выводить что-то в протеусе. Таблицу истинности тоже зарисовал. Когда заказывал, думал что будут стандартные, но пришло то что пришло
  11. Atmega16 - значения с АЦП "пляшут"

    Ок, спасибо, попробую внедрить усреднение. Спасибо, попробую поставить конденсатор 0,1 мкФ на Vref. Вот с проверкой кода в Протеусе именно для данного случая есть загвоздка - в Протеусе отсутствует тот цифровой индикатор, который я использую - 10-пиновый трехразрядный led-индикатор. У него индикация реализована не как у стандартного нидикатора поразрядно, а посегментно, т.е. в единицу времени можно зажечь только 1 сегмент, и соответственно отрисовка цифр идет совершенно по другому. Т.е. я не смогу никак увидеть какие именно показания измеряет АЦП.
  12. Добрый день. Реализовал получение и обработку аналогового сигнала как в данной статье -> ссылка. Т.е. используется внутреннее опорное напряжение 2,56 Вольта, прием через прерывания, а на дисплее выводится числовое значение напряжения, которое присутствует на входе АЦП - нога ADC6. В обработчике прерывания считываются значения из регистров ADCL и ADCH, из которых формируется значение переменной adc_value. В теле программы данное значение АЦП преобразуется в значение напряжения, посредством деления adc_value на 400. Затем полученный результат выводится на дисплей. Проблема в том, что выводимое значение не стабильно и скачет в диапазоне +/- 300 мВ. Т.е. если к аналоговому входу приложено напряжение 1,4 вольта, то на дисплее значения будут хаотично меняться в диапазоне от 1,1 Вольт до 1,7 вольт, т.е. весьма ощутимый разброс в сотни милливольт. При этом если смотреть сигнал на входе осциллографом, то по факту нет такой картины - максимальный разброс (Vpp) составляет несколько десятков милливольт, но никак не сотен. Даже если этот вход посадить на землю, все равно на дисплее будут хаотичные значения доходящие до 0.4 вольта. Откуда он берет такие цифры на понятно. Подскажите, в чем может быть проблема и как получить стабильные показания, хотя бы до сотен милливольт? unsigned int adc_value; char high_adc=0, low_adc=0; ISR(ADC_vect) //обработчик прерывания ADC_vect { low_adc = ADCL; high_adc = ADCH; //Верхняя часть регистра ADC должна быть считана последней иначе не продолжится преобразование adc_value = high_adc * 256 + low_adc; //значение АЦП } void ADC_Init(void) //инициализация АЦП { ADCSRA |= (1<<ADEN) // Разрешение использования АЦП |(1<<ADSC) //Запуск преобразования |(1<<ADATE) //Непрерывный режим работы АЦП |(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)//Делитель 128 = 64 кГц |(1<<ADIE); //Разрешение прерывания от АЦП ADMUX |= 0b11000110; //Внутренний Источник ОН 2,56В вход ADC6 } void main(void) { float n = 0; while(1) { n = (float) adc_value / 400; // преобразование значения АЦП в напряжение /* Отправка на дисплей */ _delay_ms(2); } }
  13. Atmega16A - почему частота маленькая

    Про фьюзы изучил несколько статей. В принципе все ясно, в калькуляторе поглядел какие биты мне нужно установить. Только ни в одной статье не сказано в каком месте они задаются. Можете подсказать как это делается? В среде разработки? Если да, то где эти установки находятся в Atmel Studio? А все нашел - в программе для программатора МiniPro есть, попробую выставить)) Да, все вышло, спасибо больше всем за помощь! Микросхема в разы быстрее стала работать!))
  14. Atmega16A - почему частота маленькая

    Спасибо, теперь понятно почему delay неправильно отрабатывает (дольше чем должно). Я знаю как работает #define, мне почему-то изначально втемяшилось что этой строчкой задается значение некоего конфигурационного регистра, и особо не вдавался в ее смысл.
  15. Atmega16A - почему частота маленькая

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