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.
Frekvensdelare för pulsenkoder [LÖST]
- Electricguy
- Inlägg: 12304
- Blev medlem: 15 augusti 2007, 16:52:14
- Ort: Kälmä' typ..
Frekvensdelare för pulsenkoder [LÖST]
Senast redigerad av Electricguy 25 juni 2015, 21:50:51, redigerad totalt 1 gång.
- Electricguy
- Inlägg: 12304
- Blev medlem: 15 augusti 2007, 16:52:14
- Ort: Kälmä' typ..
Re: Frekvensdelare för pulsenkoder
Haha!
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å..
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å..
Re: Frekvensdelare för pulsenkoder
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.
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.
- Electricguy
- Inlägg: 12304
- Blev medlem: 15 augusti 2007, 16:52:14
- Ort: Kälmä' typ..
Re: Frekvensdelare för pulsenkoder
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
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;
}
}
Re: Frekvensdelare för pulsenkoder [LÖST]
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.
Går även implementera ganska lätt med en räknarkrets.
Re: Frekvensdelare för pulsenkoder [LÖST]
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?
Eller?