1

Тема: Аналоговый компаратор

Вход AIN0 подключен к опорному напряжению 1,1 В. На AIN1 (D7) подается напряжение.
Выполняется условие:
PB5 = 0 - если AIN0<AIN1
PB5 = 1 - если AIN0>AIN1


void setup() {
  ACSR |= (1 << ACBG);  // подключаем ИОН ко входу AIN0 (D6)
  DDRB |= (1 << 5);     // выход PB5 как выход (D13)
}

void loop() {
  while ((ACSR & 0x20) == 0x20) { // если бит ACO регистра ACSR равен 1, то исполнять код в цикле
    PORTB |= (1 << 5);  // PB5 HIGH
  }
  PORTB &= ~(1 << 5);   // PB5 LOW
}

Скетч использует 464 байт (1%) памяти устройства. Всего доступно 32256 байт.
Глобальные переменные используют 9 байт (0%) динамической памяти, оставляя 2039 байт для локальных переменных. Максимум: 2048 байт.

2

Re: Аналоговый компаратор

void setup() {
  DDRB |= (1 << 5);        // выход PB5 как выход (D13)
  ADCSRA &= ~(1 << ADEN);  // ADEN = 0
  ADCSRB |= (1 << ACME);   // ACME = 1
  /////////////////////////// MUX2..0 = ADC0...ADC7
 // ADMUX  |= (1 << MUX2);           
 // ADMUX  |= (1 << MUX1); 
 // ADMUX  |= (1 << MUX0); 
}

void loop() {
  while ((ACSR & 0x20) == 0x20) { // если бит ACO регистра ACSR равен 1, то исполнять код в цикле
    PORTB |= (1 << 5);  // PB5 HIGH
  }
  PORTB &= ~(1 << 5);   // PB5 LOW
}

3

Re: Аналоговый компаратор

измерение длительности импульса

http://forum.rcl-radio.ru/uploads/images/2020/07/212fecf916a6f1f4900f46038131f97d.png


volatile int x;
 float f;
bool w;
void setup() {
  Serial.begin(9600);
  cli();
 //// таймер ///////////
  TCCR1A = 0;
  TCCR1B = 0;
  TCCR1B |= (1 << CS10); // делитель 1
  TIMSK1 |= (1 << TOIE1);
   
  //// компаратор ///////
  ADCSRA &= ~(1 << ADEN);  // ADEN = 0
  ADCSRB |= (1 << ACME);   // ACME = 1
  /////////////////////////// MUX2..0 = ADC0...ADC7
 // ADMUX  |= (1 << MUX2);           
 // ADMUX  |= (1 << MUX1); 
  ADMUX  |= (1 << MUX0); // A1 INPUT, D7 +3.3V
  sei();
}

void loop() {
  while((ACSR & 0x20) == 0x20){x=0;TCNT1 = 0;}
  while((ACSR & 0x20) == 0x00){w=1;}
  
  if(w==1){
    f = x * 65535 + TCNT1;
    w=0; 
    Serial.print(f/16,0); 
    Serial.println(" uS");delay(500);
  }
}

ISR (TIMER1_OVF_vect){x++;}

4

Re: Аналоговый компаратор

калибровка

генератор 8 мгц выход d9

void setup(){
   // см. пример - http://rcl-radio.ru/?p=80812
    DDRB = 0b00000010;       // установить пин PB1 (D9) как выход | выход OC1A
 
    cli();                   // отключить глобальные прерывания
    TCCR1A = 0;              // установить регистр TCCR1A в 0
    TCCR1B = 0;              // установить регистр TCCR1B в 0
 
    TCCR1A |= (1 << COM1A0); // COM1A1 COM1A0  = bit:01 - изменение состояния вывода OC1A на противоположное при совпадении с A
 
    TCCR1B |= (1 << WGM12);  // включить CTC режим > сброс таймера по совпадению
    TCCR1B |= (1 << CS10);   // Установить биты CS10 CS12 на коэффициент деления 1024  
  //  TCCR1B |= (1 << CS12);   
 
    OCR1A = 1;           
 
    sei();                   // включить глобальные прерывания
}
 
void loop(){ }

http://forum.rcl-radio.ru/uploads/images/2020/07/7ce43dadb99948f84d9af45fe00c1fcb.png


volatile int x;
float f;
bool w;
const float k = 1.00639058;
void setup() {
  Serial.begin(9600);
  cli();
 //// таймер ///////////
  TCCR1A = 0;
  TCCR1B = 0;
  TCCR1B |= (1 << CS10); // делитель 1
  TIMSK1 |= (1 << TOIE1);
   
  //// компаратор ///////
 ACSR |= (1 << ACBG);  // подключаем ИОН ко входу AIN0 (D6)
  sei();
}

void loop() {
  while((ACSR & 0x20) == 0x20){x=0;TCNT1 = 0;}
  while((ACSR & 0x20) == 0x00){w=1;}
  
  if(w==1){
    f = x * 65535 + TCNT1;
    w=0; 
    Serial.print(f/16*k,0); 
    Serial.println(" uS");delay(500);
  }
}

ISR (TIMER1_OVF_vect){x++;}

5

Re: Аналоговый компаратор

определение длительности и скважности импульса

http://forum.rcl-radio.ru/uploads/images/2020/07/7fd32f63e6e79fad366b1cacafc5b4b1.png

volatile int x;
float t,t1;
bool w,w1;
const float k = 1.006391;
void setup() {
  Serial.begin(9600);
  cli();
 //// таймер ///////////
  TCCR1A = 0;
  TCCR1B = 0;
  TCCR1B |= (1 << CS10); // делитель 1
  TIMSK1 |= (1 << TOIE1);
   
  //// компаратор ///////
 ACSR |= (1 << ACBG);  // подключаем ИОН ко входу AIN0 (D6)
  sei();
}

void loop() {
  while((ACSR & 0x20) == 0x20){}
  while((ACSR & 0x20) != 0x20){x=0;TCNT1 = 0;}
  while((ACSR & 0x20) == 0x20){}
   t1 = x * 65535 + TCNT1;
  while((ACSR & 0x20) != 0x20){}
  while((ACSR & 0x20) == 0x20){x=0;TCNT1 = 0;}
  while((ACSR & 0x20) != 0x20){w=1;}
   t = x * 65535 + TCNT1;
  if(w==1){
    
    w=0; 
    Serial.print("t1 = ");
    Serial.print(t1/16*k,0); 
    Serial.println(" uS");
    Serial.print("t0 = ");
    Serial.print(t/16*k,0); 
    Serial.println(" uS");delay(1000);
  }



}

ISR (TIMER1_OVF_vect){x++;}

6

Re: Аналоговый компаратор

+ ПЕРИОД

http://forum.rcl-radio.ru/uploads/images/2020/07/77131813146d8b137eb8a23738d53f92.png


volatile int x;
float t,t1;
bool w,w1;
const float k = 1.006424;
void setup() {
  Serial.begin(9600);
  cli();
 //// таймер ///////////
  TCCR1A = 0;
  TCCR1B = 0;
  TCCR1B |= (1 << CS10); // делитель 1
  TIMSK1 |= (1 << TOIE1);
   
  //// компаратор ///////
 ACSR |= (1 << ACBG);  // подключаем ИОН ко входу AIN0 (D6)
  sei();
}

void loop() {
  while((ACSR & 0x20) == 0x20){}
  while((ACSR & 0x20) != 0x20){x=0;TCNT1 = 0;}
  while((ACSR & 0x20) == 0x20){}
   t1 = x * 65535 + TCNT1;
  while((ACSR & 0x20) != 0x20){}
  while((ACSR & 0x20) == 0x20){x=0;TCNT1 = 0;}
  while((ACSR & 0x20) != 0x20){w=1;}
   t = x * 65535 + TCNT1;
  if(w==1){
    
    w=0; 
    Serial.print("t1 = ");
    Serial.print(t1/16*k,0); 
    Serial.println(" uS");
    Serial.print("t0 = ");
    Serial.print(t/16*k,0); 
    Serial.println(" uS");
    Serial.print("T = ");
    Serial.print((t/16+t1/16)*k,0); 
    Serial.println(" uS");    
    delay(1000);
  }



}

ISR (TIMER1_OVF_vect){x++;}