#16
Post
napisał: tristar0 » 29 mar 2020, 18:15
chyba się nie zrozumieliśmy ,tak wiem sa enkodery liniowe ale ja próbuje rozwiązać własny problem mam w maszynie już enkodery na silnikach z servami , dodatkowo na sterowniku silników mam gotowe wyjścia z enkoderów sygnały ttl A,B,Z , gdybym nie miał tych sygnałów to skłaniałbym się o zakup gotowych enkoderów liniowych i jakieś firmowe dro.
Maszyny używam sporadycznie a nie przemysłowo .
Dodane 6 minuty 32 sekundy:
poza tym sprawdzałem ten program i działa tyle że ledy biją po oczach
// Quad Encoder 600 ppr LPA3806
// Red 5 Vcc
// White Chanel A Pin 2 (Int 1)
// Green Chanel B Pin 3 (Int 2)
// Black Gnd
// Display 8 digit MAX7219 -a-
// VCC R 5 Vcc f b
// DIN W MOSI Pin 11 -g-
// CS Y SS Pin 10 e c
// CLK B SCK Pin 13 -d- p
// GND B Gnd pgfe dcba
// Zero switch
// COM B Gnd
// NO Y Pin 9
/******************************************************************/
#include <LedControl.h>
LedControl lc=LedControl(11,13,10,1);
/******************************************************************/
#define SCF 75.00000 // Encoder factor (1/((600*4)/(12*0.08))*10000) // 75.00000 /obr 3mm 50.00000 =2mm 25.0000 =1mm
#define DLY 50 // Refresh period (100 ms)
#define QCA 2 // Encoder Chanel A (Pin 2)
#define QCB 3 // Encoder Chanel B (Pin 3)
#define QIA 0 // Encoder Chanel A (Int 1)
#define QIB 1 // Encoder Chanel B (Int 2)
#define SWZ 9 // Zero switch (Pin 9)
long DroCnt; // DRO raw counter
long DroOfs; // DRO offset (zero)
long DroMea; // DRO measurement (inch *10000)
float DroKft; // DRO scale factor
/******************************************************************/
void setup()
{
IniSwz(); // Init Zero switch
IniEnc(); // Init Encoder
IniDsp(); // Init Display
IniClc(); // Init Calc
}
void loop()
{
ThrSwz(); // Test Zero switch
ThrClc(); // Calc measure
ThrDsp(); // Display measure
delay(DLY);
}
/******************************************************************/
void IniClc(void) // Init Calc
{
DroCnt=0;
DroOfs=0;
DroMea=0;
DroKft=SCF;
}
void ThrClc(void) // Calc measure
{
DroMea=FltLng((float)(DroCnt-DroOfs)*DroKft);
}
/******************************************************************/
void IniDsp(void) // Init Display
{
lc.shutdown(0,false); // MAX7219 out of power-saving mode
lc.setIntensity(0,9); // jasnosc wyswietlacza
lc.clearDisplay(0); // Clear display
}
void ThrDsp(void) // Display measure
{
long v;
int i,n,m;
n=0;
v=DroMea;
if(v<0)
{
n=1;
v*=-1;
}
for(i=0;i<8;i++)
{
m=v%10;
switch(i)
{
case 0:
if(m>=5)
lc.setDigit(0,i,5,false);
else
lc.setDigit(0,i,0,false);
break;
case 1:
case 2:
case 3:
lc.setDigit(0,i,m,false);
break;
case 4:
lc.setDigit(0,i,m,true);
break;
case 5:
case 6:
case 7:
if(m)
lc.setDigit(0,i,m,false);
else
{
if(n)
{
n=0;
lc.setChar(0,i,'-',false);
}
else
lc.setChar(0,i,' ',false);
}
break;
}
v/=10;
}
}
/******************************************************************/
void IniSwz(void) // Init Zero switch
{
pinMode(SWZ,INPUT_PULLUP);
}
void ThrSwz(void) // Test Zero switch
{
if(!digitalRead(SWZ))
DroOfs=DroCnt;
}
/******************************************************************/
void IniEnc(void) // Init Encoder
{
pinMode(QCA,INPUT_PULLUP);
pinMode(QCB,INPUT_PULLUP);
attachInterrupt(QIA,QenChAInt,CHANGE);
attachInterrupt(QIB,QenChBInt,CHANGE);
}
void QenChAInt(void) // Interruption chanel A
{
if(PIND&4)
{ // Chanel A High
if(PIND&8)
DroCnt++; // Chanel B High (increase)
else
DroCnt--; // Chanel B Low (decrease)
}
else
{ // Chanel A Low
if(PIND&8)
DroCnt--; // Chanel B High (decrease)
else
DroCnt++; // Chanel B Low (increase)
}
}
void QenChBInt(void) // Interruption chanel B
{
if(PIND&8)
{ // Chanel B High
if(PIND&4)
DroCnt--; // Chanel A High (decrease)
else
DroCnt++; // Chanel A Low (increase)
}
else
{ // Chanel B Low
if(PIND&4)
DroCnt++; // Chanel A High (increase)
else
DroCnt--; // Chanel A Low (decrease)
}
}
/******************************************************************/
long FltLng(float v)
{
return((v<0)?(long)(v-0.5):(long)(v+0.5));
}
Dodane 8 minuty 39 sekundy:
Dla tego bardziej przemawia do mnie FT800 niz ledy
Mam wyrypane na wszelkiej maści proroków ,mędrców i wszystkich którzy stawiają się ponad innymi ,i tak ich zjedzą robaki