Подсчет импульсов.

fsdb
Offline
Зарегистрирован: 24.10.2015

Добрый день. Нашел энкодер оптический на алишке. 400 импульсов на  оборот. питание от 5 до 24 вольт. все вроде как можно подключить к ардуинке.

Возникли опасения поэтому хочу спросить у Вас . Я планировал делать один оборот в 2 секунды. +-1 секунда.

успеет ли ардуинка посчитать все эти 400 импульсов?

скетч обычный как в примерах по энкодеру или нужно какие нибудь таймеры/прерывания делать?

 

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

fsdb пишет:

успеет ли ардуинка посчитать все эти 400 импульсов?

От программы зависит. Запрограммируете нормально - посчитает, нет - не посчитает.

"Скетч обычный" - это ни о чём. Обычным бывает стиральный порошок, а скетч всегда конкретен.

fsdb
Offline
Зарегистрирован: 24.10.2015

Евгений я под обычным имел ввиду вот этот пример. я им пользовался как то, работало но я думаю что 400 импульсов он не увидит. вы как думаете?

/*
** Rotary Encoder Example
** Use the Sparkfun Rotary Encoder to vary brightness of LED
**
** Sample the encoder at 200Hz using the millis() function
*/

int brightness = 120;    // how bright the LED is, start at half brightness
int fadeAmount = 10;    // how many points to fade the LED by
unsigned long currentTime;
unsigned long loopTime;
const int pin_A = 12;  // pin 12
const int pin_B = 11;  // pin 11
unsigned char encoder_A;
unsigned char encoder_B;
unsigned char encoder_A_prev=0;

void setup()  {
  // declare pin 9 to be an output:
  pinMode(9, OUTPUT);
  pinMode(pin_A, INPUT);
  pinMode(pin_B, INPUT);
  currentTime = millis();
  loopTime = currentTime; 
} 

void loop()  {
  // get the current elapsed time
  currentTime = millis();
  if(currentTime >= (loopTime + 5)){
    // 5ms since last check of encoder = 200Hz  
    encoder_A = digitalRead(pin_A);    // Read encoder pins
    encoder_B = digitalRead(pin_B);   
    if((!encoder_A) && (encoder_A_prev)){
      // A has gone from high to low 
      if(encoder_B) {
        // B is high so clockwise
        // increase the brightness, dont go over 255
        if(brightness + fadeAmount <= 255) brightness += fadeAmount;               
      }   
      else {
        // B is low so counter-clockwise      
        // decrease the brightness, dont go below 0
        if(brightness - fadeAmount >= 0) brightness -= fadeAmount;               
      }   

    }   
    encoder_A_prev = encoder_A;     // Store value of A for next time    
    
    // set the brightness of pin 9:
    analogWrite(9, brightness);   
   
    loopTime = currentTime;  // Updates loopTime
  }
  // Other processing can be done here
                           
}

 

 

fsdb
Offline
Зарегистрирован: 24.10.2015

или все таки этот пример предпочтительней?

 

#define encoder0PinA 2 


#define encoder0PinB 3 


volatile unsigned int encoder0Pos = 0; 


void setup() { 
  pinMode(encoder0PinA, INPUT); 
  pinMode(encoder0PinB, INPUT); 



// encoder pin on interrupt 0 (pin 2) 
  attachInterrupt(0, doEncoderA, CHANGE);



// encoder pin on interrupt 1 (pin 3) 
  attachInterrupt(1, doEncoderB, CHANGE);  


  Serial.begin (9600);


} 


void loop(){ //Do stuff here } 


void doEncoderA(){ 
  // look for a low-to-high on channel A
  if (digitalRead(encoder0PinA) == HIGH) { 


    // check channel B to see which way encoder is turning
    if (digitalRead(encoder0PinB) == LOW) {  
      encoder0Pos = encoder0Pos + 1;         // CW
    } 
    else {
      encoder0Pos = encoder0Pos - 1;         // CCW
    }
  }


  else   // must be a high-to-low edge on channel A                                       
  { 
    // check channel B to see which way encoder is turning  
    if (digitalRead(encoder0PinB) == HIGH) {   
      encoder0Pos = encoder0Pos + 1;          // CW
    } 
    else {
      encoder0Pos = encoder0Pos - 1;          // CCW
    }
  }
  Serial.println (encoder0Pos, DEC);          
  // use for debugging - remember to comment out


} 


void doEncoderB(){ 
  // look for a low-to-high on channel B
  if (digitalRead(encoder0PinB) == HIGH) {   


   // check channel A to see which way encoder is turning
    if (digitalRead(encoder0PinA) == HIGH) {  
      encoder0Pos = encoder0Pos + 1;         // CW
    } 
    else {
      encoder0Pos = encoder0Pos - 1;         // CCW
    }
  }


  // Look for a high-to-low on channel B


  else { 
    // check channel B to see which way encoder is turning  
    if (digitalRead(encoder0PinA) == LOW) {   
      encoder0Pos = encoder0Pos + 1;          // CW
    } 
    else {
      encoder0Pos = encoder0Pos - 1;          // CCW
    }
  }


} 

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

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

fsdb
Offline
Зарегистрирован: 24.10.2015
fsdb
Offline
Зарегистрирован: 24.10.2015
fsdb
Offline
Зарегистрирован: 24.10.2015

dimax насколько я понял он квадратурный- там есть и А и Б.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

fsdb, ну тогда второй скетч вроде подойдёт , если Не нужно считать обороты/мин.   Я использую аналогичный, но  более изящный.

fsdb
Offline
Зарегистрирован: 24.10.2015

он нитку которую протягивают будет мерить. 1 метр 10 грам. хотел посчитать когда будет 1 кг нити