Перейти к содержанию
    

AngelChik

Участник
  • Постов

    17
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о AngelChik

  • Звание
    Участник
    Участник
  1. Точняк! Забыл, спасибо. Сброс производится записью 1 в него? правильно? Типа ADCSRA |= (1<<ADIF); ? Так?
  2. Спасибо ещё раз за мнение и совет. Снижу сопротивление в 10 раз, отпишуся... Факир был пьян, фокус не удался :((( Заменил на делитель 4,7/1,0 кОм, не помогло нисколечко...Куда копать дальше?... Забыл признаться в гадости - у меня питание AVCC через фильтр 10 Ом 10 мкФ. Это ведь никак не могло повлиять? Есть одна подвижка, подтверждающая теорию о недозаряде. Ускорил клоки АЦП со 128 до 16... Теперь напряжение показывает не 9,5 против реальных 12, а 4.7 :))) Питание - 5.03, на ИОНе - 2.563... Вроде всё как и должно быть. 5 выборок - это пока произвольно, здесь дело в принципе запустить для начала. Не совсем понял, а что за корректива??? Ну насчёт переворота понятно, поэтому я и поменял местами переменные samples1 и samples2. АААААА... До меня дошло, о чём Вы :)))) Первое считывание второго цикла - это результат из последнего считывания первого цикла, а вношу в усреднение другой переменной :))) Ща исправим. Теперь код у нас вот такой: |= (1<<ADSC); ADMUX = (1<<REFS1) | (1<<REFS0) + 0; while(ADCSRA & (1<<ADIF)); U8 low = ADCL; U16 ADCResult = low + (ADCH<<8); samples2 = (ADCResult*2.56)/1024; __delay_cycles(32000); // - 2 мс ADCSRA |= (1<<ADSC); ADMUX = (1<<REFS1) | (1<<REFS0) + 1; while(ADCSRA & (1<<ADIF)); U8 low = ADCL; U16 ADCResult = low + (ADCH<<8); samples1 = (ADCResult*2.56)/1024; fU = samples1*5.7; УРААААА!!!!!!!! Я пошёл искать бетонную стену... Вот это чё такое?!?!!? while(ADCSRA & (1<<ADIF)); А должно быть while(!(ADCSRA & (1<<ADIF))); Ждать-то надо, пока нет флага!!! ИТОГ: void ADC_task() { if(!bMeasure) return; samples1 = 0; ADMUX = (1<<REFS1) | (1<<REFS0) + 0; __delay_cycles(10); for(U8 i=0;i<5;i++) { ADCSRA |= (1<<ADSC); while(!(ADCSRA & (1<<ADIF))); U8 low = ADCL; U16 ADCResult = low + (ADCH<<8); samples1 += (ADCResult*2.56)/1024; } samples1 = samples1/5; fU = samples1*5.7; samples2 = 0; ADMUX = (1<<REFS1) | (1<<REFS0) + 1; __delay_cycles(10); for(U8 i=0;i<5;i++) { ADCSRA |= (1<<ADSC); while(!(ADCSRA & (1<<ADIF))); U8 low = ADCL; U16 ADCResult = low + (ADCH<<8); samples2 += (ADCResult*2.56)/1024; } samples2 = samples2/5; bMeasure = false; }
  3. Эгеее... Спасибо, ща попробую. Ну вот, "перевернул"... void ADC_task_init() { ADCSRA |= (1<<ADEN); DIDR0 = 0xFF; ADMUX = (1<<REFS1) | (1<<REFS0) + 1; ADCSRA |= (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0); ADCSRB = 0x00; } void ADC_task() { if(!bMeasure) return; samples2 = 0; for(U8 i=0;i<5;i++) { ADCSRA |= (1<<ADSC); ADMUX = (1<<REFS1) | (1<<REFS0) + 0; while(ADCSRA & (1<<ADIF)); U8 low = ADCL; U16 ADCResult = low + (ADCH<<8); samples2 += (ADCResult*2.56)/1024; } samples2 = samples2/5; __delay_cycles(16000); // - задержка в 1 мС... Хренли толку?!? samples1 = 0; for(U8 i=0;i<5;i++) { ADCSRA |= (1<<ADSC); ADMUX = (1<<REFS1) | (1<<REFS0) + 1; while(ADCSRA & (1<<ADIF)); U8 low = ADCL; U16 ADCResult = low + (ADCH<<8); samples1 += (ADCResult*2.56)/1024; } samples1 = samples1/5; fU = samples1*5.7; bMeasure = false; } Получилась вот такая дрянь. Протестил. 12 вс 9,5 вольт... Бошкой об стенку бы побился, да не поможет, ибо стены из гипсокартона... А что на счёт входного сопротивления? Не многовато-ли?... Предделитель - 256, частота - 16 МГц, задержка - 1 мс....
  4. В курсе, читал. Доки уже наизусть... Я же написал, что делал задержки после модификации ADMUX, никакого толку нет, всё равно бред считывает.
  5. mega2561, проблема в АЦП с ADMUX

    Всем доброго времени!!! Помогите пожалуйста разобраться в проблеме... Устал, уже весь мозг сломал, всё перепробовал. Устройство: АЦП контроллера измеряет сигнал через делитель напряжения (47/10 кОм), уровень сигнала после делителя - 2 вольта (к примеру). Таких три входа - ADC0-2. Проблема заключается в том, что если считывать только один канал, то всё измеряется на ура, всё (почти) точно по вольтметру. НО! Если в процессе измерения добавить второй канал (или любой другой), то отконвертированное напряжение становится "не правильным", например вместо 12,6 вольт начинает показывать 9.5. Тем не менее, считанное значение остаётся пропорциональным сигналу. Вот код: void ADC_task() { if(!bMeasure) return; __disable_interrupt(); - это я добавил только для пробы, влияет ли таймер динамической индикации на работу АЦП... samples1 = 0; ADCSRA &= ~(1<<ADSC); ADMUX = (1<<REFS1) | (1<<REFS0) + 0; for(U8 i=0;i<5;i++) { ADCSRA |= (1<<ADSC); while(ADCSRA & (1<<ADIF)); U8 low = ADCL; U16 ADCResult = low + (ADCH<<8); samples1 += (ADCResult*2.56)/1024; } samples1 = samples1/5; fU = samples1*5.7; - компенсация делителя ADCSRA &= ~(1<<ADSC); - это тоже уже от нечего делать... ADMUX++; если закомментировать эту строчку, то напряжение fU - в норме, совпадает с реальным, а если не комм. - то меньше реального на некоторое значение samples2 = 0; for(U8 i=0;i<5;i++) { ADCSRA |= (1<<ADSC); while(ADCSRA & (1<<ADIF)); U8 low = ADCL; U16 ADCResult = low + (ADCH<<8); samples2 += (ADCResult*2.56)/1024; } samples2 = samples2/5; bMeasure = false; __enable_interrupt(); - аналогично disble'у... } После смены каналов (ADMUX) вставлял задержки __delay_cycles(), самые разные, даже до 1 секунды... Пробовал клокить АЦП по таймеру... От чипа к чипу не меняется ничего (таких 10 плат). Ничего не помогает... У меня осталось только одно подозрение. Как Вы считаете, может делитель 47/10 кОм имеет слишком большое сопротивление для нормальной работы АЦП? Дело в том что сейчас по факту, на втором канале (ADC1) 0 вольт (делитель пустой), ни к чему не подсоединён ("пирожок ни с чем" :)))... Вот я и подумал, переключение коммутатора с 2 вольт на 0 и обратно, поэтому надо вставить задержки после модификации ADMUX... Хрена. Не помогло никак. Есть интересное наблюдение: если просмотреть самое первое считанное значение fU, то оно будет нормальным в любом случае, так как сразу после запуска проги на контроллере, первым измеряется именно ADC0, но после него идёт переключение канала ADMUX++ (раньше задавал жёстко, без считывания). Отсюда вывод: как только происходит хотя бы одно переключение, то следующие считывания канала ADC0 становятся испорченными... ПОЧЕМУ??? Снимал кондёр с риференс (был 1 нФ), пробовал увеличивать до 1 мкФ, ноль эмоций :(( К меге подсоединено восемь семисегментных индикаторов, реализована динам. индикация через таймер с прерыванием. Что скажете? Что непонятно - спрашивайте. Могу выложить фотки устройства...
  6. Насчёт того что мне нужно, пожалуй, я разберусь сам :) Ооох. Женщины :) В хорошем смысле этого слова :) Если я сказал, что мне это надо, значит так оно и есть, независимо от чьего-либо мнения. :smile3009: Насчёт ИУ - спасибо, 8552 как раз. Правда, там 3 Вольта питания, LDO 3V примЕним. Не могли бы Вы мне помочь в составлении схемы для дифф. усилителя? Похоже на правду, или я опять хрень нарисовал? __________________.BMP
  7. Ааа....Чтобы висяка при обрыве не было... К нулю подтягивает. А вот что за аппроксимация - очень интересно выяснить. Имитатор точки плавления мне не нужен, пока я просто пытаюсь ПОЛНОСТЬЮ разобраться в схеме. ВОт один пунктик с резистором понять надо. А насчёт приподнять... Потому что однополярная схема?... Ну да. А что такое ИУ? Блин, всю голову сломал :) Может ОУ :) ??? Или это Я дурак :))) А может Вы имели ввиду Источник Опорного Напряжения? Да что же это :) :smile3046:
  8. Ето есть, читал, спасибо. И даже сами усилки в наличии... Этот даташит уже наизусть перечитан, но так и не ясен до конца смысл резистора R4 (по ДШ)...
  9. За ответы конечно спасибо, но хотелось бы услышать причины, а то как-то не информативно совсем :( Это из-за того, что делители никогда не получатся одинаковыми, и будет ещё хуже, чем в первом случае? И вот ещё вопрос: На первой схеме, по первой ссылке, положительный вывод термопары соединён с опорным делителем (+компенсация холодного спая), а какую функцию играет сопротивление R10? Вот к стати говоря, вы говорите - не пропускать через неё ток, а вот в этой схеме как раз через этот резистор и пропущен ток. Для чего тогда? VD1, R1, R2, R9 являются источником напряжения смещения в зависимости от температуры точки компенсации нуля. Значит, там есть напряжение с одной стороны термопары, а другая сторона термопары подключена к нулю через сопротивление. Получаем ток, ограниченный = Uоп/(5,62 кОм + Rтп). Ток на вход ОУ примем равным нулю... Хочу отметить, что этот ток ко всему прочему подобрали довольно точно, раз берут 1% сопротивление. Зачем? Народ, помогите разобраться в схеме до конца, пожалуйста! ВОт, я рассчитал к примеру, что при падении напряжения на диоде = 0,5В, на термопаре (при ЭДС = 0) упадёт 3,4 мкВ при её сопротивлении = 2 Ома. К чему это??? Не совсем понятно. К тому же значение падения будет полностью зависеть от сопротивления ТП. Непонятно мне чего-то... При коэф. 47 мкВ/градус (для Хромель-капели) 3,4 мкВ - это фигня (может, именно поэтому в ОВЕНах пишут про макс. сопротивление линии = 10 Ом, чтобы не было погрешности, при 10 Омах это уже 3.4*5 = 17 мкВ). Ну так может его вообще убрать из схемы? Тогда ток через ТП течь не будет и не будет и этой погрешности по сопротивлению линии. Напряжение компенсации холодного спая будет складываться с ЭДС термопары и усиливаться УО с соотв. КУс.. Зачем этот ужас с R10??
  10. Для диф. термопары капели ждать не надо :) Достаточно соединить их вместе в жидкости. А если сделать вот так? Извиняюсь, забыл картинку сохранить. __________________.BMP
  11. Ну это я так, а есть другие варианты? Ток я специально поменьше взял, чтобы не было падения напряжения. Тем более сопротивление термопары маленькое, это всё-таки не хромель-капель... Плюс ко всему будет калибровка нуля программная. А резисторы наверное, всё таки R3 и R6? R5 и R2 относятся к делителям для установки фиксированного КУс. Или я не прав?
  12. Всем добрый Х. Даже не знаю с чего начать... Есть стандартные схемы термопарных усилителей от AD по аплиухам. Вот пример _http://progcode.narod.ru/stati/ustermo.html. Я бы хотел сравнить две схемы и понять, могу ли я применить вот такую схему при использовании дифференциальной термопары. Это две соединённые встречно-последовательно термопары. Последнюю схему я нарисовал сам, из мозгов. Применение схемы - это измерение дельты температуры на объекте, а значит и компенсация нуля не нужна, схему со смещением на диоде я убрал. Усилитель будет подключаться к компьютерной АЦП NI 6036E и обрабатываться будет на LabView, там же и будет таблица тарировки. Поэтому коэффициент усиления таким уж точным быть не должен (кратным 39 мкв/град. на вх. / 10 мв на градус на вых., к примеру). Я его взял допустим, 1000 для того, чтобы исключить из схемы высокоточные резисторы (но я их подберу по номиналу). Сама термопара - медь-константан. Значит, вопросы: 1). Питание - однополярное, поэтому я ввёл два резистора по 10 к (R3 и R6) для того, чтобы вывести вход ОУ на середину питания (лишь бы не около нуля или "+"). Правильно ли я сделал? 2). Можно ли здесь применить что-нибудь вроде LM358? По каким параметрам необходимо подбирать ОУ? 3). Что ещё на схеме не так, или что бы вы посоветовали добавить/изменить? __________________.BMP
  13. Вообще раньше при прокладке я ни разу не использовал такие маленькие микросхемы и до неё таких проблем не возникало вообще. Трассировщик всегда сам сужал дороги.
  14. Ну а причём здесь скриншоты? От чего вообще это зависит?
×
×
  • Создать...