Подсчет импульсов.
- Войдите на сайт для отправки комментариев
Пт, 16/09/2016 - 09:39
Добрый день. Нашел энкодер оптический на алишке. 400 импульсов на оборот. питание от 5 до 24 вольт. все вроде как можно подключить к ардуинке.
Возникли опасения поэтому хочу спросить у Вас . Я планировал делать один оборот в 2 секунды. +-1 секунда.
успеет ли ардуинка посчитать все эти 400 импульсов?
скетч обычный как в примерах по энкодеру или нужно какие нибудь таймеры/прерывания делать?
успеет ли ардуинка посчитать все эти 400 импульсов?
От программы зависит. Запрограммируете нормально - посчитает, нет - не посчитает.
"Скетч обычный" - это ни о чём. Обычным бывает стиральный порошок, а скетч всегда конкретен.
Евгений я под обычным имел ввиду вот этот пример. я им пользовался как то, работало но я думаю что 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 }или все таки этот пример предпочтительней?
#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 } } }fsdb, вы бы написали для начала что за энкодер -одноканальный или квадратурный. Эти примеры выше -для обычных квадратурных, где ось крутят рукой. Вам точно никакой из этих не подойдёт в любом случае.
https://ru.aliexpress.com/item/AB-Two-phase-5-24V-400-Pulses-Incremental-Optical-Rotary-Encoder/32258485761.html?spm=2114.41010308.4.16.QYioly
https://ru.aliexpress.com/item/AB-Two-phase-5-24V-400-Pulses-Incremental-Optical-Rotary-Encoder/32258485761.html?spm=2114.41010308.4.16.QYioly
dimax насколько я понял он квадратурный- там есть и А и Б.
fsdb, ну тогда второй скетч вроде подойдёт , если Не нужно считать обороты/мин. Я использую аналогичный, но более изящный.
он нитку которую протягивают будет мерить. 1 метр 10 грам. хотел посчитать когда будет 1 кг нити