АЦП Ардуино НАНО .. странная оцифровка.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Ничего не могу понять второй день, может кто сталкивался.

Есть самопальные аналоговые ИК-датчики линии, собраны примитивно: ИК-светодиод с гасящим сопротивлением 120ом + ИК-фотодиод, включен встречно с нагрузочным сопротивлением 750кОм и выход подается напрямую на вход АЦП по "витой паре" (провод заплетен в косичку с землей) длинной 20см. Таких есть 8шт.

Из них 5шт собраны в линейку с шагом 16мм .. перезасветка от соседнего датчика - минимальна. Далее все цифирьки приведены с учетом перезасветки в линейке.

Замер китайским прибором показывает, что уровень белого виден от 450 до 800 мВ, в зависимости от конкретного датчика (может свето- фото- диоды где-то косо стоят, может разброс сопротивлений 5% .. хз.), а на черном стабильно показывает 40..90 мВ в зависимости от датчика, но в любом случае, динамический диапазон датчиков не хуже 9 крат и почти у половины лучше 10.

1. analogRead() без перенастройки порогов стабильно при этом кажет значения 30-70 на черном и 120-250 на белом .. то есть динамический диапазон падает до 4-х крат .. это первое что "непонятно" каким способом происходит.

2. Питание платы от USB = 4.3в (Ардуино Нано) и от аккумуляторов 4.92в, если правильно понимаю - это и есть "опорное" напряжение для АЦП .. но, в этом случае должно быть: "белое" = 107 .. 190 попугаев и "черное" = 9 .. 22 попугая - это для питания от USB и "чуть больше" при питании от аккумуляторов .. а вот нифига! Попугаи совсем иные.. как так? Это второе чего не понимаю. "Черное" и "белое" - поверхность одна и та же, освещение одинаково .. что за чертовщина?!?

3. Есть программа движения по линии, которая имеет "автоподстройку" уровней до начала движения: пока моргает блинк(13 пин) - можно покатать тележку над белым и черным и программа сама найдет "мин/макс" .. работает на ура. Однако, далее начинаются причуды:

3а) При вставке в программу вывода на монитор данных замеров, вычислений и др. вывода - все датчики показывают несколько странные попугаи (см. выше), но тем не менее работают стабильно. Очень стабильно, за серию замеров в 5-10 минут - ни единой ошибки.. что на USB, что на совмещенном питании. Понято что отцепить питание USB в этом режиме "никак".

3б) При самостоятельной работе программы, датчики работают несколько "странно" - пропадает положение "0" (средний датчик на линии) .. совсем пропадает. Такое ощущение, что один из датчиков (+- первый отсреднего) все время видит черное, причем "попеременно": то правый, а то вдруг левый ..

Вопрос: может ли Нано оцифровывать по-разному, в зависимости от питания, от частоты замеров (паузы на вывод в монитор - стабилизируют ситуацию) и т.д.? В какую сторону стоит копать (за 2 дня уже сломал весь моск) .. может ли это быть связано с исчерпанием ресурса флеша и заливка проги без отладочного вывода укладывает чтение датчиков в "битую область"? Нане всего 1.5 месяца .. маловероятно .. может ли это быть связано с тем, что она изначально "битая" (второй сейчас нет под руками) поскольку у неё изначально не работал А3 в АЦП блоке?

 

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Я опять что-то заумное спросил, никаких идей?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

сам столкнулся с непоняткой, показания зависят от delay(2-50) после чтения из порта, объяснить причину почему пока не могу, тоже на nano )))

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Архат! Ты же инженер! Следовтельно знаешь, что чудес на свете не бывает.

Следовательно нужно провести обычно инженерное исследование типа "поймать льва в пустыне". (напоминаю, что для этого нужно перегородить пустыню пополам, далее - рекурсивно)

1. проверка датчиков - ты это проделал мультиметром.

2. проверка нанки - ставишь ее на стол, подключаешь обычный лаборатонрый БП с индикатором. и Гоняешь ее с выводом измерений на монитор на всех ногах. Если и тут все нормально, то подключаешь какой-нибудь экран и гоняешь без питания от USB. Если опять все нормально, то проверяешь алгоритм в своей программе. После смены ног в мультиплексоре нужна пауза перед измерением.

Поскольку, с твоим опытом, я не верю в ошибки в программировании (только если ты не игрался в воспитателя с сыном и сам писал программу), то, скорее всего, у тебя битый контроллер. (паял, надедюсь, тоже сам?)

nik182
Offline
Зарегистрирован: 04.05.2015

АЦП имеет мультиплексор на входе. Его емкость надо перезаряжать преред измерением, поэтому даташит требует выходного сопротивления не более 10к для выходов на АЦП. У вас 750k. Иначе будут артефакты от соседних каналов. Или надо долго заряжать емкость. Что у вас видно как стабилизация после задержки. Самая простая рекомендация - поставить повторители на операционнике. Пары четырёх канальных много места не займут, а все проблемы исчезнут.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Пасибки. Попробую посмотреть за задержку, поскольку менять конструктив датчиков сейчас уже нет никакой возможности - все залито в корпуса и приделаны лего-детальки и запас таких "на исходе".. Да и габарит не позволит. Датчик размеров 8х16мм, высота без светозащитной юбки и диодов - 4мм.

Что уже сделал:

1. Вернул свою 2-ю нану, у которой выгоревший 12-й порт, и которая успешно побывала на пред. соревнованиях и аналоговые каналы там отработали нормально без задержек и на тех же 750ком, правда только 2шт. Результат тот же.

2. Поменял расширительные шилды (они тоже самопальные с питаловом на базе LM2596-ADJ, второй настроен на 5.01в, первый был 4.92в) - без изменений.

3. Внезапно, при п.1. выяснилось (ребенка залил "не тот" скетч), что "ноль есть" и достаточно стабильный. Задержек в проге тоже нет, но она "тупая": если есть черное (уровень ниже заданного порога) справа/слева и пофиг какой из датчиков сработал, хоть все разом - тормозим свое колесо .. работает нормально, линию по центру видит устойчиво. Линейка датчиков одна и таже.

В общем, пока грешу на помехи внутри АЦМ блока Нано...

Программный цикл устроен так:

1. Замер датчиков 5шт х трижды = около 1.4мсек., через analogRead() с усреднением "скользящим средним" по 1/2;

2. Вычисление величины ошибки и формирование управлений моторами - около 100мксек;

3. Упрравление моторами около 20мксек;

4. Пауза для выдерживания "реакции моторов" - 320 мксек.

5. Если можно измерять расстояние (прошло 40мсек с предыдущего замера), то замер узв. датчиком = 2.09мсек.; Иначе замер холостой (без управления) датчиков и вычисление ошибки, чтобы не пропустить чего... (Предсказатель поворотов использует анализ предыдущих состояний)

6. Если расстнояние меньше заданного - принудительный останов тележки.

.. и т.д по циклу. Итого среднее время выполнения loop() - около 4мсек.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

попробуй сделать по дополнительному измерению и первое просто выкинь. Должно помочь. И про повторители на ОУ от ник182 - это очень неплохо бы!!!!

Реально две четырехканалки вообще места не займут и обвязки никакой им не нужно. Хоть навесным их припаяй, если плата уже разведена. На ножках от диодов  - они длинные и толстые ;).

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Платы нет. Каждый датчик - законченное устройство в своем корпусе. Просто все крепится на одну длинную ось лего, а поскольку каждый датчик шириной 1 лего-дырка (8мм), то минимально их можно расположить хоть вплотную с шагом 8мм или через втулку 4мм (шаг 12мм) или через 2 таких, то есть с шагом 16мм. Вот последний случай и реализован. У нас есть ещё 1/2 мин втулки для шага в 10мм :)

Если делать через ОУ, то как понимаю, их надо втыкать непосредственно на каждый датчик близко от съема выходного сигнала, а датчики уже заделаны в корпуса .. есть ещё запас свето- фотодиодов и есть LM358 - 50шт .. можно напаять ишшо, но у нас уже "дефицит" разъемов и проводов (последние могу нарезать от мышиных хвостов, а вот с разъемами - уже реальная беда .. остаточки, едут, но уже не поспеют, точно).

В общем, проверил. Да, наводки от соседнего канала и строго в порядке опроса датчиков. Полностью объяснились "откуда такие попугаи" .. наводка до +25% от предыдущего сигнала, если он "белый" (близко к максимальной датчика) и около -15% если предыдущий датчик кажет "черное".. *опа. Странно, что явление обнаружилось "только сейчас" .. гоняем их уже больше месяца.

Причем забавно, измерение с усреднением: В цикле замеряем последовательно каждый датчик (АЦП 0,1,2,4,5 каналы) и делаем 3 прохода .. если последний, 5-й канал кажет "черное" (близко к миниуму), то А0 даст заниженное значение на след. проходе на те же самые проценты, если А0 установлен на черное, а А5 кажет белое .. получаем завышение и можно получить даже "белее белого", то есть беле того, что он показывает на белом поле в одиночестве ..

Почему такого не было обнаружено раньше?!? Почему в "тупом скетче" (проверил) работает гораздо устойчивее? В смысле наводка тоже наблюдается (когда знаешь что смотреть!), но .. в 2-3 раза меньше. Нихт панимайт..

Время разряда входа АЦП .. афигеть! Вставка задержки внутрь цикла между замерами до 10мсек .. мало что изменила .. и? "полчаса на замер и щас как поеду" ... :(

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

1.ОУ LM358 можно впаять около нанки, на 5 датчиков их три корпуса получится. На макетку мелкую напаять проще всего и поверх нанки разместить. Это же всего 8ми ногие чипы. Грубо 30х35 мм хватит. а можно один на другой эпоксидкой и ноги распрямить? Так, хоть и некрасиво, но надежнее и технологичнее. Тебе же ни одного резистора припяивать не нужно. 5 входов, 5 выходов и питание.

А к следующим соревнованиям (через год или когда там?) сделаешь уже в датчике, один ОУ - усилитель, другой - тригер Шмидта, и в СМД корпусе на плате датчика, которую фоторезистом вытравишь, и в МК уже в цифровой вход пойдет сигнал. Стильно, модно, молодёжно, нет?

2. Попробуй все-таки не задержку, а именно сделать и выкинуть первое измерение.

И вот еще полезная идея:

Если есть свободные цифровые выходы, то соедини их с аналоговыми и разряжай защелки, просто подав 0 на разряжающий выход, а потом его в INPUT. В принципе хватит одного вывода, если диодами развязать. Такой способ очистить защелки перед измерениями применен в "Транзистор тестере", а его разрабатывал ОЧЕНЬ не глупый человек.

 

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

О как! Пасибки за идею .. разряжать тогда можно и "своим" цифровым выходом .. тупо переводить в цифру, выводить 0, переводить на ввод и читать АЦП .. надо попгобовать.

В целом, пока решил программной коррекцией. Теперь надо как-то завтра "заяснить" сыну "что це такэ" и какова причина глюков .. надо чтобы он сам дошел. Программа-то - его полностью. Не, у меня конечно есть "почти" такая же своя.. тоже, но эта infernalChariot.abp - его. :)

nik182
Offline
Зарегистрирован: 04.05.2015

Дело не в разрядке,а в порезарядке. Т.е если на одном входе было 10 мВ а на другом 200мВ, то при быстром переключении с первого на второй получим менбше 200. Тут нельзя пользоваться analogRead. Нужно внутрь этой поцедуры вставить задержку после выбора канала. И пускать оцифровку после задержки. Из общих соображений задержка должна быть около 50 микросекунд. Этого должно хватить на перезаряд. Заметте - в святцах она тоже была с соответствующим коментарием, но её закоментили.

int analogRead(uint8_t pin)
{
	uint8_t low, high;

#if defined(analogPinToChannel)
#if defined(__AVR_ATmega32U4__)
	if (pin >= 18) pin -= 18; // allow for channel or pin numbers
#endif
	pin = analogPinToChannel(pin);
#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
	if (pin >= 54) pin -= 54; // allow for channel or pin numbers
#elif defined(__AVR_ATmega32U4__)
	if (pin >= 18) pin -= 18; // allow for channel or pin numbers
#elif defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__) || defined(__AVR_ATmega644__) || defined(__AVR_ATmega644A__) || defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644PA__)
	if (pin >= 24) pin -= 24; // allow for channel or pin numbers
#else
	if (pin >= 14) pin -= 14; // allow for channel or pin numbers
#endif

#if defined(ADCSRB) && defined(MUX5)
	// the MUX5 bit of ADCSRB selects whether we're reading from channels
	// 0 to 7 (MUX5 low) or 8 to 15 (MUX5 high).
	ADCSRB = (ADCSRB & ~(1 << MUX5)) | (((pin >> 3) & 0x01) << MUX5);
#endif
  
	// set the analog reference (high two bits of ADMUX) and select the
	// channel (low 4 bits).  this also sets ADLAR (left-adjust result)
	// to 0 (the default).
#if defined(ADMUX)
#if defined(__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__)
	ADMUX = (analog_reference << 4) | (pin & 0x07);
#else
	ADMUX = (analog_reference << 6) | (pin & 0x07);
#endif
#endif

	// without a delay, we seem to read from the wrong channel
	//delay(1);

!!!!!!!!!!!!!!!!!1---- ЗАДЕРЖКУ СЮДА !!!!!!!!!!!!!!!1


#if defined(ADCSRA) && defined(ADCL)
	// start the conversion
	sbi(ADCSRA, ADSC);

	// ADSC is cleared when the conversion finishes
	while (bit_is_set(ADCSRA, ADSC));

	// we have to read ADCL first; doing so locks both ADCL
	// and ADCH until ADCH is read.  reading ADCL second would
	// cause the results of each conversion to be discarded,
	// as ADCL and ADCH would be locked when it completed.
	low  = ADCL;
	high = ADCH;
#else
	// we dont have an ADC, return 0
	low  = 0;
	high = 0;
#endif

	// combine the two bytes
	return (high << 8) | low;
} 

   

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

wdrakula пишет:

Такой способ очистить защелки перед измерениями применен в "Транзистор тестере", а его разрабатывал ОЧЕНЬ не глупый человек.

Немецкие радиолюбители в этом плане очень даже, но антенны мы делаем лучше )))

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

ua6em пишет:

wdrakula пишет:

Такой способ очистить защелки перед измерениями применен в "Транзистор тестере", а его разрабатывал ОЧЕНЬ не глупый человек.

Немецкие радиолюбители в этом плане очень даже, но антенны мы делаем лучше )))

А порнуху - лучше они! ;) ;) ;)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

wdrakula пишет:

ua6em пишет:

wdrakula пишет:

Такой способ очистить защелки перед измерениями применен в "Транзистор тестере", а его разрабатывал ОЧЕНЬ не глупый человек.

Немецкие радиолюбители в этом плане очень даже, но антенны мы делаем лучше )))

А порнуху - лучше они! ;) ;) ;)

Я мастер тактильных практик, в виртуальных вопросах не силён, и сказать то более нечего )))

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Arhat109-2 пишет:

О как! Пасибки за идею .. разряжать тогда можно и "своим" цифровым выходом .. тупо переводить в цифру, выводить 0, переводить на ввод и читать АЦП .. надо попгобовать.

При переключении в цифру - конденсатор защелки отключится от входа. Нужно именно подключить землю ко входу, а потом отключить.

Проще всего от сигнала прикряться небольшим токоограничивающим резистором и затем собрать все аналоговые выходы в одну точку диодами Шотки и присоединить эту точку к цифровому выходу. Подавать на него 0 на 100 мкс, и затем переводить его в высокий импеданс - в INPUT. Лучше 5 выводов, если есть, так как на диоде, даже Шотки, останется 0.3-0.4 В.

-------

тут есть еще решения - можно поиграться. Сходу идея - линейка полевиков, там нет pn переходов, открывать - цифровой ногой. Короче ищите и обрящете, толцыте, и да отверзеццо вам! ;) ;) ;)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

А если задействую всего один аналоговый вход, тоже разряжать или обойдётся?

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

ua6em пишет:

А если задействую всего один аналоговый вход, тоже разряжать или обойдётся?

должон сам, при каждом новом измерении. Иначе нет смысла в режиме свободного измерения. Поэтому я и говорю Архату, чтобы он не паузу, а просто измерение сделал. Проблемма в созранении заряда от старого состояния ТОЛЬКО в момент переключения мультиплексора. Это в даташите есть, но не подробно. Типа делайте паузу.

А про низкоимпедансные источники сигнала, о чем ник182 говорил, написано аглицким-по-белому

28.6.1.
Analog Input Circuitry
The analog input circuitry for single ended channels is illustrated below. An analog source applied to
ADCn is subjected to the pin capacitance and input leakage of that pin, regardless of whether that
channel is selected as input for the ADC. When the channel is selected, the source must drive the S/H
capacitor through the series resistance (combined resistance in the input path).
The ADC is optimized for analog signals with an output impedance of approximately 10 kΩ or less. If such
a source is used, the sampling time will be negligible. If a source with higher impedance is used, the
sampling time will depend on how long time the source needs to charge the S/H capacitor, with can vary
widely. The user is recommended to only use low impedance sources with slowly varying signals, since
this minimizes the required charge transfer to the S/H capacitor.
Signal components higher than the Nyquist frequency (f ADC /2) should not be present for either kind of
channels, to avoid distortion from unpredictable signal convolution. The user is advised to remove high
frequency components with a low-pass filter before applying the signals as inputs to the ADC.

 

nik182
Offline
Зарегистрирован: 04.05.2015

Взьмите 2 штуки  lm224 В soic. Вы же в нану втыкаете контакты? Между ними поставте две lm224. Всё. Места минимум. 

Logik
Offline
Зарегистрирован: 05.08.2014

Если мешает заряд от старого измерения, что вполне возможно при высокоомном источнике сигнала, то логично делать переключение на новый вход после измерения старого, затем естественная пауза (зачем вобще частить с измерениями? Период легко прикинуть по размерам и скоростям) и потом измерение по тому входу, на который переключились. Потребуется прямая работа с регистрами. 

Для исключения засветки от соседа выбрать правильный порядок опроса датчиков. Не 1-2-3-4-5-1... а например 1-3-5-2-4-1...

nik182
Offline
Зарегистрирован: 04.05.2015

Порядок опроса не играет роли. Емкость одна. В каком порядке её перезаряжать не имеет ни какого значения. Достаточно в analogRead раскоментировать delay(1). Но терять милисекунду на каждом преобразовании.

Logik
Offline
Зарегистрирован: 05.08.2014

///Порядок опроса не играет роли. Емкость одна.

А читать внимательно?

Для исключения засветки от соседа выбрать правильный порядок...

//раскоментировать delay(1)

))) Изучаем класику - http://arduino.ru/tutorials/BlinkWithoutDelay

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Logik пишет:

Если мешает заряд от старого измерения, что вполне возможно при высокоомном источнике сигнала, то логично делать переключение на новый вход после измерения старого, затем естественная пауза (зачем вобще частить с измерениями? Период легко прикинуть по размерам и скоростям) и потом измерение по тому входу, на который переключились. Потребуется прямая работа с регистрами. 

Для исключения засветки от соседа выбрать правильный порядок опроса датчиков. Не 1-2-3-4-5-1... а например 1-3-5-2-4-1...

Прямо как с охлаждением цилиндров 1-3-2-4

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

wdrakula пишет:

ua6em пишет:

А если задействую всего один аналоговый вход, тоже разряжать или обойдётся?

должон сам, при каждом новом измерении. Иначе нет смысла в режиме свободного измерения. Поэтому я и говорю Архату, чтобы он не паузу, а просто измерение сделал. Проблемма в созранении заряда от старого состояния ТОЛЬКО в момент переключения мультиплексора. Это в даташите есть, но не подробно. Типа делайте паузу.

А про низкоимпедансные источники сигнала, о чем ник182 говорил, написано аглицким-по-белому

28.6.1.
Analog Input Circuitry
The analog input circuitry for single ended channels is illustrated below. An analog source applied to
ADCn is subjected to the pin capacitance and input leakage of that pin, regardless of whether that
channel is selected as input for the ADC. When the channel is selected, the source must drive the S/H
capacitor through the series resistance (combined resistance in the input path).
The ADC is optimized for analog signals with an output impedance of approximately 10 kΩ or less. If such
a source is used, the sampling time will be negligible. If a source with higher impedance is used, the
sampling time will depend on how long time the source needs to charge the S/H capacitor, with can vary
widely. The user is recommended to only use low impedance sources with slowly varying signals, since
this minimizes the required charge transfer to the S/H capacitor.
Signal components higher than the Nyquist frequency (f ADC /2) should not be present for either kind of
channels, to avoid distortion from unpredictable signal convolution. The user is advised to remove high
frequency components with a low-pass filter before applying the signals as inputs to the ADC.

RE Составляющие сигнала выше частоты Найквиста (Ф АЦП /2) не должны присутствовать

Интересно, подозреваю, что у меня с датчика тока присутствуют частоты кратные 300Кгц, и чё, ставить фильтр НЧ (да асилографа  и милипильметра еще не добрался)

Logik
Offline
Зарегистрирован: 05.08.2014

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

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Logik пишет:

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

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

nik182
Offline
Зарегистрирован: 04.05.2015

Logik пишет:

///Порядок опроса не играет роли. Емкость одна.

А читать внимательно?

Для исключения засветки от соседа выбрать правильный порядок...

//раскоментировать delay(1)

))) Изучаем класику - http://arduino.ru/tutorials/BlinkWithoutDelay

Взаимно по всем пунктам. Нельзя правильным порядком исключить засветку. Всёравно надо перезаряжать емкость. К засветке датчиков перезарядка отношения не имеет. Надо иметь точное значение каждого датчика. 

Выше я приводил код analogRead. В нем есть закоментированная строка с delay(1)  и приписка  - что бы не читать чужой канал. Как раз для случая с большой входной ёмкостью заготовили :-)  Только вок как блинк без делея использовать в этом месте ума не приложу. Тем более, что 1 милисекунда. А по хорошему и 50 микросекунд должно хватить.    

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

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

Поясню, почему ряд советов "не подходит" в конкретно моем случае:

1. Предельная скорость тележки по трассе - около 1.5м/сек согласно расчетам по массово-габаритным характеристикам тележки и трассы, а также имеющемуся к-ту трения. Обсуждалось несколько ранее в теме "скоростное движение по линии...". В этом случае, на 1 миллисекунду движения имеем 1.5 пропущенных миллиметра трассы. Чисто по теории имеем 15kbps АЦП у мег всех мастей и 5 датчиков. Даже однократный опрос датчиков снижает теоретическую скорость оцифровки уже до 3 тыс/сек. = 3 шт/мсек или 333 микросекунды сек на цикл. .. или полмиллиметра трассы. Для усреднения показаний минимально требуется 2 измерения, а лучше 3-4 .. у нас использовано 3 замера на датчик. .. примерно тут же лежат проблемы с организацией "пауз" тем или иным способом .. хотелось бы быстрее как-то.

2. Все пожелания "поставь это.." предполагают или неограниченный склад у вопрошающего или неограниченный ресурс по времени для приобретения .. нет такой роскоши. Как правило, и в нашем случае это именно так, ресурс склада - "частная коллекция деталек", накопленная "по случаю" и жесткий цейтнот по времени подготовки (есть ещё и иные дела тоже, не забываем) .. в общем .. может быть, когда-нибудь но не сейчас.

3. Да, на прямом управлении регистрами можно сделать много чего .. программу пишет ребенок в "возраст 9-11лет" с соответствующими объемами знаний математики (не проходят отрицательные числа, частично только доли, а даже НЕ дроби, нет понимания десятичных чисел, деление только без остатка и т.д. .. чем-то сильно похоже на Мегу: только целая арифметика, нет деления даже нацело .. :), да, ещё и с применением весьма ограниченного по возможностям "Ардублока" .. так что, тоже все советы в этой области, увы пока не про нас. Сожалею..

P.S. В целом вариант программной коррекции показаний ребенок сегодня предложил сам после разъяснения ему причин "почто все так не кузяво".. Сделал - работает успешно.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Кому интересно: сегодня побывали на настоящей трассе для соревнований. Гл.судья готовил команду леговцев или просто вел занятие, уж не знаю, ну и разрешид нам проверить тележку. На трассе будет 2 препятствия: "балка поперек" и "горка", и если балку смоделировать дома мы в состоянии, то горку на домашней трассе разместить банально некуда .. вот и пришлось напроситься. Итог, более чем нас устроил, но пока результат озвучивать не стану по понятным причинам. Жаль что наша тележка на трассе умещается "в притык", будем что-то придумывать меньшее по габаритам. Сейчас имеем 195х190мм при допустимых 200х200 по регламенту.

P.S. могу только сказать, что "горка" по сути - трамплин высотой 50мм .. летаем, но низенько-низенько.. :)

Logik
Offline
Зарегистрирован: 05.08.2014

Arhat109-2 пишет:

 .. программу пишет ребенок в "возраст 9-11лет" 

Та ладно. Знаем мы кто что пишет;) 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

У меня на ногу АЦП с датчика тока прилетает 50 милливольт разных шумов от 400гц до 900кгц, кто и как с этим борется?

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

?!? .. не понятное обвинение непонятно в чем, в том что ребенок планирует выступать с МОЕЙ программой? Вы, или должны извиниться или приехать и убедиться воочию. Приглашаю, если не желаете выглядеть тупо завистливой дрянью в глазах всех, читающих тему. Почта в доступе, как соберетесь - пишите. А обвинять огульно и за глаза своего сына, я Вам - не позволю.

Logik
Offline
Зарегистрирован: 05.08.2014

Вы зря взерошились. Напомнить сколько раз Вы тему про софт и железо тачки подымали? А сколько раз Ваш сын? Отож...

Не выдавайте желаемое за действительное. Я оч понимаю что Вы хотите видеть в сыне. Но так же понимаю, что осмысленое написание того же ПИД- регулятора просто невозможно  при изложеном Вами факте:

Arhat109-2 пишет:
 "возраст 9-11лет" с соответствующими объемами знаний математики (не проходят отрицательные числа, частично только доли, а даже НЕ дроби, нет понимания десятичных чисел, деление только без остатка и т.д. .. 

И это правда, у самого такой растет. Кстати деление таки уже с остатком, недавно выучили, 3 класс.

Вы можете вдалбливать сыну в голову что желаете - Ваше право. Скажете "пишем if" ну напишет он чего скажете.  Это не значить что он пишет программу, это он записывает чего скажут.  И требовать от кого либо признания его выдающихся способностей, при том что весь форум видит как Вы лично, а не сын,  долбетесь над проектом, просто смешно.

ПС. Как воспитывать ребенка, ваше личное дело, но ИМХО такие ранние "накачки" черезвычайно вредны, посмотрите на судьбы вундеркиндов 80-х. Они не сильно на слуху, ниче выдающегося не вышло, а поломаных среди них очень много, сильно больше чем в среднем.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

понимание, что родители через детей пытаются реализовать СВОИ не реализованные мечты приходит с годами...
...Пушкин был прав...
...учил его всему шутя, не докучал моралью строгой, слегка за шалости бранил и в летний сад гулять водил...

Logik
Offline
Зарегистрирован: 05.08.2014

Да. Всему свое время, и ценно не то чему научили а чему научился.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Сожалею, но ему запрещено писать на любых форумах самостоятельно, после того как он завел себе ник у линуксистов, когда впервые сам переставлял себе Убунту, и не найдя возможности (в интерфейсах гуя, конечно жеж) ускорить как-то третий гном на своем стареньком пеньке, нашел в гугле, что всему виной некий "компиз" и "юнити" и завел себе ник для получения ответа "как отключить сие чудо" .. после того как я пришел домой и обнаружил, что ребенка сидит и плачет из-за того, что его взрослые дядьки обматерили на форуме вместо того чтобы просто помочь или сказать что этого ему сделать не удастся - запретил регистрироваться на любых программистких форумах во избежании чтения срачей разных полоумных идиотов. Увы. Даже тут - не редкость. В т.ч. и сам срывался неоднократно, и даже с Вами, Logik.

Ну и по "сколько Вы тут возитесь" .. ровно столько, сколько требуется в процессе любого процесса обучения. Не больше, но и не меньше. Каждый, уважающий себя преподаватель предварительно прорешает задачу сам и 100500 разными способами, прежде чем поставить задачу ученику. Все его вариации решений .. просчитаны задолго "до". Мне это хорошо запомнилось по своему обучению .. "курс №4, взял задачу проектирования снайперского прицела .. поковырял литературу .. везде одно и тоже решение .. а как-бы извратиться вот так .. придумал, афигеть .. поискал .. нигде нет .. времени потеряно много, договорился в первом отделе забрать домой курсовик и .. посеял пояснительную записку в автобусе вместе с чумоданом .. блин, посодют .. за 3 дня и 3 ночи, пересчитал (МК-61 дома, до сих пор пашет), переписал, перерисовал все ... принес сдавать, гордый как удав .. а в ответ слышу: угу, молодец, интересное решение, его уже считали .. вот если ты эту бандуру придумаешь как закрепить в прицеле - поставим в производство, а так .. ну делал я себе такой на охотничье ружжо .. кажет .. до первого выстрелу и только" .. через 2 недели нашелся "тот ПАЗик" .. ты этто, не боись, я только первый листок прочел, остальное не стал .. я тут уже вторую неделю дежурю .. через год после окончания ВУЗа, уже работая программистом, то бишь по совсем иной специальности, случайно придумал КАК закрепить эту бандуру, приехал, поделился .. прошло 20 лет, слет выпускников и тот же Итигин ещё живой .. "О .. ну здравстуй, здравстуй .. кто это? Ну как же, ты же на охоту ездишь? Прицел такой у тебя там есть? Вот, это он считал и сделал". Таки поставили видимо..

и, к чему это? Да все просто: Я - считал эту байду из желания "извернуться", а оказалось что мой препод не только считал такое, но даже и делал.. Так и тут .. если есть вопрос в покатушках тележек, то я просто обязан знать на него ответ .. даже если он и не спросит.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

В общем, вопрос можно закрыть, пасибки всем за подсказки.

Да, использование ОУ для снижения вых. сопротивления датчика решает задачу полностью. Проблема во встроенном мультиплексоре и входной емкости встроенного АЦП .. "ну и гадость эта ваша заливная рыба" :) Впрочем, программная коррекция тоже сильно снижает эффект, может кому пригодится.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Arhat109-2 пишет:

В общем, вопрос можно закрыть, пасибки всем за подсказки.

Да, использование ОУ для снижения вых. сопротивления датчика решает задачу полностью. Проблема во встроенном мультиплексоре и входной емкости встроенного АЦП .. "ну и гадость эта ваша заливная рыба" :) Впрочем, программная коррекция тоже сильно снижает эффект, может кому пригодится.

а я, чтобы уйти от встроенного АЦП сегодня буду переделывать По своего чёрного ящика на INA219 (получение по I2C)

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

В свое время читал, не было времени ответить.

Arhat109-2 пишет:

Чисто по теории имеем 15kbps АЦП у мег всех мастей и 5 датчиков. Даже однократный опрос датчиков снижает теоретическую скорость оцифровки уже до 3 тыс/сек. = 3 шт/мсек или 333 микросекунды сек на цикл. .. или полмиллиметра трассы. Для усреднения показаний минимально требуется 2 измерения, а лучше 3-4 .. у нас использовано 3 замера на датчик. .. примерно тут же лежат проблемы с организацией "пауз" тем или иным способом .. хотелось бы быстрее как-то.

Если проблема в скорости оцифовки, могу порекомендовать MCP3008 - те же 10 разрядов, но с максимальной скоростью 200ksamples per s. Что соответствует 3.6 МГц. Но практика показывает, что работает и на 4МГц. Хотя, думаю, и 2-х вполне должно хватить: за то же время, пока встроенный АЦП Атмеги выдает 1 отсчет, здесь можно легко получить все 8.

PS. И по поводу возникшего здесь спора. Я считаю, с ребенком нужно заниматься. Чем больше, тем лучше. Если Вы работающий человек и не можете все 24 часа в сутки заниматься с ребенком, то чрезмерно много все равно не получится. И, естественно, все занятия требуют и большой самостоятельной работы. Например, я, когда начинал учить ребенка программировать вообще не знал Паскаля, но решил, что на Фортране учить не следует. В результате сам выучил очередной язык. И считаю, что это во-первых - нормально, а во вторых - приводит к благоприятным результатам.

Kolaha
Offline
Зарегистрирован: 29.12.2016

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

 Оказалось, что если выключить внутреннюю подтяжку и взять внешнюю, то колебания составят не сотни единиц, а всего 2-3.

 Я сделал скетчик, сначала пустой вход и без подтяжки - показания в плоттере порта гуляют от 0 до 1023 с периодом около секунды. Второй вариант был с подтяжкой pinMode(A0,INPUT_PULLUP); - вырисовывает очень забавную модуляцию и она изменяется если водить близко руками или воткнуть проводок. Третий вариант с внешней подтяжкой: результаты равны 1020-1023.

 Экспериментально доказано: на аналоговом входе подтяжку только внешнюю.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Kolaha пишет:

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

 Оказалось, что если выключить внутреннюю подтяжку и взять внешнюю, то колебания составят не сотни единиц, а всего 2-3.

 Я сделал скетчик, сначала пустой вход и без подтяжки - показания в плоттере порта гуляют от 0 до 1023 с периодом около секунды. Второй вариант был с подтяжкой pinMode(A0,INPUT_PULLUP); - вырисовывает очень забавную модуляцию и она изменяется если водить близко руками или воткнуть проводок. Третий вариант с внешней подтяжкой: результаты равны 1020-1023.

 Экспериментально доказано: на аналоговом входе подтяжку только внешнюю.

А как по умолчанию? Внешняя подтяжка на аналоговых входах выключена?

Kolaha
Offline
Зарегистрирован: 29.12.2016

ua6em пишет:

А как по умолчанию? Внешняя подтяжка на аналоговых входах выключена?

разумеется. "включать" и "выключать" можно только внутреннюю, зашитую в корпус микросхемы, подтяжку. а внешнюю - это Вам придется самому, ручками, свой резик тыкать.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

ua6em пишет:

А как по умолчанию? Внешняя подтяжка на аналоговых входах выключена?

ОФФТОП:

О! В нашем полку прибыло. Я давно хотел сказать - гоу к нам, на темную сторону, у нас есть печеньки!

-----

2 Kolaha:

Я тут уточнить хочу, как лучше делать внешнюю подтяжку на аналоговом входе: к земле или к питанию?

И как посоветуете выбирать номинал подтягивающего резистора?

bwn
Offline
Зарегистрирован: 25.08.2014

wdrakula, только хардкор, исключительно 5-ваттные резисторы и не более 0,1Ом. Лучше сразу и к земле, и к питанию.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

bwn пишет:

wdrakula, только хардкор, исключительно 5-ваттные резисторы и не более 0,1Ом. Лучше сразу и к земле, и к питанию.

bwn, но что, если я использую, в качестве источника питания, сварочный инвертор? Стоит ли установить дополнительные помехозащищающие емкости? 68 мкФ будет достаточно, как Вы думаете?

Kolaha
Offline
Зарегистрирован: 29.12.2016

wdrakula пишет:

Я тут уточнить хочу, как лучше делать внешнюю подтяжку на аналоговом входе: к земле или к питанию?

И как посоветуете выбирать номинал подтягивающего резистора?

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

А номинал 10к. Меньше 125 Ом нельзя, точнее можно, но под свою ответственность, ибо горелые ардуинки нынче не в цене.

bwn
Offline
Зарегистрирован: 25.08.2014

Я бы поставил 68000 мкФ х 16В, чтобы инвертор возбудился.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Kolaha пишет:

А номинал 10к. Меньше 125 Ом нельзя, точнее можно, но под свою ответственность, ибо горелые ардуинки нынче не в цене.

То есть, если аналоговый вход просто замкнуть на питание, то все сгорит? Вот прям с дымом?

Kolaha
Offline
Зарегистрирован: 29.12.2016

wdrakula пишет:

Kolaha пишет:

А номинал 10к. Меньше 125 Ом нельзя, точнее можно, но под свою ответственность, ибо горелые ардуинки нынче не в цене.

То есть, если аналоговый вход просто замкнуть на питание, то все сгорит? Вот прям с дымом?

проверь, а то я не пробовал. скажешь потом, чтоб я тоже был в курсе, насчет дыма. это важно. я бы даже сказал - фундаментально важно.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Kolaha пишет:

ua6em пишет:

А как по умолчанию? Внешняя подтяжка на аналоговых входах выключена?

разумеется. "включать" и "выключать" можно только внутреннюю, зашитую в корпус микросхемы, подтяжку. а внешнюю - это Вам придется самому, ручками, свой резик тыкать.

Это я зарапортовался ))) Естественно внутренняя

Уточняю вопрос, надо ли при спользовании ацп в коде обязательно отключать внутреннюю подтяжку или она по умолчанию выключена?

По идее ацп начинаться должен с операционника, то-есть можно на вход любое сопротивление... или в ардуино "всё не так, всё не так ребята"

Kolaha
Offline
Зарегистрирован: 29.12.2016

ua6em пишет:

По идее ацп начинаться должен с операционника, то-есть можно на вход любое сопротивление... или в ардуино "всё не так, всё не так ребята"

я думаю, тут будет полезно полистать даталист. может даже почитать его. Внутренняя подтяжка 20к к +5в по-умолчанию отключена, все пины по-умолчанию включены на вход, если программно послать логическую единицу на пин, то это будет сигналом подключить этот самый внутренний резистор. Нужна Вам подтяжка к +5в (или стяжка на "землю") или нет, зависит от того, что Вы подключаете и как. Может вы создаете генератор случайных чисел и вам нужно с аналогового пина считать первое попавшееся число, тогда Вам как раз и не нужно ничего подключать - свободный пин ловит наводки от минимума до максимума.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Kolaha пишет:

wdrakula пишет:

Kolaha пишет:

А номинал 10к. Меньше 125 Ом нельзя, точнее можно, но под свою ответственность, ибо горелые ардуинки нынче не в цене.

То есть, если аналоговый вход просто замкнуть на питание, то все сгорит? Вот прям с дымом?

проверь, а то я не пробовал. скажешь потом, чтоб я тоже был в курсе, насчет дыма. это важно. я бы даже сказал - фундаментально важно.

Этот дурень до сих пор не понимает, что над ним глумятся!

Родное сердце, перестань позориться!

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

Нет понятия подтяжки, для аналоговых входов. И быть не может, как явления, иначе что ты мерять станешь?

И, если нет желания оставлять "висеть ногу в воздухе", то можно определить ей потенциал, но резистором ВО МНОГО РАЗ БОЛЬШИМ, чем выходное сопротивление источника сигнала. То есть никак не 10К, а 1-2 М.

====================================

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

====================================

Ты эт, не обижайся... я третьего дня SMT32 подключал.... так прежде, чем понял, что перепутал данные и синхру в проводках, пять часов все типы поддержки STLink  у себя на Линухе по 4 раза переставил. ;).... бывает, что клинит.