TODOPIC
Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: Bertukoo 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.
(http://img11.imageshack.us/img11/525/o1p4.png)
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.
-
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
-
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
-
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.
-
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.
-
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 :)
-
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.
-
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.
-
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.
-
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?
-
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!
-
Hola Bertukoo!
Siento no poder ayudarte con el Basic, pero aquí tienes un código en CCS que creo te puede ayudar.
#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
-
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!! :)
-
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.
'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
-
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.
-
El problema está en que la interrupción se genera al comenzar el pulso. Por muy rápido que respondas, siempre se activará la salida PWM durante un tiempo.
Para evitar este problema, tienes que esperar a que el último pulso termine y entonces poner el registro CCPRxL a cero.
La interrupción TMR2IF se activa al comenzar el pulso PWM, pero no hay interrupción al finalizar el pulso. Tendrás que comprobarlo con Pooling.
Saludos.
-
Hola amigos,
Estoy aprendiendo poco a poco en esto de programar PIC en PBP , y temas de entradas y salidas digitales, mas o menos lo controlo (al menos lo básico).
Me gustaria en un 16f88, o un 16f628a si es posible tener una entrada analogica con un potenciometro entre 0 y 5v, y una salida PWM para poder controlar un servomotor que varie su posicion segun el valor del potenciometro.
e estado pensando el asunto y e visto q el funcionamiento de un joystick es algo parecido y me gustaria intentarlo asi que si me podrian ayudar estaria agradecido
Me podeis orientar un poco sobre como diseñar el programa.
Gracias!!!! ...
-
Hola amigos,
Estoy aprendiendo poco a poco en esto de programar PIC en PBP , y temas de entradas y salidas digitales, mas o menos lo controlo (al menos lo básico).
Me gustaria en un 16f88, o un 16f628a si es posible tener una entrada analogica con un potenciometro entre 0 y 5v, y una salida PWM para poder controlar un servomotor que varie su posicion segun el valor del potenciometro.
e estado pensando el asunto y e visto q el funcionamiento de un joystick es algo parecido y me gustaria intentarlo asi que si me podrian ayudar estaria agradecido
Me podeis orientar un poco sobre como diseñar el programa.
Gracias!!!! ...
Hola...Deberías abrir un tema nuevo ya que no se trata de "contar pulsos PWM"...
Los PIC son diferentes y el 88 tiene ADC pero el 628 no así que en uno deberías usar el comando "ADCIN" y en el que no tiene ADC, el comando que te puede "salvar" es el "POT"...en ambos para la salida puedes usar la instrucción "PWM" y sí el pic tiene modulo PWM integrado puedes usar HPWM....Revisa la ayuda que viene en el PBP para tal caso para así poder aprender como se usan dichos comando.
Saludos.-
Ric.