Тезометрический датчик и энкодер

CybSys
Offline
Зарегистрирован: 05.08.2019

Здравствуйте, делаю одно устройство в состав которого входит тензометрический датчик и энкодер.

Принцип работы довольно простой, получаем данные с датчиков на ардуино и отправляем их дальше через последовательный порт на ПК там уже обрабатывает эти данные программа.

Дело в том что по отдельности данныес каждого датчика, хорошо принимаются и передаются, а вот как обьединяю прием донных с датчиков в один скетч, так начинается не корректная работа.

тензометрический датчик принимаю библиотечной функцией, есть предположение что библиотечная функция както пересекается с процедурой обработки данных с энкодера или же просто ресурсоемкость у тензометрической функции большая.

 

#include "HX711.h"
#include <stdlib.h>

///////////////////////////////////////////////////////////////////
#define pin_CLK 2
#define pin_DT  3

enum eEncoderState {eNone, eLeft, eRight, eButton};
byte EncoderA, EncoderB, EncoderAPrev;


eEncoderState GetEncoderState() {
  // Считываем состояние энкодера
  eEncoderState Result = eNone;
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             
      EncoderA = digitalRead(pin_DT);
      EncoderB = digitalRead(pin_CLK);
      if ((!EncoderA) && (EncoderAPrev)) { // Сигнал A изменился с 1 на 0
        if (EncoderB) Result = eRight;     // B=1 => энкодер вращается по часовой
        else          Result = eLeft;      // B=0 => энкодер вращается против часовой
      }
      EncoderAPrev = EncoderA; // запомним текущее состояние

  return Result;
}
/////////////////////////////////////////////////////

HX711 cell(5, 7);
int temp = 0, counter = 0;

int Spd = 0;
int Spd2 = 0;
long val = 0;
long zero = 0;
int z = 0;
int menu = 0;
int t=0;
int mass=1;
int massV=1;
 
void setup() {
 
  Serial.begin(9600);  
  
  pinMode(pin_DT,  INPUT);
  pinMode(pin_CLK, INPUT);
 
}

void loop() {
  Serial.print("S");
  Serial.print(cell.read());
  Serial.print("/");
  Serial.print(counter);
  Serial.println("A"); //отправляем строку с данными на ПК


 switch (GetEncoderState()) {
    case eNone: return;
    case eLeft: {   // Энкодер вращается влево
        counter--;
        break;
      }
    case eRight: {  // Энкодер вращается вправо
        counter++;
        break;
      }
    case eButton: { // Нажали кнопку
        counter = 0;
        break;
      }
  }
}

 

bwn
Offline
Зарегистрирован: 25.08.2014

Попробуйте энкодер на прерывания переделать, здесь тема была: "Работаем с энкодером", в конце, есть примеры от Dimax. Код, который у вас, очень медленный и как следствие, глючный.

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

Метод read, который Вы вызываете в строке №52 начинается с неконтролируемого ожидания. Так можно всё проспать. Переделывайте энкодер на прерывания.

CybSys
Offline
Зарегистрирован: 05.08.2019

вставил код от Dimax. энкодер у меня подключен через микросхему мс14490 с конденсатором 47пФ, но похоже что его надо чуть большей емкости так как при одном щелчке энкодера, прибавляется сразу два значения. 

получилось вот так:

#include "HX711.h"
#include <stdlib.h>

HX711 cell(5, 7);

volatile int enc;
void setup() {                
Serial.begin(9600);
PCICR=1<<PCIE1; //разрешить пренрывание
PCMSK1=(1<<PCINT9)|(1<<PCINT8); //выбрать входы
}

ISR (PCINT1_vect){
static byte old_n=PINC&3; // маска B00000011 что б читать только нужные 2 бита
byte new_n=PINC&3;
if (old_n==1&&new_n==3||old_n==2&&new_n==0) {enc++;}
if (old_n==2&&new_n==3||old_n==1&&new_n==0) {enc--;}
old_n= new_n;
}

void loop() {
  Serial.print("S");
  Serial.print(cell.read());
  Serial.print("/");
  Serial.print(enc);
  Serial.println("A");
}
dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

CybSys, у вас энкодер ec-11 . возьмите обработчик из #293 , мс14490 не будет нужен.

CybSys
Offline
Зарегистрирован: 05.08.2019

спасибо! заработало, считает нормально!!! )))

enjoyneering
enjoyneering аватар
Offline
Зарегистрирован: 05.09.2016

"Метод read, который Вы вызываете в строке №52 начинается с неконтролируемого ожидания. Так можно всё проспать. Переделывайте энкодер на прерывания."

вот даже библиотеку писал с классами и tamplate чтоб меньше ресурсов ела.