Официальный сайт компании Arduino по адресу arduino.cc
Измерение амплитуды импульса
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Чт, 07/04/2016 - 10:49
Длительнлсть импульса - 5 мксек.
Через 1 мксек после переднего фронта включаю канал в ADMUX,
затем устанавливаю ADSC в ADCSRA, дожидаюсь сброса ADSC, читаю ADCL, ADCH.
Результат = 0. Измерение постоянного напряжения на том же канале проходит нормально.
Упоминания о длительности удержания сигнаа на входе в даташите на ATmega328P
обнаружить не удалось.
Помогите разобраться.
Спасибо.
DeGlucker, такие вопросы нужно скетчем сопровождать.
В setup:
ADCSRA = _BV(ADEN) | 7; // prescaler = 128
В прерывании:
delay_x(4); // 1 usec
ADMUX = _BV(REFS1) | _BV(REFS0); // 1.1V, A0
bitSet(ADCSRA,ADSC);
bitSet(flags,FLGADC);
В loop:
if (bit_is_set(flags,FLGADC) && bit_is_clear(ADCSRA,ADSC)) {
ADresult = (ADCL | ADCH<<8);
bitClear(flags,FLGADC);
pulse(4); // тестовый сигнал
}
Интервал от импульса до тестового сигнала - 130 мксек, т.е. ADC отрабатывает нормально.
повторяю: если подать на A0 постоянное напряжение, то все Ок.
Сильно подозреваю, что импульс в 5мксек слишком короткий. Насколько помню там скорость нормарована в 15к, а у вас куда как больше - 200к.
Можно загрубить АЦП убрав 2 старших разряда, тогда оно может измерять до 1Мгц .. в даташите было упоминание про это.
DeGlucker, А что вы обрывки даёте, какой вывод можно сделать глядя на это? Пока одни вопросы, что за прерывание, зачем в нём пауза, зачем настраивать мукс? В общем нужно весь код видеть. И кстати вставляйте код по правилам.
Нашел в даташите:
The actual sample-and-hold takes place 1.5 ADC clock cycles after the start of a normal conversion...
т.е. длительность импульса должна быть не иенее 12 мксек при T = 1/16*128 = 8 мксек
Извините за беспокойство.
Для 5 мкс придется городить схему, Для АЦП не годится. Нижняя граница времени преобразования 65 мкс, допустим Вы разгоните в два раза и отрежете два младших бита - выйдет 29-30 мкс. Никаких защелок на входе нет, следовательно Вам нужно делать защелку - самостоятельно:
Вы заряжаете импульсом конденсатор через диод, чтобы после того, как импульс пропал, конденсатор не разряжался в сторону источника сигнала. А разряжаете Вы конденсатор через повторитель напряжения, по Вашей любимой схеме (можно на одном ОУ), лишь бы входное сопротивление было побольше, в выхода повторителя напряжения Вы снимаете сигнал на ардуинку. Далее нужно разрядить кондер: тут два варианта - либо отдельной ногой контроллера, если есть свободная, либо расчитать разряжающий резистор, так чтобы хватило времени на АЦП, и потом сделать задержку в программе для полного разряда, до следующего измерения, но это менее надежно.
Добавлю картинку, чтобы понятнее было:
слева источник импульсов, справа - пин АЦП ардуинки, сверху - диджитал нога ардуины для разрядки кондера, выводом на нее "0".
Кондер - керамика, ОУ - мой любимый LM358, очень уж он мне ценой нравится ;), он до 1-2 МГц, Вам хватит.
Простите, забыл со схемы убрать вольтметр, это я ее в тесте гонял, на него не смотрите.
Про падение на диоде не забудьте, ставить шотке лучше. Повторитель на ОУ не обязателен перед АЦП. У него входное 1МОм. А вот на входе перед диодом может и нужен, неизвестно что там за источник импульса. В принципе ловить 5мс и без этого не безнадежно, с потеей точности разумеется. Сразу код надо проверить на более длинном импульсе, скорей дело в баге.
Логик! На вход тоже можно. В корпусе 358 как раз два ОУ. Вообще чудесная защелка импульсов получилась. Компактная и дешевая. Может есть способ сохранить ее на форуме как полезную. Вы не знаете как? DIP корпус за 12 руб +2 диода, конденсатор и резистор. RC у меня 1 микросекунда. Можно меньше сделать, если повторитель на входе будет.
Да, частота оцифровки влияет на её скорость и точность. Как понимаю, последние разряды цифроутся позже, и если вы поднимите скорость оцифровки вдвое, то теряете старший разряд, но сокращаете время.. то есть 250кгц = 9 бит и 6мксек, 500кгц = 8 бит. и 3мксек. :)
Поставил prescale = 32. За 5 мксек успевает, биты не обрезались, выдает то 997, то 998, то 995 (сигнал с шумами )
Пиковый детектор в другом канале уже есть, там импульс 0.1 мксек, растягивается тоже до 5
Работает неплохо, только надо учитывать небольшой разряд конденсатора за счет емкости диода.
Надо даташит глянуть, давно уже в ADC не лазил ..
Так можна даже три )) Вопрос про нужно. По входу-нужно источник сигнала знать, а на АЦП не обязательно. ПС. ОУ хороший. Но то не значить, что его везде совать.
Ребята а можно ли при помощи этой схемы делать измерения 220в в сети через АЦП?
Выходит можно! Только кода по применению нет, интересно только точность в три единицы сохранится?
DeGlucker, А что вы обрывки даёте, какой вывод можно сделать глядя на это? Пока одни вопросы, что за прерывание, зачем в нём пауза, зачем настраивать мукс? В общем нужно весь код видеть. И кстати вставляйте код по правилам.
ну это то понятно... схему бы стробирования в студию
DeGlucker поделитесь пожалуйста схемой очень нужно.
Схема пикового детектора приведена в #11, только между конденсатором и A0 добавлен повторитель на LF353.
Инициализация АЦП:
ADMUX = _BV(REFS1) | _BV(REFS0); // int 1.1V, ADC0
ADCSRA = _BV(ADEN) | adcrate;
Процедура измерения:
1. Ставим HOLD в 0
2. Запускаем АЦП (bitSet(ADCSRA,ADSC);)
3. После прохождения импульса ставим HOLD в 1 (разряжаем С)
4. Дожидаемся окончания оцифровки (bit_is_clear(ADCSRA,ADSC)), считываем регистры ADCL, ADCH
Схема пикового детектора приведена в #11, только между конденсатором и A0 добавлен повторитель на LF353.
Инициализация АЦП:
ADMUX = _BV(REFS1) | _BV(REFS0); // int 1.1V, ADC0
ADCSRA = _BV(ADEN) | adcrate;
Процедура измерения:
1. Ставим HOLD в 0
2. Запускаем АЦП (bitSet(ADCSRA,ADSC);)
3. После прохождения импульса ставим HOLD в 1 (разряжаем С)
4. Дожидаемся окончания оцифровки (bit_is_clear(ADCSRA,ADSC)), считываем регистры ADCL, ADCH
Спасибо,скажите а на что можно заменить AD8041? а то боюсь не найду у нас такой .
пишу сейчас нечто подобное пока добился следующих результатов: нога ацп опрашивается с частотой порядка 4 Кгц, из её показаний высчитывается квадрат, так-же замеряется время между пиками напряжения и пресчитывается в частоту, в диапазоне 100-380В точность вроде-бы порядка 0.1% точнее выяснить не могу ибо нет ни осцилла ни латра, из минусов - слепая зона в отрицательной волне. схемотехника построена на простом делителе напряжения из 6-ти резисторов и одного кондёра( резистор большего номинала собран из 4-х) если будет нужно нарисую схемку
совсем забыл, код писался под нано 3.0 на нём и проверялся
пишу сейчас нечто подобное пока добился следующих результатов: нога ацп опрашивается с частотой порядка 4 Кгц, из её показаний высчитывается квадрат, так-же замеряется время между пиками напряжения и пресчитывается в частоту, в диапазоне 100-380В точность вроде-бы порядка 0.1% точнее выяснить не могу ибо нет ни осцилла ни латра, из минусов - слепая зона в отрицательной волне. схемотехника построена на простом делителе напряжения из 6-ти резисторов и одного кондёра( резистор большего номинала собран из 4-х) если будет нужно нарисую схемку
совсем забыл, код писался под нано 3.0 на нём и проверялся
Схема бы не помешала
пишу сейчас нечто подобное пока добился следующих результатов: нога ацп опрашивается с частотой порядка 4 Кгц, из её показаний высчитывается квадрат, так-же замеряется время между пиками напряжения и пресчитывается в частоту, в диапазоне 100-380В точность вроде-бы порядка 0.1% точнее выяснить не могу ибо нет ни осцилла ни латра, из минусов - слепая зона в отрицательной волне. схемотехника построена на простом делителе напряжения из 6-ти резисторов и одного кондёра( резистор большего номинала собран из 4-х) если будет нужно нарисую схемку
А вот это правильно! Путь истиного джедая не в усложнении схем, а в понимании сущностей;)
Если еще немного призадуматся, то измерять непрерывно нет нужды. Достаточно после пика отмерить паузу типа 99% от периода входного сигнала полученого на предыдущем измерении. В течении этого времени всеравно ниче интересного не будет, ну спадает синусоида, уходит в минус, потом растет возвращается в плюс. Оно нам нада АЦП гонять впустую?! И только перед самим ожидаемым пиком начинаем мерить максимально часто чтоб поймать пик максимально точно.
В общем приходим к идее следящей системы, которая поддерживает свой период равным периоду измеряемого сигнал по замерам фазы. И замеры фазы можна делать не в пике а при проходе через 0 при наростании, например. Как удобней вобщем. Бонус - очень низкая загрузка проца.
кстати может кто-то по моему вопросу что-то скажет? нужно для этой-же железки
http://arduino.ru/forum/programmirovanie/pobitnaya-rabota-s-kom-portom
А в чем вопрос то? В той теме банальнейшее использование сириала намечается. Почитайте про uart типа для вступления и понимания, и http://arduino.ru/Reference/Serial для применения, особенно по ссылкам в конце на методы класса.
может конечно и банальное, стоит учесть что я чайник начавший это всё изучать 8 дней назад, про уарт читал, да и класс сериал тоже курил, но понять как мне превратить переменную в интеджере вот в эту конструкцию из бит в упор не понимаю, проблема в том что исходников прошивки остального железа у меня нет, так что мне-бы хоть примерный образец кода
Та какой там может быть пример ))) сформировать 4 байта какие надо и выпихнуть в сириал. Это слишком просто.
ПС. На схеме номинал С1 надо на 2 порядка уменьшить, а то постоянная времени пошти секунда выходит, для 50Гц многовато, хотя если только период нужен, то не принципиально.
схема собрана была из подножного корма, так КАК их сформировать-то? может это и прописная истина но всё-же? ибо ещё пол часа и гугл меня забанит как окончательно беспросветного идиота
Так откуда ж уважаемые форумчане могут знать как вам их формировать? У вас они названы например Байт1 и крестики внутри. Вам наверно видней как эти байты формировать, где брать даннные и чему они равны. И какой алгоритм для crc нужен. Мы ж тут безсильны! Только можем подсказать что отправлять их через методы Serial.
ок, расписываю, тот самый случай когда спрашивающий сам не понимает что он спрашивает, имеем:
1) значение int полученное с ацп
2) значение "статус канала" булева переменная
3)СRC8 описана в программе-приёмнике вот так:
нужно сформировать 4 байта в которых:
1) все старшие биты установлены в 0
2)в битах с первого по пятнадцатый (по схеме) находится значение с ацп
3) в битах 16-19 значение булевой переменной
4) в 20-ом бите старший бит CRC8
5) четвёртый байт содержит остаток бит CRC8
если кто-то таки сможет помочь могу отблагодарить парой нано 3.0 или голых 8535 16au
Svod616, Вы сами себе противоречите: первый пункт противоречит остальным.
В том, что Вам нужно, нет ничего сложного - это все записывается в одну строку, просто нужно корректно сформулировать условие (чего у Вас пока нет, и что никто кроме Вас сделать не сможет) и сформировать число, используя битовые операции.
На всякий члучай: биты принято нумеровать с 0. Не знаю, учитывали ли Вы это обстоятельство в "биты с первого по пятнадцатый" и других местах.
И лучше составить табличу, в которой однозначно бы было записано, в какие биты что помещается. Без использования неоднозначностей типа "остаток бит".
Ну и для хранения булевой переменной достаточно 1 бита.
беда в том что не мною этот протокол был написан, не мной и документация делалась, по итогу таки понял как это всё преобразовывается из одной формы в другую, но нелзя было ссылку на битовые функции дать? я видимо совершенный идиот так-как на их описание наткнулся часу на 5-ом активного гуглежа
Битовые операции - одна из основ программирования. Ссылка, думаю, - любой учебник по программированию.
Но начните все-таки с составления таблички. Когда она будет сделана все остальное уже элементарно. А если составить ее не удастся (коль скоро протокол писан не Вами и где взять его описание, Вы не знаете), то все остальное - бесполезно.
Добавлю картинку, чтобы понятнее было:
слева источник импульсов, справа - пин АЦП ардуинки, сверху - диджитал нога ардуины для разрядки кондера, выводом на нее "0".
Кондер - керамика, ОУ - мой любимый LM358, очень уж он мне ценой нравится ;), он до 1-2 МГц, Вам хватит.
Простите, забыл со схемы убрать вольтметр, это я ее в тесте гонял, на него не смотрите.
без операционника с кодом, что ниже какая-то хрень получается, пульсации выше 200 млливольт, а теоретически быть не должно
Неужели ни у кого мыслей нет, почему лезут пульсации 100 герц с таким большим уровнем, диоды щоттки, разряд за счёт ёмкости диода должен быть минимальным, доли милливольта, а здесь все 200
Да, а тесте проверить наверное надо не просто диод рисовать, а его эквивалентную схему, с учётом ёмкости обратно смещённого диода?
Добавлю картинку, чтобы понятнее было:
слева источник импульсов, справа - пин АЦП ардуинки, сверху - диджитал нога ардуины для разрядки кондера, выводом на нее "0".
Кондер - керамика, ОУ - мой любимый LM358, очень уж он мне ценой нравится ;), он до 1-2 МГц, Вам хватит.
Простите, забыл со схемы убрать вольтметр, это я ее в тесте гонял, на него не смотрите.
без операционника с кодом, что ниже какая-то хрень получается, пульсации выше 200 млливольт, а теоретически быть не должно
Неужели ни у кого мыслей нет, почему лезут пульсации 100 герц с таким большим уровнем, диоды щоттки, разряд за счёт ёмкости диода должен быть минимальным, доли милливольта, а здесь все 200
Да, а тесте проверить наверное надо не просто диод рисовать, а его эквивалентную схему, с учётом ёмкости обратно смещённого диода?
Мысль № 1: впервые появившимся на форуме школьникам обычно рекомендуют дать схему, а не её вольный пересказ.
Мысль № 2: для частоты 100 гц емкость 22 pf - то же самое, что и ноль. Если на входе есть пульсации, они никуда не денутся.
Мысль № 3: если уж емкость диода учитывать, стоило бы и про осциллогаф вспомнить. Но все 3 емкости в сумме (конденсатор, диод и щуп) всё равно никакого влияния на пульсации 100 герц не окажут.
Верно, для случая, когда есть нагрузка, а если её нет? (мегаомы)
Я и пытаюсь понять, что нагружает, чтобы появились пульсации
PS конденсаторы ставились разных номиналов вплоть до 100Н
да кто ж знает, что там за источник сигнала, который эти пульсации в схему гонит.
да кто ж знает, что там за источник сигнала, который эти пульсации в схему гонит.
Это из параллельной ветки -
в принципе проблема мне кажется понятна, ток утечки первого диода, надо попробовать 1SS380, Шоттки не пойдут от слова совсем или переход коллектор-база в качестве диода из старых транзисторов что-то подобрать
да кто ж знает, что там за источник сигнала, который эти пульсации в схему гонит.
Это из параллельной ветки -
Ни одна из этих схем не даст на входе МК картинку, как на осциллограмме в #33.
И кусок светча - тоже с осциллограммой не совпадает.
в принципе проблема мне кажется понятна, ток утечки первого диода, надо попробовать 1SS380, Шоттки не пойдут от слова совсем или переход коллектор-база в качестве диода из старых транзисторов что-то подобрать
фону 100 герц эти токи пофигу.
Именно вот эта схема и даёт такую картинку, R1 - 2 килоома
Эта схема, в сочетании со скетчем из №33 не может дать осцилограмму в том же №33. Причина банальна: 1мсек - разряд + 10мсек на заряд + сколько-то мксек (и не мало!) на каждый оператор Wiring, а их несколько + время замера .. никак не могут дать картинку с таким разрешением сигнала... или лыжи или лыжник, но что-то не то - явно. :)
Кстати, там на картинко указано "частота развертки - 20мсек", и "частота" (справа) - 5(пять) герц .. как понимаю, этих самых пульсаций .. какие "100герц" наводки? Скорее всего, это "биения" между замеряемой пульсацией с частотой 100герц и временем цикла измерительного скетча.
Эта схема, в сочетании со скетчем из №33 не может дать осцилограмму в том же №33. Причина банальна: 1мсек - разряд + 10мсек на заряд + сколько-то мксек (и не мало!) на каждый оператор Wiring, а их несколько + время замера .. никак не могут дать картинку с таким разрешением сигнала... или лыжи или лыжник, но что-то не то - явно. :)
Кстати, там на картинко указано "частота развертки - 20мсек", и "частота" (справа) - 5(пять) герц .. как понимаю, этих самых пульсаций .. какие "100герц" наводки? Скорее всего, это "биения" между замеряемой пульсацией с частотой 100герц и временем цикла измерительного скетча.
теперь бы еще всё это перевести на мне понятный )))
так что делать, в цикле увеличить число?
а если снять диод с D10 то картинко еще интересней, выходит пульсации сбрасывались в +5
Ты меня сюда позвал, так изложи трабл. Я завтра подумаю.
Про ОУ на выходе - Логик был прав еще тогда, год назад, нахрен ОУ не нужен. 100 Гц - это наводки от блока питания. Какие еще есть вопросы? Просто 9 мая вечером я не все точно понимаю.
Да фиг его знает что там делать .. Вы снимаете сигнал напрямую с моста, который выдает пульс с частотой 100герц, и пытаетесь за каким-то фигом затем его интегрировать программно-аппаратно. Там дальше в схеме есть кондер по питанию, можно с него снимать вполне себе выпрямленный и ровный сигнальчик... Я ещё могу понять, когда так делают для получения мгновенных значений пульсаций, но ваш скетч этому не соответствует ни в одном глазу.
Ты меня сюда позвал, так изложи трабл. Я завтра подумаю.
Про ОУ на выходе - Логик был прав еще тогда, год назад, нахрен ОУ не нужен. 100 Гц - это наводки от блока питания. Какие еще есть вопросы? Просто 9 мая вечером я не все точно понимаю.
Схема - пост 41, осциллограмма на А0 пост выше, если вернуть диод на место - пульсации порядка 800 милливольт, в чём засада, да, выпрямителя питающего МК на этой обмотке нет, питается от отдельного стабилизатора
Да фиг его знает что там делать .. Вы снимаете сигнал напрямую с моста, который выдает пульс с частотой 100герц, и пытаетесь за каким-то фигом затем его интегрировать программно-аппаратно. Там дальше в схеме есть кондер по питанию, можно с него снимать вполне себе выпрямленный и ровный сигнальчик... Я ещё могу понять, когда так делают для получения мгновенных значений пульсаций, но ваш скетч этому не соответствует ни в одном глазу.
Скетч снимает напряжение с защёлки, в которой должно фиксироваться пиковое значение напряжения
А нафига, когда у Вас там рядом торчит сглаживающий кондер? Он и зарядится до вашего "пикового" (усредненно). Вы же своей защелкой И скетчем точно также интегрируете эти "пиковые" значения. Ни панимаю, на кой фиг нужен такой гемморой (разве что схема от иного устройства и назначения).
Какой стоит конденсатор? Какие марки диодов? не забыли ли Вы разряжающую ногу задрать в Хай?