TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: japifer_22 en 16 de Junio de 2009, 00:34:09

Título: controlar voltage salida del pin_X del PIC (0 a 5 Volt )
Publicado por: japifer_22 en 16 de Junio de 2009, 00:34:09
hola otra ves ^^, bueno ahora tengo otra de las tantas dudas que e tenido a lo largo de todo este tiempo XD.
quiero sacar por un pin del pic una señal que valla de los 0 a 5 vol vol pero de forma paulatina, me explico mejor: al presionar un boton (boton asendente) este me valla incrementando el voltaje de un pin desde 0 a 5 esto dependiendo de su resolucion y, otro boton que por el mismo pin lo valla decrementando. e intentado hacer algo pero no me sale nada si alguien me pudiera dar un ejemplo de esto seria fenomenal y si me lo explicara mejor todavia.
quiero encender y apagar un led de forma gradual con botones.
Título: Re: controlar voltage salida del pin_X del PIC (0 a 5 Volt )
Publicado por: japifer_22 en 16 de Junio de 2009, 00:37:13
se me olvidava estopy programando en el compilador CCS C y estoy usando un pic 16f876a o 16f873a o 16f628a
Título: Re: controlar voltage salida del pin_X del PIC (0 a 5 Volt )
Publicado por: Suky en 16 de Junio de 2009, 02:29:57
Controlar el voltaje de salida de un pin no se puede, pero si puedes generar una señal PWM para controlar la luminosidad del led  o lampara.
Por ejemplo para generar un PWM de 1500Hz, se debe configurar el módulo CCP de la siguiente forma:
Código: C
  1. setup_timer_2(T2_DIV_BY_16,207,1);
  2. setup_ccp1(CCP_PWM);

Osea, el timer2 con Preescaler 1:16, postescaler 1:1 y PR2=207. Y módulo CCP en modo PWM.

El ciclo de trabajo lo controlas con la siguiente instrucción:
Código: C
  1. set_pwm1_duty(416); // Ciclo de trabajo al 50%

donde 0 seria CT=0% y 832 un CT=100%. ASí que con los pulsadores solo queda variar este valor.

(Estos valores lo determiné con ayuda del datasheet del PIC16F628A)
Título: Re: controlar voltage salida del pin_X del PIC (0 a 5 Volt )
Publicado por: stk500 en 16 de Junio de 2009, 02:53:59
tal como te explica nuestros amigo Suky y aqui encontrara otras manera facil que lo pone el Sr Nocturno
http://www.todopic.com.ar/foros/index.php?topic=19736.0
Saludo
Título: Re: controlar voltage salida del pin_X del PIC (0 a 5 Volt )
Publicado por: japifer_22 en 18 de Junio de 2009, 21:50:21
hola suKy y stk500 primero que todo gracias por sus respuestas las dos estan muy bn. peroahora biene  lo triste, ya entendi como sacar la salida analoga del pic y que se tiene que hacer por medio de un PWM, pero el punto ahora es que NO SE NADA DE PWM, si me pudieran explicar detalladamente como se configura éste. asi como paso a paso como a los niñitos por que e intentado varias veses antes de este pos aprender, pero no hay caso sali duro pa esto del PWM jijijij. no entiendo eso de los preescaler ni nada, bucha si alguien se pudiese dar la pasiensia de explicarme detalladamente paso a paso esto seria de maravilla, asiendo de usos de ejemplos para niños y todo eso bueno que esten bien y espero que me puedan ayudar plisssssssss mas de lo que ya me an ayudado, y lo otro a parte de los CCP se puede sacar en cualquier otro pin del uC ?????.
salu2s
Título: Re: controlar voltage salida del pin_X del PIC (0 a 5 Volt )
Publicado por: Suky en 18 de Junio de 2009, 21:58:03
Aquí (http://www.todopic.com.ar/foros/index.php?topic=24720.msg207737#msg207737)hay algo de como funciona el módulo CCP para generar la señal PWM. Y ahí te darás cuenta fácilmente de porque se hacen esas configuraciones en C.
Título: Re: controlar voltage salida del pin_X del PIC (0 a 5 Volt )
Publicado por: japifer_22 en 18 de Junio de 2009, 22:48:17
hola denuevo suky gracias por la prontra respuesta, bueno te coment oque ahora estoy asiendo o mejor dichi quiero intentar de hacer 2 PWM de duty cycle variable pero a una freceuncia de 2KHz y que sea controlada por medio de dos pulsadores por señal (incremento-decremento), si me pudieras ayudar mas todavia en esto del codigo, a y lo otro que estoy usando un pic 16f877a y estoy programando en CCS C saludos
Título: Re: controlar voltage salida del pin_X del PIC (0 a 5 Volt )
Publicado por: Suky en 18 de Junio de 2009, 22:57:36
hola denuevo suky gracias por la prontra respuesta, bueno te coment oque ahora estoy asiendo o mejor dichi quiero intentar de hacer 2 PWM de duty cycle variable pero a una freceuncia de 2KHz y que sea controlada por medio de dos pulsadores por señal (incremento-decremento), si me pudieras ayudar mas todavia en esto del codigo, a y lo otro que estoy usando un pic 16f877a y estoy programando en CCS C saludos
Con lo que te indique para leer, el datasheet del PIC16F877A y los ejemplos indicados más arriba creo que ya podrías armar algo. Desarrolla, prueba, si surgen errores intenta resolverlos y sino sale, nos muestras el código y seguramente mas de uno acudirá a intentar solucionar el problema! También usa el buscador, debe de haber mas de un ejemplo sobre pwm en C.
Título: Re: controlar voltage salida del pin_X del PIC (0 a 5 Volt )
Publicado por: japifer_22 en 18 de Junio de 2009, 23:30:58
holaaa XD bueno ahora tengo 2 duras:
1ª el PR2 puede ir solo de 255 a 0 o viseversa o puede tomar valores mas grandes ???
2ªel TMR2 es el pre escaler ??? de cuanto lo configuro ?¿?¿?¿ eso por el momento XD salu2
Título: Re: controlar voltage salida del pin_X del PIC (0 a 5 Volt )
Publicado por: japifer_22 en 18 de Junio de 2009, 23:45:59
aver si esto esta bien:
para PR2 = 255 (maximo)
        Tosc=0.05 microsegundos (20MHz clock)
        TMR2= ¿?¿?¿¿
Fpwm= 1/PWMperiodo

PWMperiodo=1/Fpwm
PWMperiodo=1/2KHz =500microsegundos -----------------> 2KHz supuestamente es la frecuencia de mi PWM

Tpwm=(PR2+1)*4*Tosc*TMR2preescaler
entonces despejando

TMR2preescaler=PWMperiodo/((PR2+1)*4*Tosc)

TMR2preescaler=500micros/((255+1)*4*0.05micros)=9.765625
esta bien lo que ise o no ?¿?¿?¿
saludos
 
Título: Re: controlar voltage salida del pin_X del PIC (0 a 5 Volt )
Publicado por: japifer_22 en 19 de Junio de 2009, 00:02:04
sigo XD
ahora para TR2=0

TMR2preescaler=500micos/((0+1)*4*0.05micros) =2500

ahora el rango de trabajo del PWM, donde n es el número de bits usados (10bit)

CTPWM= 2^n *Tosc*TMR2preescaler

CTPWM= 2^10*0.05micros*9.765625= 500microsegundos

CTPWM=2^10*0.05micros*2500= 0.128 segundos.
Título: Re: controlar voltage salida del pin_X del PIC (0 a 5 Volt )
Publicado por: japifer_22 en 19 de Junio de 2009, 00:16:04
comprobando los 10bit
Sin embargo, dependiendo del valor de Ciclo de trabajo máximo (CT_PWM) deseado, no será posible realizar las  divisiones y por lo tanto no se podrán usar los n bits de resolución. O al revés, si se elige una resolución deseada n no será posible tener cualquier Ciclo de Trabajo máximo (CT_PWM) Deseado.

De la ecuación anterior se puede despejar cual es la resolución máxima:

resolucionPWM=(log(CTPWM/(Tosc*TMR2preescaler)))/log2


resolucionPWM=(log(500micros/(0.05micros*9.76525)))/log2 = 10


resolucionPWM=(log(0.128/(0.05micros*2500)))/log2 = 10

eneste caso se comprueva que la resolucion es de 10 bit



Título: Re: controlar voltage salida del pin_X del PIC (0 a 5 Volt )
Publicado por: Suky en 19 de Junio de 2009, 01:56:22
Primero, PR2 es un registro de 8bits, así que puede tomar valores entre 0 y 255.

\mathrm{PeriodoPWM}=\frac {1}{\mathrm{FrecuenciaPWM}}

\mathrm{PeriodoPWM}=\frac {1}{2000}=500us

Ahora, despejando de :
\mathrm{PeriodoPWM}=\left(\mathrm{PR2} + 1 \right)\cdot 4\cdot\mathrm{Tosc}\cdot\mathrm{TMR2 Preescaler}

sabiendo que:
Tosc=50ns=1/20MHz, y como PR2 tiene que estar entre 0 y 255, Preescaler debe ser 1:16, entonces:

\mathrm{PR2}=\left(\frac{\mathrm{PeriodoPWM}}{4\cdot\mathrm{Tosc}\cdot\mathrm{TMR2 Preescaler}}\right) -1 =155

El timer debe ser configurado:
Código: C
  1. setup_timer_2(T2_DIV_BY_16,155,1);

Y para configurar los módulos:
Código: C
  1. setup_ccp1(CCP_PWM);
  2. setup_ccp2(CCP_PWM);

Ahora a apartir de la siguiente formula podemos determinar el rango del Ciclo de Trabajo.
\mathrm{CTPWM}=\left(\mathrm{CCPR1L:CCP1CON<5:4>}\right)\cdot\mathrm{Tosc}\cdot\mathrm{TMR2 Preescaler}
Osea, para 100% CTPWM=500us. Entonces:
\mathrm{CCPR1L:CCP1CON<5:4>}=\frac{\mathrm{CTPWM}}{\mathrm{Tosc}\cdot\mathrm{TMR2 Preescaler}}=625

Entonces:
Código: C
  1. set_pwm1_duty(625); // Ciclo de trabajo al 100%
  2. set_pwm2_duty(625); // Ciclo de trabajo al 100%

Título: Re: controlar voltage salida del pin_X del PIC (0 a 5 Volt )
Publicado por: japifer_22 en 19 de Junio de 2009, 02:17:18
holaa molesto denuevo pero tengo un dramita otra vez, e echo el programa lo compilo y todo bien pero a la hora de simularlo el pic no hac nada que esta mal?????¿?¿?¿?¿?¿?¿
y lo otro como ago para poner el ccp2 ?? eso saludos....
a y el programa es este:

#include <16F877a.h>
#device adc=10
#FUSES NOWDT, HS, NOPUT, NOPROTECT, BROWNOUT, NOLVP, NOCPD, NOWRT
#use delay (clock=20000000) //Fosc=20Mhz
#define use_portb_lcd TRUE //definir portb lcd
#include<lcd.c> //libreria manejo lcd

///PROGRAMA
void main(void)
{
int16 a=100;
lcd_init(); //inicializa lcd

while(TRUE){
setup_ccp1(CCP_PWM); //ccp1 modo PWM

setup_timer_2(T2_DIV_BY_4, 255, 1);

if(!input(PIN_A0)){                  //¿se ha pulsado el boton?
do{                           //SI -> eliminar...           
}while(!input(PIN_A0));            //...rebotes del boton
a++;}
if(!input(PIN_A1)){                  //¿se ha pulsado el boton?
do{                           //SI -> eliminar...           
}while(!input(PIN_A1));            //...rebotes del boton
a--;} 
set_pwm1_duty(a);
printf(lcd_putc,"duty cycle " );
}
}
Título: Re: controlar voltage salida del pin_X del PIC (0 a 5 Volt )
Publicado por: japifer_22 en 19 de Junio de 2009, 02:29:28
hola suky dejame darte las muchisimas gracias por la pasiencia que as tenido conmigo al explicarme ahora estoy entendiendo un poquito mas, pero tengo una duda como saves que el preescaler tiene que ser de 1:16?????? y dos arregle el programa denuevo pero todavia no quiere hacer nada
un gran saludo y abraso de verdad estoy muy agradesidi por tu ayuda de verdad te pasaste mil gracias una y otra vez mil gracias

bueno el programa con los datos que me dijiste queda asi pero no hace nada X(:

#include <16F877a.h>
#device adc=10
#FUSES NOWDT, HS, NOPUT, NOPROTECT, BROWNOUT, NOLVP, NOCPD, NOWRT
#use delay (clock=20000000) //Fosc=20Mhz
#define use_portb_lcd TRUE //definir portb lcd
#include<lcd.c> //libreria manejo lcd

///PROGRAMA
void main(void)
{
int16 a=312,b=312;// para duty cycle del 50%
lcd_init(); //inicializa lcd

while(TRUE){
setup_ccp1(CCP_PWM); //ccp1 modo PWM
setup_ccp2(CCP_PWM); //ccp2 modo PWM

setup_timer_2(T2_DIV_BY_16, 155, 1);

if(!input(PIN_A0)){                  //¿se ha pulsado el boton?
do{                           //SI -> eliminar...           
}while(!input(PIN_A0));            //...rebotes del boton
a++;}
if(!input(PIN_A1)){                  //¿se ha pulsado el boton?
do{                           //SI -> eliminar...           
}while(!input(PIN_A1));            //...rebotes del boton
a--;} 
set_pwm1_duty(a);
set_pwm2_duty(b);
printf(lcd_putc,"duty cycle ");
}
}
Título: Re: controlar voltage salida del pin_X del PIC (0 a 5 Volt )
Publicado por: Suky en 19 de Junio de 2009, 03:12:43
Las configuraciones deben ir fuera del while:

Código: C
  1. void main(void)
  2. {
  3. int16 a=312,b=312;// para duty cycle del 50%
  4. lcd_init(); //inicializa lcd
  5. setup_ccp1(CCP_PWM); //ccp1 modo PWM
  6. setup_ccp2(CCP_PWM); //ccp2 modo PWM
  7.  
  8. setup_timer_2(T2_DIV_BY_16, 155, 1);
  9.  
  10. while(TRUE){
  11. .
  12. .
  13. .
  14. }
Título: Re: controlar voltage salida del pin_X del PIC (0 a 5 Volt )
Publicado por: japifer_22 en 19 de Junio de 2009, 16:24:25
hola suky te comento que ya me esta funcionando el PWM, pero ahora tengo el siguiente dilema. al presionar el boton de incremento (a++) varia al ancho de pulso pero solo un poco, osea lo varia pero llega a un punto que se queda estancado y regresa x veses mas atras y no me deja seguir avansando con mi PWM, bueno te dej oel codigo otra vez y te mando el proteus = saludos y muchisimas gracias por la gran ayuda de verdad gracias

Código: [Seleccionar]
#include <16F877a.h>
#device adc=10
#FUSES NOWDT, HS, NOPUT, NOPROTECT, BROWNOUT, NOLVP, NOCPD, NOWRT
#use delay (clock=20000000) //Fosc=20Mhz
#define use_portb_lcd TRUE //definir portb lcd
#include<lcd.c> //libreria manejo lcd


///PROGRAMA
void main(void)
{
int16 a=0,b=0;// para duty cycle del 50%

lcd_init(); //inicializa lcd
setup_ccp1(CCP_PWM); //ccp1 modo PWM
setup_ccp2(CCP_PWM); //ccp2 modo PWM
setup_timer_2(T2_DIV_BY_16, 155, 1);

while(TRUE){

if(!input(PIN_A1)){                  //¿se ha pulsado el boton?
do{                           //SI -> eliminar...           
}while(!input(PIN_A1));            //...rebotes del boton
         a--;
}

if(!input(PIN_A0)){                  //¿se ha pulsado el boton?
do{                           //SI -> eliminar...           
}while(!input(PIN_A0));            //...rebotes del boton
         a++; 
}

set_pwm1_duty(a);      // Ciclo de trabajo al 100% a=625
set_pwm2_duty(b);    // Ciclo de trabajo al 100% a=625

}
}
Título: Re: controlar voltage salida del pin_X del PIC (0 a 5 Volt )
Publicado por: Suky en 19 de Junio de 2009, 16:57:18
Lo que pasa que al incrementa de a uno, estas modificando el CT en 0.16%, entonces si lo quieres hacer mas rápido debes sumarle 10 o más...
Título: Re: controlar voltage salida del pin_X del PIC (0 a 5 Volt )
Publicado por: japifer_22 en 19 de Junio de 2009, 17:33:56
bucha maestro muchas gracias por todo me esta resultando asta el momento bn lo que estoy asiendo espero que pronto tener buenas notisiar y que te enurgullescas de tu disipulo por que eres mi maestro suky.

bueno ahora tengo la siguiente duda XD
para activar 2 entradas analogas como lo ago en la siguente linea
 setup_adc_ports(AN0); // solo una entrada analoga activada
?? saludos
Título: Re: controlar voltage salida del pin_X del PIC (0 a 5 Volt )
Publicado por: Suky en 19 de Junio de 2009, 18:04:03
bucha maestro muchas gracias por todo me esta resultando asta el momento bn lo que estoy asiendo espero que pronto tener buenas notisiar y que te enurgullescas de tu disipulo por que eres mi maestro suky.
:D  :D  :D
bueno ahora tengo la siguiente duda XD
para activar 2 entradas analogas como lo ago en la siguente linea
 setup_adc_ports(AN0); // solo una entrada analoga activada
?? saludos

Para ver las distintas configuraciones, pégale una miradita al archivo 16f877a.h
Código: C
  1. // Constants used in SETUP_ADC_PORTS() are:
  2. #define NO_ANALOGS                           7    // None
  3. #define ALL_ANALOG                           0    // A0 A1 A2 A3 A5 E0 E1 E2
  4. #define AN0_AN1_AN2_AN4_AN5_AN6_AN7_VSS_VREF 1    // A0 A1 A2 A5 E0 E1 E2 VRefh=A3    
  5. #define AN0_AN1_AN2_AN3_AN4                  2    // A0 A1 A2 A3 A5          
  6. #define AN0_AN1_AN2_AN4_VSS_VREF             3    // A0 A1 A2 A4 VRefh=A3              
  7. #define AN0_AN1_AN3                          4    // A0 A1 A3
  8. #define AN0_AN1_VSS_VREF                     5    // A0 A1 VRefh=A3
  9. #define AN0_AN1_AN4_AN5_AN6_AN7_VREF_VREF 0x08    // A0 A1 A5 E0 E1 E2 VRefh=A3 VRefl=A2    
  10. #define AN0_AN1_AN2_AN3_AN4_AN5           0x09    // A0 A1 A2 A3 A5 E0        
  11. #define AN0_AN1_AN2_AN4_AN5_VSS_VREF      0x0A    // A0 A1 A2 A5 E0 VRefh=A3          
  12. #define AN0_AN1_AN4_AN5_VREF_VREF         0x0B    // A0 A1 A5 E0 VRefh=A3 VRefl=A2          
  13. #define AN0_AN1_AN4_VREF_VREF             0x0C    // A0 A1 A4 VRefh=A3 VRefl=A2              
  14. #define AN0_AN1_VREF_VREF                 0x0D    // A0 A1 VRefh=A3 VRefl=A2
  15. #define AN0                               0x0E    // A0
  16. #define AN0_VREF_VREF                     0x0F    // A0 VRefh=A3 VRefl=A2

Y si no entiendes porque es así, compruébalo con el datasheet del PIC.