Ik heb een encoder die de bekende AB signalen afgeeft.
Die wil ik graag bouwen d.m.v. logische poorten (en flipflops) uit de 74F-serie. ( Een FPGA is makkelijker, maar dan ben je meteen een hoop geld kwijt.)
De teller zelf is geen probleem.
Het probleem zit in het maken van een up/down-signaal om aan te geven welke kan hij op moet tellen, en het maken van een klok-signaal.
Het mag evt. een 4-deler worden.
Zelf kom ik er niet uit met het veranderen van het up/down-signaal en meteen een klokpuls te genereren.
pros
Prosper, yop la boum, c'est le roi du macadam (aldus Maurice Chevalier)
Ik weet niet wat je met "bekende AB signalen" bedoelt, maar vermits er sprake is van een encoder zullen dat wel 2 pulstreinen zijn, die iets in fase verschoven zijn. Je kan bv. de opgaande flank van 1 signaal gebruiken als klok (de meeste tellers reageren immers op een laag-naar-hoog flank). Het 2e signaal gebruik je dan om te kiezen tussen up of down. Als je merkt dat hij optelt wanneer hij moet aftellen, verwissel je gewoon beide signalen.
Op 15 januari 2007 18:40:27 schreef pros:
Ik weet niet wat je met "bekende AB signalen" bedoelt,...
een standaard incrementeelgever heeft een "A", "B" en een "Z" sigaal. In veel gevallen ook nog de drie inversen hiervan.
A en B hebben een onderlinge verschuiving van 90 graden, Z is tussen 0 en 1 graad hoog.
Die signalen heten nou eenmaal altijd zo.
Als je uit een clock een vierfasensignaal wilt maken is een bekende oude truuk een 2-deler, Q is een uitgangsignaal, en een EXOR of -NOR (uitgang is tweede uitgangsignaal) tussen de uitgang van de deler en de clock.
Met een tweede EXOR kun je simpel omschakelen welk signaal voorloopt.
Op 15 januari 2007 18:40:27 schreef pros:
Ik weet niet wat je met "bekende AB signalen" bedoelt, maar vermits er sprake is van een encoder zullen dat wel 2 pulstreinen zijn, die iets in fase verschoven zijn. Je kan bv. de opgaande flank van 1 signaal gebruiken als klok (de meeste tellers reageren immers op een laag-naar-hoog flank). Het 2e signaal gebruik je dan om te kiezen tussen up of down. Als je merkt dat hij optelt wanneer hij moet aftellen, verwissel je gewoon beide signalen.
Het probleem is juist dat zodra de laag-naar-hoog flank gemaakt is, en de encoder gaat 90 graden terug en weer 90 graden verder komt er weer een nieuwe laag-naar-hoog flank.
Hoe krijg ik het voor elkaar om bij de terugweg én het up/down-signaaal te veranderen én een klokpuls te geven om af te tellen?
Dat verhaal snap ik niet helemaal.
Een opgaande flank van A bij een lage B is optellen,
een opgaande flank van A bij een hoge B is aftrekken.
meer is het niet.
Stel mijn signaal is A=1 en B=0.
Als ik de encoder verdraai, komt er A=1 en B=1 uit.
Dan kan ik m.b.v. een AND-poort een kloksignaal maken.
Maar als ik nu de encoder terugdraai, ontstaat er weer A=1 en B=0. Ik moet dan weer aftellen.
Op dat moment moet ik ook een kloksignaal maken, maar daarvoor moet ik even het up/down-signaal omswitchen.
Mij lukt het niet om een schakeling te verzinnen om dit te doen.
In C zou ik dit als volgt op lossen:
void detectrichting_isr(void) interrupt 11
//channel A (interrupt) op pin P1.1
//channel B op pin P1.2
{
richting = ChannelB;
if (richting) % tel++ ? tel--;
IEX4=0;
}
Oftewel als de interrupt aangeroepen wordt (positieve flank op A), wordt meteen de waarde van B bekeken. Is deze ook hoog, dan draait de encoder rechtsom en anders linksom (richting > linksom = 0, rechtsom = 1). Vervolgens afhankelijk van de richting optellen of aftrekken en de interrupt resetten.
pros
Prosper, yop la boum, c'est le roi du macadam (aldus Maurice Chevalier)
@Onbekend: stel dat je B als klok gebruikt (laat die AND-poort maar even links liggen). Zodra B hoog wordt, genereert die een klokpuls met (A = 1) als richtingwijzer. Draai je nu terug de andere richting, dan wordt B laag, en wordt er geen klokpuls gegenereert. Dat gebeurt pas als je nog iets verder terugdraait, en B terug hoog wordt. Maar op dat ogenblik zal (A = 0) de andere richting uitwijzen.
@GJ_: Wist ik veel, dat die dingen ook een naam hadden... 
dat werkt inderdaad prima. maar je verliest de quadratuur oftewel de flankdetectie die een 4x zo hoge resolutie geeft. misschien bedoelt de TS dit?
fripster
Op 15 januari 2007 19:31:03 schreef pros:
@Onbekend: stel dat je B als klok gebruikt (laat die AND-poort maar even links liggen). Zodra B hoog wordt, genereert die een klokpuls met (A = 1) als richtingwijzer. Draai je nu terug de andere richting, dan wordt B laag, en wordt er geen klokpuls gegenereert. Dat gebeurt pas als je nog iets verder terugdraait, en B terug hoog wordt. Maar op dat ogenblik zal (A = 0) de andere richting uitwijzen.
Stel dat de encoder steeds tussen (A=1 en B=0) en (A=1 en B=1) staat te trillen. Volgens jou tekst zou hij alleen maar optellen en nooit aftellen......
@fripster: Het is inderdaad niet erg als ik de quadratuur verlies.
Op 15 januari 2007 19:31:03 schreef pros:
@GJ_: Wist ik veel, dat die dingen ook een naam hadden...
Niet officieel denk ik. Deze letters staan gewoon (zonder uitzondering?) bij de kanalen.
Als je er keer eentje ziet valt het natuurlijk niet direct op maar na tientallen of honderden keren begint het wel duidelijk te worden dat dit redelijk standaard is.
pros
Prosper, yop la boum, c'est le roi du macadam (aldus Maurice Chevalier)
Op 15 januari 2007 20:19:56 schreef Onbekend:
Stel dat de encoder steeds tussen (A=1 en B=0) en (A=1 en B=1) staat te trillen. Volgens jou tekst zou hij alleen maar optellen en nooit aftellen...
Zo had ik het nog niet bekeken. Je wil dus A inzetten, om uit te maken of een verandering op B als geldige klokpuls mag aanvaard worden? Een SR-flipflop is mogelijk een optie, door A met de set-ingang te verbinden, en B met de reset-ingang. Maar dan ga je misschien een telpuls verliezen bij het omkeren van de draairichting.
Even een voorbeeldje. Hier staat het schema en hier staat de simulatie . De eerste marker geeft aan dat bij iedere enable de richting van de teller hoog staat, terwijl iets verder het b kanaal gewijzigd is waardoor de richting moet veranderen en daar zie je dat de richting telkens laag is. Zie de 2de marker
De schakeling maakt gebruik van een externe klok. Dit is de enigste goede manier om zuiver en veilig te werken. De a en b kanalen zijn eerst gesynchroniseerd zodat de signalen stabiel zijn voor het verder verwerken en geen invloed hebben door het toevallig trillen juist op een van de flanken van de a of b kanalen.
Dat een FPGA duur zou zijn betwijfel ik nog want een EPM7032s kan alles bevatten, ook de volledige klok generatie, het tellen en zelfs nog eventueel verdere bewerkingen. Trouwens dit is getekend in Quartus, gecompileerd en gesimuleerd.
update: 8 bit teller bijgeplaatst inclusief reset van de teller.
Frans
pros
Prosper, yop la boum, c'est le roi du macadam (aldus Maurice Chevalier)
Ik probeer te bedenken waarom er --ter linkerzijde-- telkens 2 D-flipflops in serie staan, maar ik kom er niet uit. Synchronisatie? Is 1 stel D-ff's dan niet afdoende?
idd alle signalen moeten gesynchroniseed zijn. Je klok bepaald de max snelheid die je encoder aankant. Alle combinatorische waarden hebben dan voldoende tijd om stabiele resultaten weer te geven. Praktisch haal je dan ook heel hoge snelheden voor de encoder. En nogmaals, een FPGA bouwsteentje is uitermate geschikt voor dergelijke toepassingen. Soms worden heel veel encoders in 1 FPGA samengebracht.
Ik heb juist nog een 8 bit teller bijgeplaatst.
[Bericht gewijzigd door fotoopa op ]
Ik heb het schema getest met Digital Works, en het lijkt goed te werken.
Alleen de snelheid waarmee de richting wijzigt, vind ik vrij snel t.o. de klokpuls zelf.
Alles wordt altijd uitgedrukt in clockpulsen. Je mag eventueel de clock verlagen als je die extreeme snelheden niet nodig heb. Dan worden ook de richingspulsen breeder.
Ik bedoel de tijd die tussen de richting en de klok naar het teller IC toe zit. Ik vind die erg kort.
Maar ik zal verder testen met dit schema. In ieder geval bedankt. 