Foros de Electrónica

Comunidad de discusión sobre Automatización, Electrónica industrial, Microcontroladores y electrónica digital, Robótica, Domótica, Telemática, Tecnologías móviles, y muchos temas más.




Cuantos PWM en un Pic16Fxx puedo implementar?


       



#11  
maunix
Colaborador
Ubicación: Cordoba, Argentina
Registrado: 22 Oct 2005
Mensajes: 649
citar
SCR13PT escribió: Ok... no recibi respuesta en el foro, pero ya empiezo a allarlas, aunque un poquito de alluda no vendria mal Razz

No he estado conectado. Lo siento.

SCR13PT escribió:
Respecto al fracmento del codigo anterior

movlw .63

movwf ccp1con


He averiguado que determina la resolucion del PWM en este caso esta configurado para funcionar a 8 bits.

tienes a mano un datasheet? ahí esta bien explicado que significa cada bit del registro CCP1CON.


SCR13PT escribió:
¿Pero como determino el periodo? ¿Como hago para darle el valor (de 0 a 255) y me lo saque el PWM? Un saludo



La frecuencia, se define como la inversa del período. Frec = 1/T

El período se calcula asi.

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

De acuerdo al valor del registro PR2 , al clock de tu pic y al valor del prescaler del timer2, te dará la frecuencia del PWM.


Saludos

#12  ---PREGUNTA---
VOLVOX
Registrado: 02 Oct 2006
Mensajes: 9
citar
Disculpen los pics de picaxe tienen PWM

#13  Re: ---PREGUNTA---
maunix
Colaborador
Ubicación: Cordoba, Argentina
Registrado: 22 Oct 2005
Mensajes: 649
citar
VOLVOX escribió: Disculpen los pics de picaxe tienen PWM


¿Es una pregunta o una afirmación?

#14  
VOLVOX
Registrado: 02 Oct 2006
Mensajes: 9
citar
Es una pregunta -sorry

#15  
maunix
Colaborador
Ubicación: Cordoba, Argentina
Registrado: 22 Oct 2005
Mensajes: 649
citar
VOLVOX escribió: Es una pregunta -sorry


Si, algunos sí, te recomiendo leas este link http://www.rev-ed.co.uk/docs/axe001_techfaq.pdf

#16  
Aristides
Ubicación: Mar del Plata, Argentina
Registrado: 21 Oct 2006
Mensajes: 322
citar
Creo que el microcontrolador que tiene más posibilidades de generar varios PWM simultáneos, es el Propeller de Parallax, ya que tiene multifunción en lugar de multitarea, si alguno viaja a MDQ se lo puedo mostrar andando:
http://www.parallax.com/propeller/index.asp

#17  
Luis Quintero
Ubicación: San Luis Potosi, Mexico
Registrado: 31 Ago 2006
Mensajes: 1
citar
hola,yo hice lo mismo de controlar un led rgb por medio de pwm y lo hice con un pic 16f84a a 4 Mhz, de hecho hice una lampara para controlar la intensidad de 4 leds rgb usando 12 salidas de pwm,el hecho es que cada led lo controlo por el mismo ciclo y periodo,pero haciendo modificaciones se pueden manejar independientemente las 12 salidas,les pego el programa por si a alguien le sirve.

//proyec
#include <16f84a.h>
#fuses XT,NOWDT,NOPROTECT
#use delay(clock=4000000)
#define periodo 125 //125 * 80microS =~10mS
#define duty 125 //parte del periodo que encenderan las lamparas
#define Tiempo_int 30 //50 * 125 * 80microS =~500mS entre cambio y cambio de intensidad


int c1=0; //rojo
int c2=0; //azul
int c3=0; //verde
int i2; //variable control de ciclo de retardo en intensidades
int i; //variable que controla el ciclo del periodo del pwm
int d = 0; //control porta
int z = 0; //control portb












//////////////////////////////////////////////////////////////////////////////////////////////////
void tiempo()
{
delay_ms(4000);
}
//led1_portb_0


void ciclo_PWM_10mS(){


for (i=1;i<periodo; i++) //control periodo
{

if (i<=c1) //control intensidad rojo
{
bit_set(z,0); //led1_portb_0 //Led2=port_b_bits_543(var)
bit_set(z,3); //led2_portb_3 //Led3=port_a&portb_bits_a&1_(v)b&76(ar)
bit_set(z,6); //led3_portb_6 //Led4=port_a_bits_320(var)
bit_set(d,0); //led4_porta_0
}
else
{
bit_clear(z,0); //led1_portb_0
bit_clear(z,3); //led2_portb_3
bit_clear(z,6); //led3_portb_6
bit_clear(d,0); //led4_porta_0
}

if (i<=c2) //control intensidad azul
{
bit_set(z,1); //led1_portb_1
bit_set(z,4); //led2_portb_4
bit_set(z,7); //led3_portb_7
bit_set(d,2); //led4_porta_2
}
else
{
bit_clear(z,1); //led1_portb_1
bit_clear(z,4); //led2_portb_4
bit_clear(z,7); //led3_portb_7
bit_clear(d,2); //led4_porta_2
}

if (i<=c3) //control intensidad verde
{
bit_set(z,2); //led1_portb_2
bit_set(z,5); //led2_portb_5
bit_set(d,1); //led3_porta_1
bit_set(d,3); //led4_porta_3
}
else
{
bit_clear(z,2); //led1_portb_2
bit_clear(z,5); //led2_portb_5
bit_clear(d,1); //led3_porta_1
bit_clear(d,3); //led4_porta_3
}
output_b(z);
output_a(d);

}
delay_us(40);


}

/////////////////////////////////////////////////////////////////////////////////////////////////////

void tonos_mas(){


for (c1=1,c2=1,c3=0; c1<duty ; c1++,c2++) //;control de tono magenta
{

for (i2=1; i2<Tiempo_int; i2++) //;espera entre incrementos de intensidad
ciclo_PWM_10mS() ;

}
}




void tonos_2_mas(){


for (c3=1,c1=1,c2=0; c3<duty; c3++,c1++) //;control de tono amarillo
{

for (i2=1; i2<Tiempo_int; i2++) //;espera entre incrementos de intensidad

ciclo_PWM_10mS() ;


}

}



void tonos_3_mas(){


for (c3=1,c1=0,c2=1; c3<duty; c3++,c2++) //;control de tono cyan
{

for (i2=1; i2<Tiempo_int; i2++) //;espera entre incrementos de intensidad

ciclo_PWM_10mS() ;


}

}



void tonos_menos(){


for (c1=duty,c2=duty,c3=0; c1>1 ; c1--,c2--) //;control de tono magenta
{

for (i2=1; i2<Tiempo_int; i2++) //;espera entre incrementos de intensidad

ciclo_PWM_10mS() ;

}
}




void tonos_2_menos(){


for (c1=duty,c2=0,c3=duty; c1>1 ; c1--,c3--) //;control de tono amarillo
{

for (i2=1; i2<Tiempo_int; i2++) //;espera entre incrementos de intensidad

ciclo_PWM_10mS() ;

}
}


void tonos_3_menos(){


for (c3=duty,c1=0,c2=duty; c3>1; c3--,c2--) //;control de tono cyan
{

for (i2=1; i2<Tiempo_int; i2++) //;espera entre incrementos de intensidad

ciclo_PWM_10mS() ;


}

}






void negro() //color negro
{
z=0;
d=0;
output_b(z);
output_a(d);
tiempo();
}


void blanco() //color blanco
{


z=d=255;
output_b(z);
output_a(d);
tiempo();
z=d=0;
output_b(z);
output_a(d);


}





//b%76543210 //b%76543210
//B%arvarvar //A%xxxxvavr
void rojo() //color rojo //b%01001001 //a%xxxx0001
{


output_b(0x49);
output_a(0x01);
tiempo();
z=d=0;
output_b(z);
output_a(d);

}

void verde() //color verde
//b%76543210 //b%76543210
//B%arvarvar //A%xxxxvavr
//B%00100100 //A%xxxx1010
{
output_b(0x24);
output_a(0x0a);
tiempo();
z=d=0;
output_b(z);
output_a(d);
}

void azul() //color azul



//b%76543210 //b%76543210
//B%arvarvar //A%xxxxvavr
//B%10010010 //A%xxxx0100
{
output_b(0x92);
output_a(0x04);
tiempo();
z=d=0;
output_b(z);
output_a(d);
}


void amarillo() //color amarillo

//b%76543210 //b%76543210
//B%arvarvar //A%xxxxvavr
//B%01101101 //A%xxxx1011


{
output_b(0x6d);
output_a(0x0b);
tiempo();
z=d=0;
output_b(z);
output_a(d);
}

void cyan() //color cyan
//b%76543210 //b%76543210
//B%arvarvar //A%xxxxvavr
//B%10110110 //A%xxxx1110



{
output_b(0xb6);
output_a(0x0e);
tiempo();
z=d=0;
output_b(z);
output_a(d);
}

void magenta() //color magenta


//b%76543210 //b%76543210
//B%arvarvar //A%xxxxvavr
//B%11011011 //A%xxxx0101
{
output_b(0xdb);
output_a(0x05);
tiempo();
z=d=0;
output_b(z);
output_a(d);
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////






int main ()

{ //salida al puerto b=0

while (true)
{


// negro(); //(0, 0, 0) es negro
blanco(); //(255, 255, 255) es blanco
rojo(); //(255, 0, 0) es rojo
tonos_mas();
tonos_menos();
verde(); //(0, 255, 0) es verde
tonos_2_mas();
tonos_2_menos();
azul();
tonos_3_mas();
tonos_3_menos();
amarillo(); //(255, 255, 0) es amarillo
cyan(); //(0, 255, 255) es cyan
magenta(); //(255, 0, 255) es magenta



z=d=0;
output_b(z);
output_a(d);
}
return(0);

}


saludos.

#18  
zidaemon
Ubicación: Mexico
Registrado: 25 Feb 2006
Mensajes: 31
citar
Mejor utiliza un pic de bajo coste como un pic16f628, tengo un programa que puede manejar tres pwm, sin utilizar ninguno de los que trae por hardware. Con esto te quiero decir, que puedes tener mas de 10 PWM independientes. Todo por Software. Lo que haace este circiuto, es un juego de tres luces que encienden gradualmente una despues de otra.

;***********************************
; Hurive Sis
;
;
; Juego de 3 Luces por PWM
;
;Salida leds:Rb0,Rb1,Rb2
; Oscilador Interno del Pic
;Visitar la pagina electronica para
;lo relacionado con este circuito
;
; Compilado en MPLAB IDE v7.31
; Mexico DF. Octubre del 2006
;***********************************
LIST P=16C628A
#INCLUDE <P16F628A.INC>

PH0 EQU 0X20 ;aqui va el numero de intensidad del PWM1
PH1 EQU 0X21 ;aqui va el numero de intensidad del PWM2
PH2 EQU 0X22 ;aqui va el numero de intensidad del PWM3

CONT EQU 0X23
CONT2 EQU 0X24

C21 EQU 0X25 ;registros para retardos
C22 EQU 0X26
C23 EQU 0X27


#DEFINE TIEMPO2A 0XFF ;TIEMPOS PARA RETARDO 2
#DEFINE TIEMPO2B 0XFF
#DEFINE TIEMPO2C 0X7F

#DEFINE PMW0 PORTB,0
#DEFINE PMW1 PORTB,1
#DEFINE PMW2 PORTB,2

ORG 0X00

MOVLW 0X00
MOVLW 0X07
MOVWF CMCON
BSF STATUS,5
CLRF TRISA
CLRF TRISB
BCF STATUS,5
CLRF CONT2
CLRF PORTB

;***** PROGRAMA MAIN ********
MAIN CALL RETARDO
MOVLW 0XFF
MOVWF PH2
CLRF PH0
CLRF PH1

MAIN1 CALL F13 ;Prende gradualmente PWM1, almismo tiempo
INCF PH0 ; que apaga PWM3
BSF PMW0
DECFSZ PH2
GOTO MAIN1
CALL RETARDO

MAIN2 CALL F12
INCF PH1
BSF PMW1
DECFSZ PH0
GOTO MAIN2
CALL RETARDO

MAIN3 CALL F23
INCF PH2
BSF PMW2
DECFSZ PH1
GOTO MAIN3
CALL MAIN

;***** RETARDO ******

RETARDO MOVLW TIEMPO2A
MOVWF C23
CICLO23 MOVLW TIEMPO2B
MOVWF C22
CICLO22 MOVLW TIEMPO2C
MOVWF C21
CICLO21 DECFSZ C21
GOTO CICLO21
DECFSZ C22
GOTO CICLO22
DECFSZ C23
GOTO CICLO23
RETLW 0

;***** SUBRUTINAS ******
F13 MOVLW 0X00
MOVWF CONT
BSF PMW0
BSF PMW2
UNO MOVF CONT,W
SUBWF PH0,W
BTFSS STATUS,0
BCF PMW0
MOVF CONT,W
SUBWF PH2,W
BTFSS STATUS,0
BCF PMW2
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP

INCF CONT
MOVF CONT,W
XORLW 0XFF
BTFSS STATUS,2
GOTO UNO
RETLW 0

F12 MOVLW 0X00
MOVWF CONT
BSF PMW0
BSF PMW1
DOS MOVF CONT,W
SUBWF PH0,W
BTFSS STATUS,0
BCF PMW0
MOVF CONT,W
SUBWF PH1,W
BTFSS STATUS,0
BCF PMW1
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP

INCF CONT
MOVF CONT,W
XORLW 0XFF
BTFSS STATUS,2
GOTO DOS
RETLW 0

F23 MOVLW 0X00
MOVWF CONT
BSF PMW1
BSF PMW2
TRES MOVF CONT,W
SUBWF PH1,W
BTFSS STATUS,0
BCF PMW1
MOVF CONT,W
SUBWF PH2,W
BTFSS STATUS,0
BCF PMW2
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP

INCF CONT
MOVF CONT,W
XORLW 0XFF
BTFSS STATUS,2
GOTO TRES
RETLW 0

END

Saludos de Hurive Radik Zidaemon Uribe

#19  PWM trabajando a 60 Hz PIC16F873A
Raúl Galván
Ubicación: Orizaba, veracruz, México
Registrado: 27 Abr 2007
Mensajes: 2
citar
La frecuencia, se define como la inversa del período. Frec = 1/T

El período se calcula asi.

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

_______________________________________________________

Disculpa quisiera un poco de ayuda para programar el PIC16F873A, Tengo problemas a la hora de calcular la frecuencai del PWM que biene integrado en el chip, lo necesito que funcione a 60 Hz (si solo utilizo el predivisor la minima frecuencia qie obtengo anda alrededor de 244 Hz) si utilizo en posdivisor con valor de 5 obtengo la frecuencia deseada pero no se que susede con el ciclo útil (en un divisor de frecuencia con contadores TTL (digitales) el ciclo útil siempre se mantiene al 50%) y mi duda es como se comporta el posdivisor ¿mantiene la relación en %? o se comporta como un divisor común y corriente.

Por favor si pudieras ayudarme te lo agradeceria: si tienes las respuestas enviane que valores de veben cargar en los registros PR2, TMR2 Prescaler, Poscaler y CCPRxL

#20  Hola
Maco1717
Ubicación: Valencia, epaña
Registrado: 23 Jun 2006
Mensajes: 5
citar
Hola mira esto:

http://ww1.microchip.com/downloads/en/AppNotes/01074A.pdf

no es en esamblador, esta en c pero para mi es mejor.
suerte

 Responder





 Otros temas de interés 
No hay mensajes nuevos PIC + LCD + MemoriaSerial + Tarjeta MMC + Motores de Paso
No hay mensajes nuevos Estado inicial de 555
No hay mensajes nuevos Aumentar potencia en bobina tesla de estado solido
No hay mensajes nuevos Motor mas adecuado para sistema de combustion de caldera
No hay mensajes nuevos Diseño de un relé de estado solido DC

Foros de Electronica
|| Cuestiones Elementales de Electrónica || Fuentes de alimentacion || Circuitos de radio || Diseño de circuitos en general ||
|| Sistemas de Audio: Preamplificadores, Ecualizadores || Amplificadores || Reparación || Discusión ||
|| Microcontroladores y sistemas embebidos || Circuitos logicos combinacionales y secuenciales || Interfaces y Programacion || Dudas en general || Sistemas de Video || PC Hardware || Telematica y comunicaciones || Tecnologias moviles || Software Electronico || Robotica, Domotica y Mecatronica || Autotrónica || Automatizacion, Electronica industrial y de Potencia || Documentacion, circuitos y esquemas || Donde Las Ideas Convergen... || Tutoriales y Manuales || Proyectos Prácticos ||