Autor Tema: Contar pulsos PWM  (Leído 8615 veces)

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

Desconectado Bertukoo

  • PIC10
  • *
  • Mensajes: 8
Contar pulsos PWM
« en: 28 de Noviembre de 2013, 19:23:08 »
Hola, es el primer tema que abro ya que no encontré solución a lo que quiero hacer, he mirado por casi todos lados pero no encuentro nada, os comento, me pidieron si podía hacer un programa para un pic que simulara los pulsos de un sensor CKP,  al parecer este sensor le indica a la centralita de los coches en que posición se encuentra el cigüeñal. Me dijeron que funciona de la siguiente manera, el sensor va leyendo los dientes de la corona, esta tiene 60 dientes + 2 que están ciegos, por lo tanto el sensor no los lee.


     

Esto no es exactamente así cuadrada pero funcionaría igual.

Yo quería usar la instrucción HPWM para generar los pulsos, pero no se como hacer para contar los pulsos que salen del pic para que al llegar a los 60 cambiar el HPWM por 2 pulsos con el dutty a 0, he leido por ahí que el pic usa el timer 2 para hacer la señal PWM, por cierto el pic que estoy usando es el 16f877a.



Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: Contar pulsos PWM
« Respuesta #1 en: 28 de Noviembre de 2013, 19:57:58 »
Utilizar el modulo Pwm para eso es complicase la vida, mira, están simple como esto:

'Define SIMULATION_WAITMS_VALUE = 1  'Activar para simulación
AllDigital  'Todos los pin digitales
TRISB.0 = 0  'Pin como salida
WaitMs 500  'Tiempo de espera para inicio
Dim x As Word
main:
   For x = 1 To 60  'Pulsos On/Off
      RB0 = 1  'Pin de salida a 1
      WaitUs 50  'Ancho señal alta, 50uSeg.
      RB0 = 0  'Pin de salida a 0
      WaitUs 50  'Ancho señal bajo, 50uSeg.
   Next x
   RB0 = 0  'Pin de salida
   WaitUs 100  'Doble ancho bajo, 100uSeg.
Goto main  'Vuelta a empezar
End  
« Última modificación: 28 de Noviembre de 2013, 20:07:15 por dogflu66 »
Saludos desde Granada, España.

Desconectado Bertukoo

  • PIC10
  • *
  • Mensajes: 8
Re: Contar pulsos PWM
« Respuesta #2 en: 28 de Noviembre de 2013, 20:07:31 »
Correcto, así era como lo tenía al principio, de hecho es la solución que tenía por si no me salía lo del PWM, pero más que nada quería saberlo para aprender a manejar el PWM con interrupciones, si es posible claro

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: Contar pulsos PWM
« Respuesta #3 en: 28 de Noviembre de 2013, 21:25:06 »
El modulo Pwm es para gestión de potencia y generación de frecuencias, todo esto sin que intervenga el microcontrolador, no es para lo que quieres hacer, de todas maneras no quiero desanimarte porque puedo estar equivocado, quedo por el hilo por si a alguien se le ocurre como poder controlar el modulo Pwm con tanta precisión.
Saludos desde Granada, España.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5883
    • Picuino
Re: Contar pulsos PWM
« Respuesta #4 en: 29 de Noviembre de 2013, 07:22:13 »
Se me ocurre que puedes utilizar la interrupción del Timer2 para contar los pulsos y apagar la salida PWM durante dos ciclos una vez que hayas contado 60.
No parece difícil.
Suponiendo que el motor está a 3000rpm, la frecuencia del PWM será de 50*60 = 3000 Hz
Esta es una frecuencia bastante baja para el microcontrolador y se pueden controlar los pulsos individuales mediante interrupciones sin problemas.

Saludos.

Desconectado Bertukoo

  • PIC10
  • *
  • Mensajes: 8
Re: Contar pulsos PWM
« Respuesta #5 en: 29 de Noviembre de 2013, 18:26:32 »
Bien, entonces si que se puede hacer de esa forma, ahora el problema es que no tengo mucha idea que como usar las interrupciones, por eso mi insistencia en hacerlo de esta forma, si hay algún alma caritativa que me pueda iluminar en el uso de la interrupción del timer2 se lo agradecería mucho.

He visto códigos de interrupciones pero tampoco los entiendo muy bien.

Y por cierto, gracias por vuestras respuestas :)

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: Contar pulsos PWM
« Respuesta #6 en: 30 de Noviembre de 2013, 08:41:12 »
Según el datasheet el modulo CCP trabajando en modo Pwm acapara el Timer2, por lo que entiendo que no se podria utilizar para eso, se tendria que utilizar otro timer.
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: Contar pulsos PWM
« Respuesta #7 en: 30 de Noviembre de 2013, 08:58:53 »
Para activar las interrupción de algún modulo del pic, se procede en la mayoría de las veces de la misma manera. Se activa el flag que permite las interrupciones generales, se activa el flag que permite las interrupciones de periféricos y se activa el flag que permite la interrupción del modulo deseado. Después se configura el modulo timer para que cuente según lo deseado, cuando el modulo timer se desborda, esto es, cuando su contador interno llega al valor máximo se activa el flag de desborde y se genera el salto a la función de gestión de interrupciones preestablecida, se gestiona la interrupción y se borra el flag de desborde ya sea a mano o si el lenguaje lo realiza de forma automática. Exactamente con un ejemplo es casi imposible porque no hay dos lenguajes o dialectos que lleven esta tarea de la misma forma.
Saludos desde Granada, España.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5883
    • Picuino
Re: Contar pulsos PWM
« Respuesta #8 en: 02 de Diciembre de 2013, 06:00:26 »
Según el datasheet el modulo CCP trabajando en modo Pwm acapara el Timer2, por lo que entiendo que no se podria utilizar para eso, se tendria que utilizar otro timer.

Se pueden utilizar las interrupciones del Timer2 para contar los pulsos. Cada interrupción es un pulso PWM.
Saludos.

Desconectado ppyote

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 929
Re: Contar pulsos PWM
« Respuesta #9 en: 02 de Diciembre de 2013, 07:06:50 »
Según el datasheet el modulo CCP trabajando en modo Pwm acapara el Timer2, por lo que entiendo que no se podria utilizar para eso, se tendria que utilizar otro timer.

Se pueden utilizar las interrupciones del Timer2 para contar los pulsos. Cada interrupción es un pulso PWM.
Saludos.

yo me hago una pregunta...pero como evitar los 2 pulsos después? poniendo el duty a 0 contar 2 desbordes y volver al mismo % del duty?
PPyote... siempre estareis en mi corazon.... Te quiero Hermano...

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Contar pulsos PWM
« Respuesta #10 en: 02 de Diciembre de 2013, 15:28:48 »
configuras el duty al 50%
configuras el Timer2 para que interrumpa luego de 15 pulsos de PWM,
cuentas 4 interrupciones de esas( 15 * 4 = 60 pulsos PWM).
En la 4ta interr, cambias el duty al 0% y cambias el Timer2 para que interrumpa luego de 2 pulsos PWM.
repites este ciclo.

Saludos!
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado miquel

  • PIC12
  • **
  • Mensajes: 69
Re: Contar pulsos PWM
« Respuesta #11 en: 02 de Diciembre de 2013, 16:59:03 »
Hola Bertukoo!

Siento no poder ayudarte con el Basic, pero aquí tienes un código en CCS que creo te puede ayudar.
Código: [Seleccionar]

#define PIN_SALIDA    PIN_xx   // elige el PIN que quieras

int16 Periodo=1000;                 //Calcular los ticks necesarios para el periodo necesario
int8 Ancho=50;                         //Por ejemplo 50us de anchura de impulso


#int_TIMER1
void  TIMER1_isr(void)
{
static int8 Cnt=0;
set_timer1(Periodo);
Cnt++;
if (Cnt < 61)
   {
   Output_High(PIN_SALIDA);
   Delay_us(Ancho);
   Output_Low(PIN_SALIDA)
   }
if (Cnt = 62) Cnt=0;
}


El código es muy sencillo con la variable Periodo regulas el periodo (rpm) y con Ancho la anchura de cada impulso.

Saludos,

Miquel


Desconectado Bertukoo

  • PIC10
  • *
  • Mensajes: 8
Re: Contar pulsos PWM
« Respuesta #12 en: 03 de Diciembre de 2013, 03:41:00 »
Muchísimas gracias a todos por vuestros comentarios, esta mañana probaré tanto los códigos como la teoría que me enseñasteis y ya os contaré que problemas surgen, si es que aparece alguno claro.

Saludos!! :)

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: Contar pulsos PWM
« Respuesta #13 en: 04 de Diciembre de 2013, 11:44:55 »
He realizado unas pruebas contando 60 ciclos empleando las interrupciones del Timer2 y, por muy rápido que pare el modulo CCP, siempre tengo un pulso positivo de más, con un ancho de 41uSeg. trabajando a 8Mhz de reloj. La frecuencia del PWM es de 500Hz. Dejo el codigo por si les sirve.

Código: [Seleccionar]
'Define CONFIG = 0x2f42
'Define CONFIG2 = 0x3ffc
'Define CLOCK_FREQUENCY = 20  'Oscilador a 20Mhz
'**********************************************************************************
'Generando pulso con el modulo CCP1 configurado en modo PWM
'Placa PicEBasic, By COS, 04/12/2013
'Basic Pic Simulator IDE (PSI), v6.95_10, Pic16F88
'**********************************************************************************
'----------------------------------------------------------------------------------
Define CONF_WORD = 0x2f50
Define CONF_WORD_2 = 0x3ffc
Define CLOCK_FREQUENCY = 8  'Oscilador a 8Mhz
'Define SIMULATION_WAITMS_VALUE = 1  'Activar para simulación
'-----------------------------------------
Call _setupebasic()  'Inicializa la placa entrenadora PicEBasic.
Hseropen 38400  'Inicializa puerto RS232 por hardware a 38400Baudios
Lcdinit  'Inicializa el LCD sin cursor
WaitMs 100  'Pausa de 100 mSeg.
Lcdout "CCP1 en modo PWM"  'Imprime el texto en el LCD
WaitMs 2000  'Pausa de 2 Seg.
'-----------------------------------------
Dim contador As Word
contador = 0
voidmain:
Dim main As Byte
Symbol _pinccp1 = RB3
ConfigPin _pinccp1 = Output  'Pin como salida
_pinccp1 = 0

Call _setup_timer2(_tmr2_div16, 250, 1)  '500Hz a 8Mhz
Call _setup_ccp1(_ccp_pwm)
Call _set_pwm1_duty(498)  'Maximo 996, minimo 0
Call _enable_interrupts(_global)
Call _enable_interrupts(_int_timer2)

Dim pwm1 As Word
pwm1 = 498  '50%

While main = main
Call _set_pwm1_duty(pwm1)
Hserout #contador, CrLf
Wend
End                                              
'Bibliotecas usadas:
Include "_ProcSetUpEBasic.bas"
Include "_FuncionesGeneralLibrary.bas"
'********************************************************************
'Gestión interrupciones
On Interrupt
Save System
If _tmr2if = True Then
contador = contador + 1
If contador > 60 Then
Call _setup_ccp1(_ccp_off)
Call _disable_interrupts(_int_timer2)
Endif
_tmr2if = False
Endif
Resume
« Última modificación: 04 de Diciembre de 2013, 11:53:36 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: Contar pulsos PWM
« Respuesta #14 en: 11 de Diciembre de 2013, 09:26:53 »
Parece que el tema ha quedado aparcado, pues después de la pruebas actualizo parte de mi opinión inicial, se pueden contar los ciclos que genera el modulo ccp mediante las interrupciones del timer2, siempre que la frecuencia generada sea suficientemente lenta para que el microcontrolador tenga tiempo suficiente de actualizar el contador de ciclos sin que se le solapen. Pero lo que es el control real de los ciclos mediante la parada del modulo; pues las pruebas realizadas me indican que no se obtiene un control efectivo, ya que siempre el modulo vuelve a generar un pulso a On antes de que logre pararlo. Este pulso me varia de 15 a 41uSeg. trabajando a 500Hz y con una frecuencia de reloj de 8Mhz. Ahora, si el equipo externo que responde a estos pulsos es lento puede que un pulso tan corto no le afecte.
Saludos desde Granada, España.