Frekvensdelare för pulsenkoder [LÖST]

Planering och tankar kring eventuella framtida projekt.
Användarvisningsbild
Electricguy
Inlägg: 12304
Blev medlem: 15 augusti 2007, 16:52:14
Ort: Kälmä' typ..

Frekvensdelare för pulsenkoder [LÖST]

Inlägg av Electricguy »

Så jag köpte ett par stycken optiska pulsenkoders med 400 pulser per varv, vilket är lite mycket för mitt ändamål.
Så jag tänkte att hmm, det borde ju gå att använda ett par 7490 som pulsdelare, då de tar en klocksognal in och ger 4-bit binärt ut.
Men icke!
Jag får ut pulser och allt kommer ut i binärt snyggt och bra.
Men av någon anledning så följer inte kretsarna signalen som de ska. Ibland får jag ut de två faserna med rätt överlapp, ibland kommer det bara ut två separata pulser, ibland kommer bara den ena ut, och rotationsriktningen är helt random.

Har någon en ide om varför detta sker? Man tycker ju att två stycken helt fristående logik-kretsar borde stunta i varandra och köra slaviskt efter insignalen.

Eller finns det något bättre sätt att lösa detta på? Jag skulle vilja ha ca 4x frekvensdelning, men det är inte jättekritiskt då den ska användas som VFO ratt till en radio.

En mikroprocessor typ Arduino hade ju varit en snyggare lösning, men jag har ruskigt dålig koll på hur jag ska gå tillväga när det kommer till frekvensdelning med överlappande faser.

EDIT: Jag testade jusr med en 74393 som även den är en klocka till 4-bit binär räknare. Den fungerar som den ska, bortsett från att den inte förstår vilket håll den går åt.
Senast redigerad av Electricguy 25 juni 2015, 21:50:51, redigerad totalt 1 gång.
Användarvisningsbild
grym
EF Sponsor
Inlägg: 16774
Blev medlem: 16 november 2003, 12:22:57
Ort: i det mörka småland

Re: Frekvensdelare för pulsenkoder

Inlägg av grym »

mekanisk kuggväxel :badgrin: :wink:
Användarvisningsbild
Electricguy
Inlägg: 12304
Blev medlem: 15 augusti 2007, 16:52:14
Ort: Kälmä' typ..

Re: Frekvensdelare för pulsenkoder

Inlägg av Electricguy »

Haha! :D
Jo jag har nästan övervägt det. Men det finns tyvärr inte plats :)

Jag har nog lurat ut varför den bara räknar åt ett håll.. Räknaren triggar alltid på samma flank oavsett, så den kommer alltid att skicka pulsen vid samma tillfälle. Surt.. Man kanske borde överväga något mikroprocessor baserat ändå.. :vissla:
H.O
Inlägg: 5716
Blev medlem: 19 mars 2007, 10:11:27
Ort: Ronneby

Re: Frekvensdelare för pulsenkoder

Inlägg av H.O »

Ett problem som ser enkelt ut vid en första anblick men som visar sig vara lite svårare när man väl sätter sig in hur det fungerar.... :-)
Vi hade en diskussion om det här för ett antal år sedan, målet var att "dela ner" pulståget från en enkoder på en motor. Borde gå att hitta på forumet.
Användarvisningsbild
Electricguy
Inlägg: 12304
Blev medlem: 15 augusti 2007, 16:52:14
Ort: Kälmä' typ..

Re: Frekvensdelare för pulsenkoder

Inlägg av Electricguy »

Ja det är väldigt pilligt när man har hållit på och försökt en stund och inser att det är bra mycket mer invecklat än man tror.

Men jag fick hjälp av en snubbe på IRC så vi moddade en kod till Arduino som jag redan hade, som tar in knappar och en pulsenkoder och skickar ut seriedata beroende på input.
Så vi lade till en delningsfunktion i den koden, och en pot så man variablet med ett antal steg kan ställa upplösningen på enkodern :)



Här är koden

Kod: Markera allt


//Buttons
const int onePin = 5;
const int twoPin = 6;
const int threePin = 7;

//Rotary encoder
int pin1 = 2;
int pin2 = 3;
boolean goingUp = false;
boolean goingDown = false;

//STORE BUTTON STATES
int oneState = 0;
int twoState = 0;
int threeState = 0;

int analogPin = 3;     // Resolution potentiometer connected to analog pin 3


int val = 0;           // variable to store the value read


byte enc_res;

void setup()
{
  Serial.begin(19200);




/* Setup encoder pins as inputs */
    pinMode(pin1, INPUT); // Pin 2
    pinMode(pin2, INPUT); // Pin 3 
    
// Set buttons to inputs
pinMode(onePin, INPUT); 
  pinMode(twoPin, INPUT); 
  pinMode(threePin, INPUT); 

// encoder pin on interrupt 0 (pin 2)
  attachInterrupt(0, decoder, FALLING);
  }



void loop(){
  
val = analogRead(analogPin);    // read the analog input

enc_res = (0x80 >> (analogRead(val) >> 7)) - 1; //translate analog value to division values



//using while statement to stay in the loop for continuous
//interrupts
while(goingUp==1) // CW motion in the rotary encoder
{
goingUp=0; // Reset the flag

Serial.print("B");
}

while(goingDown==1) // CCW motion in rotary encoder
{
goingDown=0; // clear the flag

Serial.print("A");
}



  //Check button states
  oneState = digitalRead(onePin);
  twoState = digitalRead(twoPin);
  threeState = digitalRead(threePin);
  
  //D
  if (oneState == HIGH) {
      Serial.print( "D");
      delay (500);
  } 
 
  //C
  if (twoState == HIGH) {    
      Serial.print("C");
      delay (500);

  }
 
  //E
  if (threeState == HIGH) {    
      Serial.print("E");
      delay (500);
  }
}


void decoder()  // called on falling edge of pin 2, so pin 2 should be low
{
  static byte enc_div = 0;

  if (digitalRead(pin2))
  {
    --enc_div;
    if ((enc_div & enc_res) == 0) goingDown = 1;
  }
  else
  {
    ++enc_div;
    if ((enc_div & enc_res) == 0) goingUp = 1;
  }
}



Användarvisningsbild
Andax
Inlägg: 4373
Blev medlem: 4 juli 2005, 23:27:38
Ort: Jönköping

Re: Frekvensdelare för pulsenkoder [LÖST]

Inlägg av Andax »

Om det är en A/B kvadratur-räknare, där det kommer en fyrkantsvåg på A och B som är 90 grader fasförskjutna så kan man klocka på t.ex A (stigande flank) och räkna uppåt om B är hög då eller räkna ner om B är låg. Enkelt att fixa i en mikrokontroller där man genererar en interrupt på stigande flank på A och sedan bara läser av B och bestämmer om man ska räkna upp eller ner.
Går även implementera ganska lätt med en räknarkrets.
MiaM
Inlägg: 9986
Blev medlem: 6 maj 2009, 22:19:19

Re: Frekvensdelare för pulsenkoder [LÖST]

Inlägg av MiaM »

Man kan väl ungefär säga att utsignalen från pulsenkodern är grey-kodad. De två utgångarna bör väl driva clock och up/down på *en* räknare och om signalen sen ska in i något som förväntar sig en pulsenkoder så får du greykoda utsignalen (typ Q2 rakt av som en utgång och Q3 + Q2 XOR-grindade som andra utgången, och för att slippa glitchar antingen lågpassfiltrera eller ha en d-vippa på utgången som klockas på omvänd flank på signalen som går till clock på räknaren).

Eller?
Skriv svar