Alexcnc

2 Enkodery inkrementalny nie kierunkowy

Dec 16th, 2021 (edited)
762
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //Измерение длинны с двух инкрементальых энкодеров, измерение без учета направления только по одному
  2. //сигналу энкодера. Энкодер PIB3806-360-G5-24C, на 360 импулсов на оборот, длина окружности измерительного колеса 200мм
  3.  
  4. #include <Wire.h>
  5. #include <LiquidCrystal_I2C.h>
  6.  
  7. LiquidCrystal_I2C lcd(0x27,16,2);
  8.  
  9. volatile boolean A, B;
  10. volatile long P;                   //число прерываний
  11. volatile long P1;
  12. float M;                           //длина
  13. float M2;
  14.  
  15.  
  16. void setup() {
  17. pinMode(6, INPUT);                  // кнопка reser
  18. pinMode(2, INPUT_PULLUP);           // вход сигнала А с 1 энкодера
  19. pinMode(3, INPUT_PULLUP);           // вход сигнала А с 2 энкодера
  20. attachInterrupt(0,blink1, CHANGE);  // первое прерывание с 1 энкодера
  21. attachInterrupt(1,blink2, CHANGE);  // второе прерывание с 2 энкодера
  22. lcd.begin();                        // инициализация экрана
  23. lcd.backlight();                    // вкл. подсветки
  24. }
  25.  
  26. void loop()              // обработка вывода на екран и длины с 1 энкодера
  27. {
  28. if (digitalRead(6)) P=0;            // если нажата кнопка reset, то Р сбрасываем в ноль
  29. lcd.setCursor(0,0);                 // устанавливаем курсор, 1 позиция 0 строка  
  30. lcd.print("Top=");                  // пишем Top=
  31. M=(P/3.6)/10;                       // расчет коэфицыента для 1 энкодера и длины M1 (360*2),720/200=3,6
  32. lcd.print(M);                       // выводим значение M
  33. lcd.print("cm           ");         // пишем cm, и остальное затираем
  34.  
  35.                          // обработка вывода на екран и длины с 2 энкодера
  36. if (digitalRead(6)) P1=0;           // если нажата кнопка reset, то Р1 сбрасываем в ноль
  37. lcd.setCursor(0,1);                 // устанавливаем курсор, нолевая позиция первая строка
  38. lcd.print("Bot.=");                 // пишем Bottom=
  39. M2=(P1/3.6)/10 ;                    // расчет коэфицыента 2 энкодера и длины M2 (360*2),720/200=3,6
  40. lcd.print(M2);                      // выводим значение М2
  41. lcd.print("cm          ");          // пишем cm, и остальное затираем
  42. }
  43.  
  44. void blink1()
  45. {                         // обработчик 1 прерывания
  46. P=P+1;                               // инкремент импульса
  47. //A=digitalRead(2);                  // считываем состояние pin2
  48. //B=digitalRead(3);                  // считываем состояние pin3
  49. //if (B==A)                          //
  50. //else P=P-1;                        //
  51. }
  52.  
  53. void blink2(){            // обработчик 2 прерывания
  54. P1=P1+1;                             // инкремент импульса
  55. //A=digitalRead(2);                  // считываем состояние pin2
  56. //B=digitalRead(3);                  // считываем состояние pin3
  57. //if (B!=A);                         //
  58. //else P1=P1-1;                      //
  59. }
RAW Paste Data Copied