компаратор на ардуино

kosty
Offline
Зарегистрирован: 11.03.2018

Пожалуйста подскажите как сделать на компараторе дуни сравнение двух аналоговых сигналов. Алгаритм такой:

если напряжение U1>U2 тогда на на цифровом выходе ардуино D1 логическая 1

если U1<U2 тогда на выходе D2 логическая 1

если U1=U2 тогда и на D1 и D2 логический 0

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013
// так как компоратор програмный нужно задать некоторый предел точности
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);
  }
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

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

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)); }

И всего делов. Проверяйте - работает.

kosty
Offline
Зарегистрирован: 11.03.2018

а где можно почитать для чайников ,чтобы более подробно разобраться, а то везде объяснения уних на входе шим, а у меня напряжение 0-5вольт

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

kosty пишет:

а где можно почитать для чайников ,чтобы более подробно разобраться, а то везде объяснения уних на входе шим, а у меня напряжение 0-5вольт

Мда . Для чайника говорю на входе у Ардуины компаратор, а на выходе ШИМ. И главное не перепутать.

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

kosty пишет:

.....сравнение двух аналоговых сигналов........

если U1=U2 тогда и на D1 и D2 логический 0

Это условие не выполнимо практически никогда.
1/1023 это 0.1 %

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

kosty пишет:

а где можно почитать для чайников ,чтобы более подробно разобраться, а то везде объяснения уних на входе шим, а у меня напряжение 0-5вольт

Вы сравните вот этот Ваш текст с первмы постом (т.е. просмотрите ВСЁ, что Вы написали).

А теперь скажите, как эту фразу понимать? У кого "у них", на каком входе? Вы о чём вообще? Вы что-то там себе думаете, но нам-то откуда это знать? Потрудитесь изъясняться понятно.

kosty
Offline
Зарегистрирован: 11.03.2018

Есть  датчик потенциометр на входе  - положение мотора, драйвер мотора который при 0 или1 крутится в право или лево,для управления и задания нового положения из АРМа (рабочееместо оператора выыход 5-20мА)необходимо чтобы мотор отработал согласно уставки заданой с АРМа. Мотор не шаговый ,постоянного тока. 

Morroc
Offline
Зарегистрирован: 24.10.2016

Если вариант на АЦП не подходит (почему?) можете глянуть эту тему http://arduino.ru/forum/programmirovanie/schetchik-impulsov-analogread . 

На "если U1=U2 тогда и на D1 и D2 логический 0" не особо расчитывайте, сразу логику закладывайте с < >

Electrobit
Offline
Зарегистрирован: 19.09.2021

NeiroN пишет:
// так как компоратор програмный

Какое быстродействие может обеспечить программный компаратор? Сравнимое с аппаратным на LM393?