Autor Tema: dspic33 Encoder modo contador (solucionado)  (Leído 4388 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado rbpkirow

  • PIC10
  • *
  • Mensajes: 21
dspic33 Encoder modo contador (solucionado)
« en: 04 de Noviembre de 2011, 07:34:27 »
Hola a todos.
Tengo un automata basado en dspic33 y necesito saber si está en movimiento.
Para ello cuento con el encoder de cuadratura que tiene este dspic. Sin embargo, solo necesito saber si esta en movimiento, con lo cual con una fase del encoder es suficiente, ya que siempre se mueve en la misma direccion.
Tengo el siguiente codigo, pero solo me incrementa POS1CNT cuando el sensor me devuelve un flanco positivo o negativo (ahora no recuerdo) y yo necesito que incremente el POS1CNT en ambos flancos.
El codigo es para compilador Hi-tech
Código: [Seleccionar]
_TQCS = 1;
QEI1CONbits.CNTERR = 0;
QEI1CONbits.QEISIDL = 0;
QEI1CONbits.QEIM = 0b001;
QEI1CONbits.SWPAB = 1;
QEI1CONbits.PCDOUT = 0;
QEI1CONbits.TQGATE = 1;
QEI1CONbits.TQCKPS = 0;
QEI1CONbits.UPDN_SRC = 0;//1;
QEI1CONbits.UPDN = 0;//1;

POS1CNT = 0; // Cuando llegue a 1, salta la interrupcion porque POS1CNT = MAX1CNT
MAX1CNT = 0;

Alguien me puede decir como hacerlo?
muchas gracias
rbpkirow
« Última modificación: 08 de Noviembre de 2011, 09:45:05 por rbpkirow »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: dspic33 Encoder modo contador
« Respuesta #1 en: 04 de Noviembre de 2011, 14:43:17 »
Mmmmm.. si queres ver si se movio o no podrias ingresar una fase a una entrada q tenga un Input Change Notification (Aunque seria mejor ambas fases, por algun cambio de direccion), si es q lo tiene el dsPIC, al cambiar podrias activar para q te genere una interrupcion, para hacerlo con el QEI tendria q leer:


Código: [Seleccionar]
http://ww1.microchip.com/downloads/en/DeviceDoc/70208B.pdf
Disculpa estoy con poco tiempo para verlo, pero espero q te sirva. aunque no le veo sentido usar el QEI para ver un cambio nomas :S

Viendo la figura 15-10 del datasheet, creo q tiene q ser asi ese valor

Código: [Seleccionar]
QEI1CONbits.TQGATE = 0;
QEI1CONbits.UPDN = 1
QEI1CONbits.UPDN_SRC = 1

MAX1CNT = 1;


Supuestamente al llegar POS1CNT = MAX1CNT, segun la figura 15-10 del pdf q te pase, es la salida que habilita la interrupcion del QEI, luego al producirse la interrupcion el registro POS1CNT se hace igual a 0, si llega a ocurrir el caso de un underflow el valor q toma POS1CNT es el del MAX1CNT.

Ademas vas a tener q probar, ya que al haber swapeado ( alternado los valroes de la Fase A y Fase B) o sea puesto en 1 el bit SWPAB puede que lo que estes haciendo es decrementando en ves de incrementar, pero con el valor en 1 de MAX1CNT creo q no deberia haber problemas, en teoria xD.

El POS1CNT se incrementa de la siguiente forma:
Código: [Seleccionar]
as the Phase A signal leads the Phase B signal, the quadrature counter is
incremented on each edge. This condition Phase A (QEAx) signal leads the Phase B (QEBx)
signal is defined as the forward direction of motion.

Podes observar esto y el funcionamiento de lo que queres hacer en la figura 15-8

Espero q esto sulucione tu problema, yo hablo con solo lo que vi en el datasheet, y por que vi q nadie mas respondio a tu problema ^^ je :D
« Última modificación: 05 de Noviembre de 2011, 16:18:48 por KILLERJC »

Desconectado fram_22

  • PIC18
  • ****
  • Mensajes: 316
Re: dspic33 Encoder modo contador
« Respuesta #2 en: 06 de Noviembre de 2011, 19:01:44 »
Si solamente te interesa ver un canal y llever las cuentas de los pulsos, podrias utilizar una interrupcion externa o un temporizador confuente externa de reloj. Creo que seria mucho mas sencillo

Desconectado rbpkirow

  • PIC10
  • *
  • Mensajes: 21
Re: dspic33 Encoder modo contador
« Respuesta #3 en: 08 de Noviembre de 2011, 08:37:43 »
Hola.
Antes de nada, agradeceros las respuestas que me habeis brindado.

Por un lado, fram_22, efectivametne seria mucho mas sencillo hacerlo con una interrupcion externa, y cada flanco se activa la interrupcion. El problema que tengo es que el hardware es fijo, y la señal de contado está fijada en la phase A del encoder. De ahí que necesite el encoder en modo contador.

Por otro lado, voy a estudiar el datasheed que me adjuntas KILLERJC y probar a ver con los valores que me indicas.

Muchas gracias de nuevo a ambos.
un saludo

Desconectado rbpkirow

  • PIC10
  • *
  • Mensajes: 21
Re: dspic33 Encoder modo contador
« Respuesta #4 en: 08 de Noviembre de 2011, 09:43:04 »
Hola de nuevo.
Una vez visto el datasheet que me indicó KILLERJC, y estudiando la grafica 15.7, he conseguido que se me active la interrupcion a cada flanco de la fase A.
Para ello tengo el siguiente codigo, por si alguien en un futuro esta interesado en esto mismo:

Código: [Seleccionar]
_TQCS = 1;
QEI1CONbits.CNTERR = 0;
QEI1CONbits.QEISIDL = 0;
QEI1CONbits.QEIM = 0b101; // Modo contador x2
QEI1CONbits.SWPAB = 1;
QEI1CONbits.PCDOUT = 0;
QEI1CONbits.TQGATE = 1;
QEI1CONbits.TQCKPS = 0;
QEI1CONbits.UPDN_SRC = 0;
QEI1CONbits.UPDN = 1;

POS1CNT = 0; // Cuando llegue a 1, salta la interrupcion porque POS1CNT = MAX1CNT
MAX1CNT = 0;


Un saludo
Muchas gracias

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: dspic33 Encoder modo contador (solucionado)
« Respuesta #5 en: 10 de Noviembre de 2011, 05:17:10 »
Es casi como el q pasaste antes.

Nomas q lo configuraste para que de un reset cuando haiga un rollover o un underflow con respecto al MAX1CNT. Lo que si, creo q algunos bits pueden estar de mas, tendrias q probarlos.

Citar
When configured for QEI mode, the TQGATE, TQCKPS, TQCS and UDSRC bits are ignored.

Todos esos es sin sentido setearlos y el bit UPDN tambien creo, ya que no interesa la direccion, ya que la interrupcion es generada para ambos lados.

Ojala lo pruebes y me digas, que quiero sacarme esa duda, de todas formas, me alegro q te haya servido,  y gracias por tomarte el tiempo de postear la solucion.

Desconectado rbpkirow

  • PIC10
  • *
  • Mensajes: 21
Re: dspic33 Encoder modo contador (solucionado)
« Respuesta #6 en: 11 de Noviembre de 2011, 05:14:29 »
Es casi como el q pasaste antes.

Nomas q lo configuraste para que de un reset cuando haiga un rollover o un underflow con respecto al MAX1CNT. Lo que si, creo q algunos bits pueden estar de mas, tendrias q probarlos.

Citar
When configured for QEI mode, the TQGATE, TQCKPS, TQCS and UDSRC bits are ignored.

Todos esos es sin sentido setearlos y el bit UPDN tambien creo, ya que no interesa la direccion, ya que la interrupcion es generada para ambos lados.

Ojala lo pruebes y me digas, que quiero sacarme esa duda, de todas formas, me alegro q te haya servido,  y gracias por tomarte el tiempo de postear la solucion.


hola KILLERJC.
He estado probando lo que me comentas, y efectivamente los bits TQGATE, TQCKPS, TQCS y UDSRC pueden quitarse de la configuracion y seguir funcionando correctamente.
El bit UPDN, segun el datasheet es de solo lectura cuando se configura en modo QEI, pero al probar me ocurre lo siguiente:
Si se fija a 1, la interrupcion salta tanto en flanco positivo como en negativo
al no fijar ningun dato, la interrupcion salta en ambos flancos, con la diferencia de que el primer flanco debe ser un flanco positivo, es decir, que si el primer flanco que tienes es negativo, no te lo va a contar y tendras un contador con error.
Asi que yo este bit no le quitaría, aunque en el datasheet ponga que es de solo lectura.

un saludo

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: dspic33 Encoder modo contador (solucionado)
« Respuesta #7 en: 12 de Noviembre de 2011, 04:36:56 »
Muchas gracias por tomarte el tiempo y probar lo que te pedi rbpkirow.