TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado 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)
-
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? :-/
-
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!
-
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.
-
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...
-
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?
-
Más info:
http://www.todopic.com.ar/foros/index.php?topic=30740.msg257051#msg257051
-
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)
-
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?
-
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
-
Pero entonces vamos por lo más básico. Como funciona un timer? Que cuenta? Cual es el valor máximo que podemos contar?
-
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.
-
que mas necesito saber?
-
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!
-
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...
-
Por lo que tengo entendido se utiliza 1kHz.
Saludos!
-
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?
-
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 ):
-
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
-
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?
-
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)
-
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
-
Y al final como es la sentencia para fijar la frecuencia? Veo que hiciste un Copy&Paste de los hilos, pero ningun razonamiento :?
-
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
-
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
}
-
me pregunto si para leer los datos del puerto rs232 se deben colocar las funciones dentro de
void RDA_isr(void)
-
Que frecuencia de cristal tienes, o a que frecuencia piensas trabajar el PIC. Con eso sacas Tosc (Periodo de la señal del oscilador)
-
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
-
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!
-
Tosc = 1/Fosc = 1/4mhz = 0.00000025
0.25us
así debería ser?
setup_timer_2(T2_DIV_BY_4,255,1);
-
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....
-
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
-
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)
-
Falta el
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
-
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);
}
}
-
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)
-
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)
-
Y que resolución tiene tu PWM?
-
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 ;
-
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?
-
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.
-
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!
-
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
-
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!
-
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){
}
}
-
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);
:?
-
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?
-
Estudiar, buscar, leer. Si vas a la ayuda de CCS tenes:
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!
-
ok intentare terminarlo como pueda
gracias por tu tiempo ;-)
-
: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.
-
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.