On Sunday, 10 July 2016 20:41:01 UTC+1, Marius Alksnys wrote:
>
> Should this feature work? If so - what special thing should I
> know? Encoder works right except for index. Where should index
> pin be connected? I connected it to eQEP index pin.
>
>
> ----Android NewsGroup Reader----
> http://usenet.sinaapp.com/
>
>
I hit the same problem. I'm running with kernel:
simonj@beaglebone:~$ uname -a
Linux beaglebone 3.8.13-xenomai-r78 #1 Sat Sep 26 17:07:01 UTC 2015 armv7l
GNU/Linux
The cause is a clash with the active kernel QEP driver. The HAL driver
relies on seeing the IEL index event latch interrupt flag but the kernel
driver interrupt handler clears this. Depending on timing, it occasionally
works, with a 100us update thread, the HAL driver detected the index pulse
about one in ten times.
I guess the cleanest solution would be to disable the kernel QEP driver but
I couldn't see an easy way to do this, and I'm not set up to rebuild the
kernel at the moment, so I did a quick and dirty hack to the HAL driver:
*diff --git a/src/hal/drivers/hal_arm335xQEP.c
b/src/hal/drivers/hal_arm335xQEP.c*
*index 39a9e67..7cebd61 100644*
*--- a/src/hal/drivers/hal_arm335xQEP.c*
*+++ b/src/hal/drivers/hal_arm335xQEP.c*
@@ -211,9 +211,19 @@ static void update(void *arg, long period)
eqep->raw_count = eqep->eqep_reg->QPOSCNT;
iflg = eqep->eqep_reg->QFLG & EQEP_INTERRUPT_MASK;
- /* check if an index event has occured */
- if( *(eqep->index_ena) && (iflg & IEL)) {
- eqep->index_count = eqep->eqep_reg->QPOSILAT;
+ // See if the latched position has changed, indicating that an
index
+ // event has happened. Can't rely on interrupt flags because kernel
+ // driver captures and clears it
+ hal_s32_t latched_count = eqep->eqep_reg->QPOSILAT;
+ hal_bit_t index_flag = 0;
+ if (eqep->old_latched_count != latched_count)
+ {
+ index_flag = 1;
+ eqep->old_latched_count = latched_count;
+ }
+ if( *(eqep->index_ena) && index_flag) {
+ rtapi_print("QEP index triggered %d %d\n",eqep->index_count,
latched_count);
+ eqep->index_count = latched_count;
*(eqep->index_ena) = 0;
}
@@ -436,6 +446,8 @@ static int setup_eQEP(eqep_t *eqep)
eqep->eqep_reg->QCAPCTL = 0u; // reset to prevent prescaler problems
eqep->eqep_reg->QCAPCTL |= CEN; // enable eQEP capture
+ eqep->old_latched_count = eqep->eqep_reg->QPOSILAT;
+
rtapi_print("%s: REVID = %#x\n",modname, eqep->eqep_reg->QREVID);
return 0;
}
*diff --git a/src/hal/drivers/hal_arm335xQEP.h
b/src/hal/drivers/hal_arm335xQEP.h*
*index 8341d57..e727e15 100644*
*--- a/src/hal/drivers/hal_arm335xQEP.h*
*+++ b/src/hal/drivers/hal_arm335xQEP.h*
@@ -100,6 +100,7 @@ typedef struct {
hal_s32_t raw_count;
hal_u32_t timestamp;
hal_s32_t index_count;
+ hal_s32_t old_latched_count;
hal_s32_t counts_since_timeout;
hal_bit_t *index_ena;
This seems to work, but corner cases not really tested or even thought
about.
Simon
--
website: http://www.machinekit.io blog: http://blog.machinekit.io github:
https://github.com/machinekit
---
You received this message because you are subscribed to the Google Groups
"Machinekit" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
Visit this group at https://groups.google.com/group/machinekit.
For more options, visit https://groups.google.com/d/optout.