Advertisement
Alexcnc

2 Enkodery inkrementalny nie kierunkowy

Dec 16th, 2021 (edited)
839
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.78 KB | None | 0 0
  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 long P;                   // количество счетчика прерываний с енкодера
  10. volatile long P1;                  // количество счетчика прерываний с фотометки
  11. float E;                           // длина по енкодеру
  12. float F;                           //  
  13. float M;                           //
  14. float M1;                          //
  15. bool mSel=0;                       // флаг фотометки
  16.  
  17. void setup() {
  18. pinMode(6, INPUT);                  // кнопка reset
  19.  
  20. pinMode(2, INPUT_PULLUP);           // вход сигнала А с энкодера
  21. pinMode(3, INPUT);                  // вход сигнала с фотометки
  22. attachInterrupt(0,blink1, CHANGE);  // 1 прерывание с энкодера
  23. attachInterrupt(1,blink2, RISING);  // 2 прерывание с фотометки
  24. lcd.begin();                        // инициализация экрана
  25. lcd.backlight();                    // вкл. подсветки
  26. }
  27.  
  28. void loop()                // обработка вывода на екран и длины с энкодера
  29. {
  30. if (digitalRead(6)) P=0;            // если нажата кнопка reset, то Р сбрасываем в ноль
  31. lcd.setCursor(0,0);                 // устанавливаем курсор, 1 позиция 0 строка  
  32. lcd.print("E=");              // пишем Enkoder=
  33. E=P*0,1388;                   // расчет длины количество импульсов *0,13888 коефициент, коефициент= длина окружности колесика на
  34.                                     // енкодере / на импульсов на оборот (1440: 360 impusow s enkodera x4 w kwadraturon rezymie)
  35. lcd.print(E);                     // выводим значение E  (ето значение по сути выводить и не надо, это кусок кода с измерителя длины
  36. lcd.print("mm        ");         // пишем mm, и остальное затираем
  37. lcd.setCursor(0,1);                 // устанавливаем курсор, 0 позиция 1 строка
  38. lcd.print("F=");              // пишем F=
  39. if (M1>=M);
  40. {
  41.   lcd.print((M1-M)*0,1388);
  42. }
  43.                                     // по енкодеру, но думаю это можно использовать)
  44. //lcd.print("mm");         // пишем mm, и остальное затираем
  45. }
  46.  
  47. void blink1(){             // обработчик прерывания c энкодера
  48. P=P+1;                               // инкремент счетчика импульсов энкодера
  49. }
  50.  
  51. void blink2(){                       // обработчик прерывания c фотометки    (тут надо на основании длины с енкодера и импульса
  52.                                      // фотометки расчитать длину между фотометками )
  53. if (mSel=0);
  54. {
  55.   M=P;                     // длина до первого импульса с фотометки ?
  56.   mSel=1;                          
  57. }
  58.   M1=P;                             // длина до второго импульса с фотометки ?
  59.   mSel=0;
  60. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement