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

Не Могу Избавиться От Наводок По Аналоговому Входу Arduino


Рекомендуемые сообщения

Управляю шаговым двигателем от аналогового входа Arduino Uno (пропорциональное управление). В состоянии покоя двигатель время от времени подрагивает. Предпринимал: переменный резистор подпаян непосредственно к входу Arduino, срезал два младших разряда преобразованного аналогового входа, ставил на вход RC-цепочку, прятал Arduino в экранированную коробку. Помогает, но не радикально. Думаю, у многих была эта проблема. Что скажете?

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

Не думаю, что у кого-то была эта проблема. А если и была, то они, так же как и Вы, плохо понимают принцип регулирования, в частности - пропорционального.

Проблема, с вероятностью в 99.9%, не в АЦП. Тем более, что RC-цепь на его входе задушила бы любые помехи, если её правильно подобрать. И откидывание разрядов, по любому, дало бы результаты.

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Откуда же пляска в младших разрядах? Алгоритм банальный. Сравниваю код после преобразования на АЦП и предыдущий код. Если появилась разница- вышагиваю её.

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Такс, я кажется начал понимать. Вы немного ввели в заблуждение фразой "пропорциональное управление". Я почему то подумал про регулирование с обратной связью.

Код приведите, возможно там какие-нибудь ошибки. Чудес не бывает.

Ссылка на комментарий
Поделиться на другие сайты

Эх! Сам знаю.

Извините за задержку. Причёсывал комментарии.

И ещё раз прошу великодушно извинить, что загрузил Вас копанием в чужой программе.

/*

*/

boolean A[]={1,1,0,0,0,0,0,1}; //Управление фазами двигателя в полушаговом режиме

boolean B[]={0,0,0,1,1,1,0,0};

boolean C[]={0,1,1,1,0,0,0,0};

boolean D[]={0,0,0,0,0,1,1,1};

long previousMillis = 0; // храним время последнего переключения светодиода

long interval = 5000; //Время сянятия сигнала "Enable" если ничего не меняется

int Raznost=0; // Разность между текущим полпжением потенциометра и предыдущим

int Index=0; //Текущее положение привода

int IndexTek=0; //Текущее положение счётчика управления мотором

int Speed=0; //Скорость двигателя (время задержки для delay)

int Pozicia=0; //Положение движка потенциометра (с АЦП)

int OldPozicia=0; //Запоминаем положение покоя

void setup() {

pinMode(2, OUTPUT); //Сигнал "Enable" для двигателя

pinMode(4, OUTPUT); //4 Выхода управления двигателем

pinMode(5, OUTPUT);

pinMode(6, OUTPUT);

pinMode(7, OUTPUT);

Serial.begin(9600);

}

void loop() {

Pozicia = analogRead(A5); //Читаем потенциометр положения

Pozicia=Pozicia>>2; //Откидываем два младших разряда

Pozicia=Pozicia*2; //Восстанавливаем масштаб

Raznost=Index-OldPozicia; //Разность между новым и старым положением потенциометра

//Serial.println(Raznost);

if(Index>Pozicia)

{

Speed = analogRead(A0); //Читаем значение скрости двигателя

Speed=map(Speed,0,1023,0,255); //Уменьшили диапазон

Index=Index-1; //Делаем шаг назад

digitalWrite(2,HIGH); //Разрешаем движение

IndexTek=IndexTek-1; //Задаём код для управления двигателем

if (IndexTek>7){IndexTek=0;}; //Контроль диапазона для изменения кода, подающегося на двигатель

if (IndexTek<0){IndexTek=7;};

digitalWrite(4, A[indexTek]); //Подаём код на двигатель

digitalWrite(5, B[indexTek]);

digitalWrite(6, C[indexTek]);

digitalWrite(7, D[indexTek]);

delay(Speed); //Задержка (скорость) для двигателя

}

else if (Index<Pozicia)

{

Speed = analogRead(A0); //Читаем значение скрости двигателя

Speed=map(Speed,0,1023,0,255); //Уменьшили диапазон

digitalWrite(2,HIGH); //Разрешаем движение

Index=Index+1; //Делаем шаг вперёд

IndexTek=IndexTek+1; //Задаём код для управления двигателем

if (IndexTek>7){IndexTek=0;} //Контроль диапазона для изменения кода, подающегося на двигатель

if (IndexTek<0){IndexTek=7;}

digitalWrite(4, A[indexTek]); //Подаём код на двигатель

digitalWrite(5, B[indexTek]);

digitalWrite(6, C[indexTek]);

digitalWrite(7, D[indexTek]);

delay(Speed);

}

else

{

Index=Pozicia; //Запоминаем положение покоя

unsigned long currentMillis = millis(); // Показания таймера

if(currentMillis - previousMillis > interval) // Время покоя больше interval ?

{

previousMillis = currentMillis; //Запоминаем время изменения

digitalWrite(2,LOW); //Снимаем Enable со схемы управления двигателем

}

}

}

Ссылка на комментарий
Поделиться на другие сайты

Глупый вопрос конечно но все же какой источник опорного напряжения использует ацп, внутренний микроконтроллера, подтянут к 5 вольтам или отдельный источник опорного напряжения.

Ссылка на комментарий
Поделиться на другие сайты

Почему глупый? Напряжение для АЦП (питание потенциометров) беру непосредственно с колодки "Power" на плате Ардуино. С пина "5v". В моей модели на этом пине 3,3 вольта

Ссылка на комментарий
Поделиться на другие сайты

Здесь есть одна проблемка у стабилизаторов типа lm78 да и LM1117, к ним можно отнести, присутствует тепловой шум. Я с ним столкнулся при сборке блока питания, проблему младшего разряда удалось решить применением внешнего источника опорного напряжения, в маем случае был ref198.

Ссылка на комментарий
Поделиться на другие сайты

Также если есть желание можно добавить усреднение результата скажем сделал пять замеров усреднил передал данные для шим, но по идее достаточно нормализовать Vref и отфильтровать входной сигнал если в этом есть необходимость, по программе ничего сказать не могу пишу в ассемблере под pic.

Ссылка на комментарий
Поделиться на другие сайты

Попробовал запитать потенциометр от батарейки 5в. Стало ещё хуже. То в некоторых случаях подрагивал, а так стал постоянно вибрировать. У меня, кстати, по питанию АЦП стоял конденсатор 4700 мкф, думал, что уж он все помехи должен срезать. Не шибко помогало. Похоже, что внутри микроконтроллера что то происходит. Хотя приближение руки он тоже чувствует. Попробую усреднять отсчёты.

Ссылка на комментарий
Поделиться на другие сайты

Такой эффект бывает, при плохом контакте и у угольных

Резисторов. Нужно поставить постоянный резистор и посмотреть подергивание двигателя. Заменить на проволочный переменный резистор, проверить общий провод. В крайнем случае - экранированный провод.

Ссылка на комментарий
Поделиться на другие сайты

Попробовал запитать потенциометр от батарейки 5в. Стало ещё хуже.

Тогда либо попробовать как предложил den422, либо осциллографам искать что звенит, ну и проверять всели работает в программе как надо.

Ссылка на комментарий
Поделиться на другие сайты

Программу менять успеете,явно не в ней дело.Где-то там в питании конденсатор нужен,но непосредственно у выводов питания контроллера надо поставить типовую развязку 10мкф и 0,1мкф и обязательно зашунтировать аналоговый вход керамикой 0,01-0,1мкф (без резисторов!)на контроллере и такие же на двигатель и потенциометр и экранировать провода от двигателя и потенциометра,соединив оплетку экрана на в одной точке земли развязывающих конденсаторов.Вообще посмотреть ваш монтаж желательно...

Изменено пользователем kotosob
Ссылка на комментарий
Поделиться на другие сайты

То den422 Поставил проволочный, типа ПП3-12 12ком. Ничего не изменилось. Раньше я уже пробовал менять резисторы, но на углеродные же.

To kotosob

Выглядит всё так post-200023-0-43542700-1459564951_thumb.jpg

Вы знаете, господа. Согласно рекомендации serg123 потыкался осцилографом. Так вот, когда начинает дрожать мотор, то на входе АЦП появляется генерация порядка 50 гЦ, (20 мс) амплитудой около 20 Мв. Похоже на автогенерацию. Попробую исследовать

Изменено пользователем suhib
Ссылка на комментарий
Поделиться на другие сайты

Разрабатывал аналогичный проект. датчик - резистивный уровень жидкости.

индикатор - шаговик от приборной панели авто со стрелкой.

тоже была проблема с тримом стрелки в основном по причине низкого качества датчика уровня жидкости.

решил ее просто.

делаем выборку например из 5 элементов в массив.

потом проводим сортировку этого массива методом расчески.

выбираем средний элемент (в нашем случае третий) выводим его на индикатор.

т.к массив отсортирован, то по краям у нас хранятся выпадающие из среднего значенияю т.е. явные ошибки.

считываем показания с датчика и кидаем или в хвост массива или в голову в зависимости от того куда кидали прошлый раз.

тем самым выбивая из массива явные ошибки показаний.

сортируем методом расчески.. выводим средний элемент на стрелку.

чем больше размер массива тем больше усреднение. точнее но тормознее.

задержка показаний равна скорости опроса датчика * половину массива.

на опыте выяснилось что для задач связанных со снятием показаний для авто достаточно массива из 11 элементов при скорости опроса 2-5 раз в секунду

при выводе на прибор я отбрасываюпере ходы =1шагу стрелки. т.е убираю шум в последнем разряде.

ну и размером массива я могу фильтровать не только шум датчика, индустриальные помехи, но и например колебания уровня жидкости связанные с вибрацией емкости.

скетч выложить могу в выхи...т.к. на выезде.

а вообще этот способ обработки использую вообще всегда при выводе плавающих значений на любые индикаторы...

этот способ позволяет полностью вычленить из закономерностей случайный шум.

например температура.. я могу выводить ее с любой точностью без шума в последних разрядах и не сильно заботясь от защиты от помех.

Ссылка на комментарий
Поделиться на другие сайты

Ваш метод интересен и буду его иметь в виду, но, в моём случае, как я понял, происходит такая странная вещь, как самовозбуждение Ардуино. Я применяю достаточно мощный двигатель (потребляет до двух ампер) и как я его подключаю, по всем цепям начинает твориться чёрт знает что. Уже перепробовал множество фильтров по цепям питания. Помогают, но не радикально. Достаточно эффективным оказалось питать Ардуино и драйвер (L298) от разных источников, но такой возможности у меня как раз нет. Сейчас вожусь с оптической развязкой. Тоже оказались свои заморочки при больших токах потребления. Как удастся добить, оповещу всех о результатах.

Ссылка на комментарий
Поделиться на другие сайты

По всей видимости, у Вас проблема с блоком питания - слабоват он.

Или ёмкости стоят маленькие, под нагрузкой начинает напруга проседать, отсюда лезет 50 Гц.

Ссылка на комментарий
Поделиться на другие сайты

Блок питания от компьютера. 10 ампер. От другого те же эффекты. Проверял уже. Без нагрузки двигателем все наводки в пределах терпимого. Именно самвозбуждается по аналоговой цепи.

Ссылка на комментарий
Поделиться на другие сайты

Блок питания от компьютера. 10 ампер. От другого те же эффекты. Проверял уже. Без нагрузки двигателем все наводки в пределах терпимого. Именно самвозбуждается по аналоговой цепи.

Скорее всего это наводки от сети переменного тока на входную цепь АЦП... в моем случае особенно сильно себя проявляют когда лампа дневного света включена над столом. стоит хватануться рукой за потенциометр - стрелка на шаговике начинала дребезжать...

ну а тот метод что я описал это классический медианный фильтр. просто пополнение массива новыми значениями сделано немного хитрее и это сильно улучшает работу фильтра. попробуйте.

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...