компаратор на ардуино
- Войдите на сайт для отправки комментариев
Сб, 02/06/2018 - 12:30
Пожалуйста подскажите как сделать на компараторе дуни сравнение двух аналоговых сигналов. Алгаритм такой:
если напряжение U1>U2 тогда на на цифровом выходе ардуино D1 логическая 1
если U1<U2 тогда на выходе D2 логическая 1
если U1=U2 тогда и на D1 и D2 логический 0
// так как компоратор програмный нужно задать некоторый предел точности int delta = 5; //для абсолютной точности 0 void setup(){ pinMode(1, OUTPUT); pinMode(2, OUTPUT); } void loop(){ int u1 = analogRead(A1); int u2 = analogRead(A2); if (u1-delta > u2){ digitalWrite(1, HIGH); digitalWrite(2, LOW); }else if(u2-delta > u1) digitalWrite(1, HIGH); digitalWrite(2, LOW); }else{ digitalWrite(1, LOW); digitalWrite(2, LOW); } }Так ТС же вроде про аналоговый компаратор спрашивал, а Вы ему цифровой пихаете.
kosty,
Вам чего надо-то? В даташите что-то непонятно, или в чём проблема?
И, кстати, что у Вас за ардуина? Они разные. Если на базе 328, то там всё тривиально, не знаю, что Вам непонятно. Вот, держите работающий пример всего из восьми строк, не считая комментариев. А так, читайте даташит, и говорите толком, что неясно.
// // Компаратор сравнивает сигналы на входах // // Положительный - AIN0 (PD6, пин в DIP - 12, пин Ардуино - D6) // В качестве положительного входа можно также использовать // внутреннее опорное напряжение 1.1В // // Отрицательный - AIN1 (PD7, пин в DIP - 13, пин Ардуино - D7) // В качестве отрицательного входа можно также сконфигурировать // любой ADC вход (аналоговый пин) // // Когда напряжение на положительном входе (D6) выше, чем на отрицательном (D7), // активируется выход компаратора ACO (бит в регистре ACSR). // // Выход можно "натравить" на вход таймера/счётчика 1 или же // на собственное прерывание компаратора // // В примере светодиод на 13 пине светится, когда напряжение на D6 выше, // чем на D7 и не светится, когда ниже или равно. Сделано через прерывание компаратора. // void setup(void) { pinMode(LED_BUILTIN, OUTPUT); ACSR = bit(ACIE); } void loop(void) {} ISR(ANALOG_COMP_vect) { digitalWrite(LED_BUILTIN, ACSR & bit(ACO)); }(да, пожалуйста, не используйте в теме слов типа "дуня", "резюк" и прочие "кондеры", иначе я ухожу из темы сразу, будете ждать кого-то другого).
UPDATE:
Я тут подумал и решил привести для Вас ещё более брутальный пример - делает ровно тоже самое, что и предыдущий, только не использует прерывание.
void setup(void) { pinMode(LED_BUILTIN, OUTPUT); } void loop(void) { digitalWrite(LED_BUILTIN, ACSR & bit(ACO)); }И всего делов. Проверяйте - работает.
а где можно почитать для чайников ,чтобы более подробно разобраться, а то везде объяснения уних на входе шим, а у меня напряжение 0-5вольт
а где можно почитать для чайников ,чтобы более подробно разобраться, а то везде объяснения уних на входе шим, а у меня напряжение 0-5вольт
.....сравнение двух аналоговых сигналов........
если U1=U2 тогда и на D1 и D2 логический 0
Это условие не выполнимо практически никогда.
1/1023 это 0.1 %
а где можно почитать для чайников ,чтобы более подробно разобраться, а то везде объяснения уних на входе шим, а у меня напряжение 0-5вольт
Вы сравните вот этот Ваш текст с первмы постом (т.е. просмотрите ВСЁ, что Вы написали).
А теперь скажите, как эту фразу понимать? У кого "у них", на каком входе? Вы о чём вообще? Вы что-то там себе думаете, но нам-то откуда это знать? Потрудитесь изъясняться понятно.
Есть датчик потенциометр на входе - положение мотора, драйвер мотора который при 0 или1 крутится в право или лево,для управления и задания нового положения из АРМа (рабочееместо оператора выыход 5-20мА)необходимо чтобы мотор отработал согласно уставки заданой с АРМа. Мотор не шаговый ,постоянного тока.
Если вариант на АЦП не подходит (почему?) можете глянуть эту тему http://arduino.ru/forum/programmirovanie/schetchik-impulsov-analogread .
На "если U1=U2 тогда и на D1 и D2 логический 0" не особо расчитывайте, сразу логику закладывайте с < >
Какое быстродействие может обеспечить программный компаратор? Сравнимое с аппаратным на LM393?