TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: robotic en 25 de Septiembre de 2010, 18:07:51

Título: como variar la velocidad de un motor DC de proteus a través de labview
Publicado por: robotic en 25 de Septiembre de 2010, 18:07:51
Hola amigos del foro hoy intentare hacer un pwm a traves de labview, espero que todos aportemos a esta idea ya que yo no lo puedo hacer solo, pero esi si me dare el tiempo de ir probando sus ideas he ir desarrolando este proyecto que quedara de material de estudio para futuros novatos como yo que intenta saber como se hacen las cosas.

bueno sin mas preambulo aca va el codigo en c con el que vamos a trabajar  usando el compilador ccs

****************************************************
#include <motorpwm.h>
#int_RDA
void  RDA_isr(void)
{

}


void main()
{

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_CLOCK_DIV_2);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_ccp1(CCP_OFF);
   setup_comparator(NC_NC_NC_NC);
   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);

   //TODO: User Code

}
******************************************************
y el .h
***************************************************
#include <16F877A.h>
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES XT                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected

#use delay(clock=4000000)
*************************************************************************
aca va la imagen de proteus con labview en su funcionamiento como verán le estoy enviando un 1 con el dial de labview y el virtual terminal me esta leyendo el 1, pero no varia la velocidad aun.
(http://s2.subirimagenes.com/otros/5249142dibujo.jpg)
Título: Re: como variar la velocidad de un motor DC de proteus a través de labview
Publicado por: robotic en 25 de Septiembre de 2010, 21:52:14
bueno y la pregunta es que código en el compiler ccs se debe colocar para hacer que los números que recibe el puerto serial los utilice el pic y los transforme a pulsos PWM para hacer mover el motor....
me han dicho que hay que configurar la salida CCP1 y darle el ciclo de trabajo. pero como se hace eso? :-/
Título: Re: como variar la velocidad de un motor DC de proteus a través de labview
Publicado por: Suky en 25 de Septiembre de 2010, 22:32:26
Para configurar el módulo CCP:

setup_ccp1(CCP_PWM);

Para setear la frecuencia:

setup_timer_2(T2_DIV_BY_1, .......

Para setear el ciclo de trabajo:

set_pwm1_duty(Valor); 

El rango de Valor depende de la frecuencia elegida.

Buscar en ayuda de CCS para más ejemplos, y dentro del foro, hay hilos con ejemplos y dudas sobre la configuración.


Saludos!
Título: Re: como variar la velocidad de un motor DC de proteus a través de labview
Publicado por: robotic en 25 de Septiembre de 2010, 22:48:42

Buscar en ayuda de CCS para más ejemplos, y dentro del foro, hay hilos con ejemplos y dudas sobre la configuración.

vale gracias por contestar, buscare en la ayuda del ccs donde salen los ejemplos como este que sale en el set_pwm1_duty( )


// For a 20 mhz clock, 1.2 khz frequency,

// t2DIV set to 16, PR2 set to 200

// the following sets the duty to 50% (or 416 us).

 

long duty;

 

duty = 408; // [408/(4*(200+1))]=0.5=50%

set_pwm1_duty(duty);

y buscare que es esto del duty porque por lo que veo contiene la formula para el ciclo del pwm.
Título: Re: como variar la velocidad de un motor DC de proteus a través de labview
Publicado por: robotic en 25 de Septiembre de 2010, 23:11:52
hice esto
#include <proyecto_pwm.h>
#int_RDA
int8 valor;
void  RDA_isr(void)
{
setup_ccp1(CCP_PWM);
setup_timer_2 ( T2_DIV_BY_4, 0xc0, 2);
set_pwm1_duty(valor);
valor = 408; // [408/(4*(200+1))]=0.5=50%
set_pwm1_duty(valor);
}

pero aun no varia la velocidad del motor...
Título: Re: como variar la velocidad de un motor DC de proteus a través de labview
Publicado por: Suky en 25 de Septiembre de 2010, 23:32:22
Primero que nada las configuraciones como:

setup_ccp1(CCP_PWM);
setup_timer_2 ( T2_DIV_BY_4, 0xc0, 2);

Deberían ir en la inicialización del microcontrolador.

Ahora, que frecuencia de PWM fijaste en ese ejemplo?
Título: Re: como variar la velocidad de un motor DC de proteus a través de labview
Publicado por: Suky en 25 de Septiembre de 2010, 23:36:23
Más info:

http://www.todopic.com.ar/foros/index.php?topic=30740.msg257051#msg257051

Título: Re: como variar la velocidad de un motor DC de proteus a través de labview
Publicado por: robotic en 26 de Septiembre de 2010, 14:13:50
en el ccs tengo entendido que se puede configurar la frecuencia en other, alguien me lo podria explicar porfavor ya que esto me esta complicando la existencia y aun lo logro hacer correr ese simpático motor DC.

(http://s2.subirimagenes.com/otros/5253794ccs.jpg)
Título: Re: como variar la velocidad de un motor DC de proteus a través de labview
Publicado por: Suky en 26 de Septiembre de 2010, 14:23:12
Pero, leíste el datasheet o los hilos que hay en el foro? Como se establece la frecuencia? Hay un timer que funciona como base para establecer la frecuencia?

Hay alguna ecuación para determinar su valor?
Título: Re: como variar la velocidad de un motor DC de proteus a través de labview
Publicado por: robotic en 26 de Septiembre de 2010, 14:46:13
Pero, leíste el datasheet o los hilos que hay en el foro? Como se establece la frecuencia? Hay un timer que funciona como base para establecer la frecuencia?

Hay alguna ecuación para determinar su valor?
por mas que leo aun no logro entender todo esto de los timer y el pwm (no habrá algún tutorial por ahí) aparte que se me complica porque tiene que leer el 1 el 2, 3, 4, 5, 6, 7, 8, 9 que viene de labview y eso transformarlo por ejemplo, no se si estaré en lo correcto pero me imagino que debe ser asi:

1 = 100 mhz
2 = 200 mhz
3 = 300 mhz
4 = 400 mhz
5 = 500 mhz
6 = 600 mhz
7 = 700 mhz
8 = 800 mhz
9 = 900 mhz

Título: Re: como variar la velocidad de un motor DC de proteus a través de labview
Publicado por: Suky en 26 de Septiembre de 2010, 16:03:17
Pero entonces vamos por lo más básico. Como funciona un timer? Que cuenta? Cual es el valor máximo que podemos contar?
Título: Re: como variar la velocidad de un motor DC de proteus a través de labview
Publicado por: robotic en 26 de Septiembre de 2010, 16:48:38
Pero entonces vamos por lo más básico. Como funciona un timer? Que cuenta? Cual es el valor máximo que podemos contar?
esto lo saque del video de un amigo de españa y lo transcribo aca...

el pic16f877a  tiene

timer 0 de 8 bits
timer 1 de 16 bits
timer 2 de 8 bits

los timer se pueden usar como contadores y como timer
por ejemplo podemos contar pulsos que entran a una pata del oscilador.

El timer es básicamente un registro que dependerá del numero de bits que tardara en llenarse por ejemplo si es de 16 bits podemos contar 2 elevado a 16 pulsos que contando con el cero podríamos llegar a 65535   y si es de 8 bits podríamos llegar desde 0 hasta los 255

osea que si lo usamos como contador podríamos contar con el timer 1, contar hasta 65535 pulsos sin desbordarse.
al timer le podemos implementar muchas funciones como por ejemplo contar revoluciones, o contar el numero de pulsaciones con un botón.

el timer 1 contiene un pre escalador osea que si le colocamos en el pre escalador un 2, en ves de contar cada ves que le llegue un pulso de reloj contara cada 2 pulsos de reloj, si ponemos un pre escalador de 4 contara cada 4 pulsos de reloj, osea aumenta el tiempo en que tarda en llenarse el timer, si ponemos un pre escalador de 4 tardara 4 veces mas que si no lo ponemos, nos sirve para contar tiempos mas largos y el problema de este es que disminuimos la resolución.

el pic en ves de funcionar directamente a la frecuencia de reloj que le estamos inyectando, va a funcionar a 1/4 la frecuencia de reloj que le estamos inyectando, osea que si tenemos 4 mhz de reloj de entrada la frecuencia de funcionamiento del reloj del pic va a ser de 1 mhz, osea que el tiempo  entre pulso y pulso es de 1 us (1mhz = 1us) porque la inversa de 1mhz es 1us.
 



Título: Re: como variar la velocidad de un motor DC de proteus a través de labview
Publicado por: robotic en 26 de Septiembre de 2010, 16:50:16
que mas necesito saber?
Título: Re: como variar la velocidad de un motor DC de proteus a través de labview
Publicado por: Suky en 26 de Septiembre de 2010, 17:31:27
Bien! Ahora, para fijar la frecuencia de la señal PWM se utiliza el timer2 contando el ciclo interno del microcontrolador. Junto a PR2 y su pre-escaler se determina el periodo de la señal PWM. Y como la frecuencia es 1/Periodo podemos determinar este valor.

Ahora, a que frecuencia deseas tu PWM? Y como sería la configuración del Timer2 para ese caso?

Por aquí (http://www.todopic.com.ar/foros/index.php?topic=24720.msg207737#msg207737) más info de PWM.


Saludos!
Título: Re: como variar la velocidad de un motor DC de proteus a través de labview
Publicado por: robotic en 26 de Septiembre de 2010, 17:41:32
Bien! Ahora, para fijar la frecuencia de la señal PWM se utiliza el timer2 contando el ciclo interno del microcontrolador. Junto a PR2 y su pre-escaler se determina el periodo de la señal PWM. Y como la frecuencia es 1/Periodo podemos determinar este valor.

Ahora, a que frecuencia deseas tu PWM? Y como sería la configuración del Timer2 para ese caso?

Por aquí (http://www.todopic.com.ar/foros/index.php?topic=24720.msg207737#msg207737) más info de PWM.


Saludos!
gracias, voy a leer la pagina que me enviaste...
en realidad la frecuencia que quiero para el motor no la se, porque solo habia hecho funcionar el motor variando su voltaje con un potenciometro, no se cuanta es la frecuencia que necesita un motor de 12 volt de 60 rpm? espero me puedas orientar en esto...
Título: Re: como variar la velocidad de un motor DC de proteus a través de labview
Publicado por: Suky en 26 de Septiembre de 2010, 18:34:09
Por lo que tengo entendido se utiliza 1kHz.


Saludos!
Título: Re: como variar la velocidad de un motor DC de proteus a través de labview
Publicado por: robotic en 26 de Septiembre de 2010, 19:14:59
Por lo que tengo entendido se utiliza 1kHz.

entonces se debe Generar de una onda cuadrada de 1Khz. El periodo es T=1/1Khz = 1ms
Durante 0.5ms la señal estara a 1 y durante 0.5ms a 0, por tanto hay que hacer que el temporizador se desborde cada 0.5ms.

 La formula general para obtener una duración en micro-segundos es:                                                                     
     
 TMR0 = 256 - round[ FOSC(Mhz)*Dur(us)/(4*DIV) ];                   
  donde:                                                                   
  -FOSC es la frecuencia del cristal de cuarzo en Mhz.   
  -DIV = Valor del divisor para el prescaler. Puede ser 2,4,8,16,32,64,128,256                                                     
  -Dur = Duracion en micro-segundos

RESULTADO:                                                               
 Para obtener una señal de 1Khz asignamos los siguientes valores:     
 Divisor: 16 --> PS2=0, PS1=1, PS0=1        ¿que quiere decir esto?                           
 TMR0 = 100                                              ¿que quiere decir esto?

voy bien o no?
Título: Re: como variar la velocidad de un motor DC de proteus a través de labview
Publicado por: Suky en 26 de Septiembre de 2010, 19:48:21
No. ¿Porque el timer0? La base del PWM es el timer2. Primero se establece la frecuencia con el timer 2, entonces debes calcular para que de 1ms (Después, para variar la tensión sobre el motor se cambia el ciclo de trabajo). En el datasheet está la siguiente formula (Tosc=1/Fosc ):
Título: Re: como variar la velocidad de un motor DC de proteus a través de labview
Publicado por: robotic en 26 de Septiembre de 2010, 20:17:03
encontre esto que podria servir para calcular el 1ms en el timer 2
http://www.micro-examples.com/public/microex-navig/doc/097-pwm-calculator.html
Título: Re: como variar la velocidad de un motor DC de proteus a través de labview
Publicado por: robotic en 26 de Septiembre de 2010, 20:51:00
voy entendiendo un poco mas

para calcular 1 KHZ se hace esta formula

PWM Period = [(PR2)+ 1]•4•TOSC •(TMR2 Prescale Value)

esto nos sirve para saber el PR2 que es el registro del periodo para la frecuencia
Con 4:
PR2= [(4MHz)/(1KHz)*(4)*(4)]-1

PR2=249

Con 4 sirve.

Tosc = 1/Fosc =  1/4mhz =  250

TMR2 prescale value = 4


PWM Period = [(PR2)+ 1]•4•TOSC •(TMR2 Prescale Value)
PWM Period = [(249)+ 1]•4•250 •(4)=1000000


estaría esto bien?
Título: Re: como variar la velocidad de un motor DC de proteus a través de labview
Publicado por: robotic en 26 de Septiembre de 2010, 22:35:18
La base de tiempos es el Timer2 más dos bits adicionales para tener los 10.
El periodo se determina con el registro PR2, ya que cuando TMR2=PR2:
Se borra el TMR2
Se pone a “1” el pin CCP1
Se pasa el valor del CCPR1L al CCPR1H (para evitar glitch)

(http://img23.imageshack.us/img23/5449/ccp6283.jpg)
Título: Re: como variar la velocidad de un motor DC de proteus a través de labview
Publicado por: robotic en 26 de Septiembre de 2010, 23:20:20
y si todo fuera asi como lo he hecho, como tendria que decirle al compilador que cuando el labview me envie un numero por el dial me cambie la frecuencia de salida?

1 = 100 mhz
2 = 200 mhz
3 = 300 mhz
4 = 400 mhz
5 = 500 mhz
6 = 600 mhz
7 = 700 mhz
8 = 800 mhz
9 = 900 mhz
Título: Re: como variar la velocidad de un motor DC de proteus a través de labview
Publicado por: Suky en 27 de Septiembre de 2010, 00:06:02
Y al final como es la sentencia para fijar la frecuencia? Veo que hiciste un Copy&Paste de los hilos, pero ningun razonamiento  :?
Título: Re: como variar la velocidad de un motor DC de proteus a través de labview
Publicado por: robotic en 27 de Septiembre de 2010, 00:11:32
Y al final como es la sentencia para fijar la frecuencia? Veo que hiciste un Copy&Paste de los hilos, pero ningun razonamiento  :?
esta es la formula de la frecuencia que saque, la que me mandaste en una imagen

PWM Period = [(PR2)+ 1]•4•TOSC •(TMR2 Prescale Value)
PWM Period = [(249)+ 1]•4•250 •(4)=1000000
Título: Re: como variar la velocidad de un motor DC de proteus a través de labview
Publicado por: robotic en 27 de Septiembre de 2010, 00:50:22
creo que deberia ser algo asi pero no me deja compilarlo

#include <proyecto_pwm.h>
#int_RDA
setup_ccp1(CCP_PWM);
setup_timer_2(T2_DIV_BY_16,255,1);
void  RDA_isr(void)
{
set_pwm1_duty(valor);
valor = 255;
set_pwm1_duty(valor);
}

void main()
{

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_CLOCK_DIV_2);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DIV_BY_16,255,1);
   setup_ccp1(CCP_PWM);
   set_pwm1_duty(0);
   setup_comparator(NC_NC_NC_NC);
   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);

   //TODO: User Code

}
Título: Re: como variar la velocidad de un motor DC de proteus a través de labview
Publicado por: robotic en 27 de Septiembre de 2010, 10:44:10
me pregunto si para leer los datos del puerto rs232 se deben colocar las funciones dentro de
void  RDA_isr(void)
Título: Re: como variar la velocidad de un motor DC de proteus a través de labview
Publicado por: Suky en 27 de Septiembre de 2010, 10:44:40
Que frecuencia de cristal tienes, o a que frecuencia piensas trabajar el PIC. Con eso sacas Tosc (Periodo de la señal del oscilador)

Título: Re: como variar la velocidad de un motor DC de proteus a través de labview
Publicado por: robotic en 27 de Septiembre de 2010, 10:49:54
Que frecuencia de cristal tienes, o a que frecuencia piensas trabajar el PIC. Con eso sacas Tosc (Periodo de la señal del oscilador)



hola suky la frecuencia de los cristales es de 4 mhz y en la formula del tosc me sale esto

Tosc = 1/Fosc =  1/4mhz =  250
Título: Re: como variar la velocidad de un motor DC de proteus a través de labview
Publicado por: Suky en 27 de Septiembre de 2010, 10:57:03
250 que? Tiene que se con unidades para hacer un calculo correcto.
PWM Period = [(249)+ 1]•4•250 •(4)=1000000

Entonces si acá determinas usar PR2 en 249 y el preescales en 4, porque haces esto:
setup_timer_2(T2_DIV_BY_16,255,1);


 :?

Otra cosa, setup_ccp1(CCP_PWM) y setup_timer_2(T2_DIV_BY_16,255,1) no pueden ir en cualquier lado, deben ir dentro de una función. Como es inicialización del módulo, lo adecuado sería al principio del main.


Una vez determinada la frecuencia, tienes que calcular cual es la resolución de tu PWM. En el datasheet hay una formula. Si te da mayor o igual a 10, entonces el rango de valor (Tu variable) es de 0 a 1023, pero si la resolución es menor el rango también disminuye.

Con eso ya puedes realizar simulaciones en proteus para determinar si la frecuencia es la correcta, que pasa si cambio valor, ect.... Pruebe, analice, estudie....


Saludos!
Título: Re: como variar la velocidad de un motor DC de proteus a través de labview
Publicado por: robotic en 27 de Septiembre de 2010, 11:20:52
Tosc = 1/Fosc =  1/4mhz =  0.00000025

0.25us

así debería ser?
setup_timer_2(T2_DIV_BY_4,255,1);
Título: Re: como variar la velocidad de un motor DC de proteus a través de labview
Publicado por: Suky en 27 de Septiembre de 2010, 12:10:33
así debería ser?
setup_timer_2(T2_DIV_BY_4,255,1);
No, falta algo, pero por eso digo:
Con eso ya puedes realizar simulaciones en proteus para determinar si la frecuencia es la correcta, que pasa si cambio valor, ect.... Pruebe, analice, estudie....

Título: Re: como variar la velocidad de un motor DC de proteus a través de labview
Publicado por: robotic en 27 de Septiembre de 2010, 16:30:25
así debería ser?
setup_timer_2(T2_DIV_BY_4,255,1);
No, falta algo, pero por eso digo:
Con eso ya puedes realizar simulaciones en proteus para determinar si la frecuencia es la correcta, que pasa si cambio valor, ect.... Pruebe, analice, estudie....



ok lo intentare aunque vengo recién llegando de donar sangre y ando un poco mareado así que no te asegura nada jejejeje
Título: Re: como variar la velocidad de un motor DC de proteus a través de labview
Publicado por: robotic en 27 de Septiembre de 2010, 17:00:52
coloque este codigo en el ccs

#include <16F877A.h>
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES XT                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected
#use delay(clock=4000000)
#int_RDA
void  RDA_isr(void)
{

}

void main()
{

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_CLOCK_DIV_2);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DIV_BY_4,255,1);
   setup_ccp1(CCP_PWM);
   set_pwm1_duty(0);
   setup_comparator(NC_NC_NC_NC);
   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);

   //TODO: User Code

}

y la imagen de la prueba del proteus es esta coloque un led para ve si había pulso y el led prendía a veces pero el osciloscopio no marca los pulsos

(http://s2.subirimagenes.com/fondosycapturas/5261248proteus.jpg)
Título: Re: como variar la velocidad de un motor DC de proteus a través de labview
Publicado por: Suky en 27 de Septiembre de 2010, 17:23:18
Falta el

Código: [Seleccionar]
while(1){

}

Sino el microcontrolador se restea. Revisa los ejemplos que hay en el foro.

http://www.todopic.com.ar/foros/index.php?topic=4530.0
Título: Re: como variar la velocidad de un motor DC de proteus a través de labview
Publicado por: robotic en 27 de Septiembre de 2010, 17:47:39
cambie el codigo de esta forma y me lee los pulsos pero no los cambia, aunque creo debo estar cerca
(estoy leyendo los ejemplos)

#include <16F877A.h>
#device adc=8
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES XT                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected

#use delay(clock=4000000)
#int_RDA
int valor;
void  RDA_isr(void)
{

}

void main()
{

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_CLOCK_DIV_2);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DIV_BY_4,255,1);
   setup_ccp1(CCP_PWM);
   set_pwm1_duty(0);
   setup_comparator(NC_NC_NC_NC);
   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);

   //TODO: User Code
   while (1){
set_pwm1_duty(valor);
valor = 255;
set_pwm1_duty(valor);
}
}
Título: Re: como variar la velocidad de un motor DC de proteus a través de labview
Publicado por: robotic en 27 de Septiembre de 2010, 21:32:04
vi los ejemplos del pwm en los otros hilos están bastante bien explicado "muchas gracias", pero aun no logro entender como leer los caracteres que vienen por el puerto rs232 y con eso pueda cambiar la frecuencia porque en los ejemplos de los foros ocupan botones para cambiar la frecuencia.
coloque este código en el ccs, me muestra una frecuencia en el proteus pero no logro cambiarla, que sera?


#include <16F877A.h>
#device adc=8
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES XT                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected
#use delay(clock=4000000)
#int_RDA
void  RDA_isr(void)
{

}

void main()
{

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_CLOCK_DIV_2);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DIV_BY_4,127,1);
   setup_ccp1(CCP_PWM);
   setup_comparator(NC_NC_NC_NC);
   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);

   //TODO: User Code
   while (1){
set_pwm1_duty(256);
}
}



(http://s2.subirimagenes.com/fondosycapturas/5262918proteus3.jpg)
Título: Re: como variar la velocidad de un motor DC de proteus a través de labview
Publicado por: robotic en 28 de Septiembre de 2010, 09:40:30
hola nuevamente, le he colocado algo al código para que pueda leer el puerto serial pueda variar el duty cycle pero el motor anda muy lento, el codigo quedo asi

#include <proyecto_pwm.h>
#use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7,stream=HOSTPC)
int valor;
#int_RDA
#include <16F877A.h>
#device adc=8
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES XT                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected
#use delay(clock=4000000)
void  RDA_isr(void)
{
valor=getc(HOSTPC);
set_pwm1_duty(valor);
}

void main()
{

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_CLOCK_DIV_2);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DIV_BY_4,127,1);
   setup_ccp1(CCP_PWM);
   setup_comparator(NC_NC_NC_NC);
   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);

   //TODO: User Code
   while (1){

}
}
(http://s3.subirimagenes.com:81/fondosycapturas/5265114proteus4.jpg)
Título: Re: como variar la velocidad de un motor DC de proteus a través de labview
Publicado por: Suky en 28 de Septiembre de 2010, 10:43:08
Y que resolución tiene tu PWM?
Título: Re: como variar la velocidad de un motor DC de proteus a través de labview
Publicado por: robotic en 28 de Septiembre de 2010, 11:00:38
Y que resolución tiene tu PWM?
tengo una resolucion de 10 bits


(http://s3.subirimagenes.com:81/otros/5265394resolucion.jpg)

PR2 = 0b11111001 ;
T2CON = 0b00000101 ;
CCPR1L = 0b01111100 ;
CCP1CON = 0b00111100 ;
Título: Re: como variar la velocidad de un motor DC de proteus a través de labview
Publicado por: Suky en 28 de Septiembre de 2010, 11:25:19
Entonces si tu le mandas en labview como máximo 255, que ciclo de trabajo tendrá? Hay que hacer algo para que con 255 me de 100% de ciclo de trabajo?
Título: Re: como variar la velocidad de un motor DC de proteus a través de labview
Publicado por: robotic en 28 de Septiembre de 2010, 11:34:48
Entonces si tu le mandas en labview como máximo 255, que ciclo de trabajo tendrá? Hay que hacer algo para que con 255 me de 100% de ciclo de trabajo?

me podrías explicar un poco mas por favor, que con todo lo que he leído tengo un solo enredo en mi cabeza y necesito recapitular toda la información que he adquirido.
Título: Re: como variar la velocidad de un motor DC de proteus a través de labview
Publicado por: Suky en 28 de Septiembre de 2010, 11:41:22
Si para la frecuencia que has configurado la señal PWM tienes 10-bits de resolución, quiere decir que:

0      -> 0% de Ciclo de trabajo, o sea la señal siempre está en 0V.
1023 -> 100% de Ciclo de trabajo, o sea la señal siempre está en 5V.

Por lo que veo desde labview solo mandas un byte para controlar la velocidad. Que mandas? Desde 0 a 255, pensando que 255 es máxima velocidad o 0 a 100?

Dependiendo de esos tienes que adecuarlo para que te de el máximo del ciclo de trabajo.


Saludos!
Título: Re: como variar la velocidad de un motor DC de proteus a través de labview
Publicado por: robotic en 28 de Septiembre de 2010, 11:48:54
Si para la frecuencia que has configurado la señal PWM tienes 10-bits de resolución, quiere decir que:

0      -> 0% de Ciclo de trabajo, o sea la señal siempre está en 0V.
1023 -> 100% de Ciclo de trabajo, o sea la señal siempre está en 5V.

Por lo que veo desde labview solo mandas un byte para controlar la velocidad. Que mandas? Desde 0 a 255, pensando que 255 es máxima velocidad o 0 a 100?

Dependiendo de esos tienes que adecuarlo para que te de el máximo del ciclo de trabajo.


Saludos!

desde el labview solo envio un 0 1 2 3 4 5 6 7 8 9, si tengo el dial en 5 estoy enviando el carácter numero 5 que según la tabla ascII corresponderia a un 53

0 = 48
1 = 49
2 = 50
3 = 51
4 = 52
5 = 53
6 = 54
7 = 55
8 = 56
9 = 57
Título: Re: como variar la velocidad de un motor DC de proteus a través de labview
Publicado por: Suky en 28 de Septiembre de 2010, 11:55:06
Aaa! ok... Entonces con la estructura switch puedes seleccionar las distintas velocidades:

Valor=gect();

switch(Valor){
    case '0':
         set_pwm1_duty(0);
    break;
    ......
    ......
    case '9':
         set_pwm1_duty(1023);
    break;
}


Buscar en el foro o web sobre swicth en C.

Saludos!
Título: Re: como variar la velocidad de un motor DC de proteus a través de labview
Publicado por: robotic en 28 de Septiembre de 2010, 14:59:38
he colocado el codigo asi y aun no logro hacerlo funcionar

#include <proyecto_pwm.h>
#use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7,stream=HOSTPC)
#int_RDA
int8 valor;
void  RDA_isr(void){
valor=getc(HOSTPC);
set_pwm1_duty(valor);
switch(Valor){
    case '0':
         set_pwm1_duty(0);
    break;
    case '1':
         set_pwm1_duty(113);
    break;
    case '2':
         set_pwm1_duty(226);
    break;
    case '3':
         set_pwm1_duty(339);
    break;
    case '4':
         set_pwm1_duty(452);
    break;
    case '5':
         set_pwm1_duty(565);
    break;
    case '6':
         set_pwm1_duty(678);
    break;
    case '7':
         set_pwm1_duty(791);
    break;
    case '8':
         set_pwm1_duty(904);
    break;
    case '9':
         set_pwm1_duty(1023);
    break;
}

}

void main()
{

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_CLOCK_DIV_2);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DIV_BY_4,127,1);
   setup_ccp1(CCP_PWM);
   setup_comparator(NC_NC_NC_NC);
   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);

   //TODO: User Code
   while (1){

}
}
Título: Re: como variar la velocidad de un motor DC de proteus a través de labview
Publicado por: Suky en 28 de Septiembre de 2010, 15:17:12
set_pwm1_duty(valor);

Para que haces eso?
PR2 = 0b11111001 ;

Aquí dices que hay que poner 249 en PR2, pero tu haces:
   setup_timer_2(T2_DIV_BY_4,127,1);

 :?
Título: Re: como variar la velocidad de un motor DC de proteus a través de labview
Publicado por: robotic en 28 de Septiembre de 2010, 15:23:00
set_pwm1_duty(valor);

Para que haces eso?
PR2 = 0b11111001 ;

Aquí dices que hay que poner 249 en PR2, pero tu haces:
   setup_timer_2(T2_DIV_BY_4,127,1);

 :?
+

ufffff no entiendo y que hago entonces?
Título: Re: como variar la velocidad de un motor DC de proteus a través de labview
Publicado por: Suky en 28 de Septiembre de 2010, 15:32:34
Estudiar, buscar, leer. Si vas a la ayuda de CCS tenes:
Citar
Syntax:
 setup_timer_2 (mode, period, postscale)
 
Parameters:
 mode may be one of:

T2_DISABLED, T2_DIV_BY_1, T2_DIV_BY_4, T2_DIV_BY_16

 period is a int 0-255 that determines when the clock value is reset,  PR2

 postscale is a number 1-16 that determines how many timer overflows before an interrupt: (1 means once, 2 means twice, and so on).
 


 :rolleyes:


Bueno, suerte con el proyecto. Adiós!
Título: Re: como variar la velocidad de un motor DC de proteus a través de labview
Publicado por: robotic en 28 de Septiembre de 2010, 15:50:06
ok intentare terminarlo como pueda
gracias por tu tiempo  ;-)
Título: Re: como variar la velocidad de un motor DC de proteus a través de labview
Publicado por: robotic en 30 de Septiembre de 2010, 00:49:15
 :D :D :D :D
ha resultado el proyecto, modifique el circuito del motor y cambie el codigo , me di cuenta de que cuando colocaba el duty en 249 que era el mismo valor del timer 2, setup_timer_2 ( T2_DIV_BY_4, 249, 1); el motor giraba a su máxima velocidad así que deje el dato 9 del labview asignado al codigo

case '9':
         set_pwm1_duty(249);
    break;

y de ahí empece a bajar los numero hasta el case 0 y por ende a bajar la velocidad hasta para completamente.

gracias por orientarme y si me costo entender es porque yo estudie electricidad y solo estoy metiéndome a la electrónica porque me puse a hacer una tesis de automatización y me he topado que he tenido que estudiar demasiado junto con todo lo que he logrado a aprender.
Título: Re: como variar la velocidad de un motor DC de proteus a través de labview
Publicado por: Mario en 08 de Octubre de 2010, 03:31:46
Algo tarde. Tengo muuuuuuucho tiempo de no ingresar al foro.

Habría sido mejor realizar una ecuación que rija el comportamiento del PWM en función de la entrada del programa.