Тезометрический датчик и энкодер
- Войдите на сайт для отправки комментариев
Пнд, 05/08/2019 - 08:23
Здравствуйте, делаю одно устройство в состав которого входит тензометрический датчик и энкодер.
Принцип работы довольно простой, получаем данные с датчиков на ардуино и отправляем их дальше через последовательный порт на ПК там уже обрабатывает эти данные программа.
Дело в том что по отдельности данныес каждого датчика, хорошо принимаются и передаются, а вот как обьединяю прием донных с датчиков в один скетч, так начинается не корректная работа.
тензометрический датчик принимаю библиотечной функцией, есть предположение что библиотечная функция както пересекается с процедурой обработки данных с энкодера или же просто ресурсоемкость у тензометрической функции большая.
#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;
}
}
}
Попробуйте энкодер на прерывания переделать, здесь тема была: "Работаем с энкодером", в конце, есть примеры от Dimax. Код, который у вас, очень медленный и как следствие, глючный.
Метод read, который Вы вызываете в строке №52 начинается с неконтролируемого ожидания. Так можно всё проспать. Переделывайте энкодер на прерывания.
вставил код от 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"); }CybSys, у вас энкодер ec-11 . возьмите обработчик из #293 , мс14490 не будет нужен.
спасибо! заработало, считает нормально!!! )))
"Метод read, который Вы вызываете в строке №52 начинается с неконтролируемого ожидания. Так можно всё проспать. Переделывайте энкодер на прерывания."
вот даже библиотеку писал с классами и tamplate чтоб меньше ресурсов ела.