PWM usando FOR en un PIC

Buenas tardes.
Una pregunta. ¿Cómo hago el PWM con FOR en an/ar? Porque he visto unos vídeos y si se puede, pero en el vídeo tiene el todo el puerto B (8bits) para hacerlo, y digamos que cada pin que está en 1 va encendiendo el PWM pero en lenguaje binario, de arriba para abajo.

Por ejemplo:
Si enciendo el pin de arriba (ra0/na0) y todos los demás son 0, mandas una señal pequeña, digamos un 10% y la suma de todos hasta el 7 pin (ra6/an6) es el 50% y el último es el 50%
Pero quisiera usar un sólo pin con el for para hacerlo a un 50% porque como ya dije, en el otro era ocupando todo el puerto B y la verdad si me quita mucho espacio, pero usando FOR es mejor porque no saturo tanto el sistema como con un pwm.

Para que me entiendan lo anterior, les pongo aqui otro ejemplo:
1 2 4 8 16 32 64 128 = Binario entradas de puerto B
1 3 7 15 31 63 127 255 = La suma de cada uno que enciendo que es el PWM
0 0 0 1 1 0 1 0 = El resultado 1 es encendido y 0 es apagado, y esto da una frecuencia de 15 +31+127=173

Lo que quisiera saber, es cómo hago el PWM con un pin o pata sin saturar tanto el sistema. Es para un motor

Estoy programando en PICBasic Pro y la verdad soy bastante nuevo.
No importa si es en C, también me lo acepta.

Este es el código que me aparece en el vídeo:
PHP:
define osc 4

trisa= 0

trisb=255

dato var byte
i var byte

inicio:
dato=portb

for i= 1 to dato
porta.0 = 1
pause 1
next i

for i=1 to (255-dato)
porta.0=0
pause 1
next i
goto inicio
goto inicio

De antemano, gracias.
 
Última edición por un moderador:
Hola. En principio el programa está bien. No es la única forma pero funcionaría, ya que según el valor que tenga la variable dato, te dará el duty del PWM, y NO la frecuencia. de salida.
 
Última edición por un moderador:
Lo que pasa para hacer un PWM se debe primero hacer o más bien fijar una frecuencia, digamos.

Por ejemplo, una frecuencia de 100Hz que son 10 ms.

Con eso ya casi tenemos todo nuestro PWM y solamente se va a encender un pin una parte del tiempo de nuestro PWM, a lo que le llaman ciclo de trabajo.

En algoritmo sería así como este ejemplo:

fijar frecuencia 100Hz

si ciclo de trabajo <= frecuencia
prender pin

si no
apagar pin


Para obtener un PWM, la frecuencia de trabajo se va a dividir en 255 partes, que es un byte.
Digamos que 100 Hz. lo cortamos en 255 partes.

100 Hz. =10 ms.

10 ms/ 255 = 39 us.

Entonces necesitamos, o un retardo de 39us o un timer que desborde cada 39 us.

Ahora en código en C, sería más o menos así:
Código:
int contador

while(1)
{
//fijamos una frecuencia a 255
if(contador>=255)
{
contador =0;
}



contador++;
delay_us(39);
}
Ahora falta el ciclo de trabajo, eso lo debe definir uno ya sea por RS232, una variable fija o un ADC ;)
Código:
int contador
int pwm=155; //este pwm esta a 155 como ejemplo

while(1)
{
//fijamos una frecuencia a 255
if(contador>=255)
{
contador =0;
}


[COLOR=Red]if(pwm>= contador)
{
output_high(pin_b1); // se prendera el pin

}

else

{
output_low(pin_b1); se mantiene apagado
}[/COLOR]



contador++;
delay_us(39);
}
 
Última edición por un moderador:
Ok. Gracias, lo voy a checar. Gracias por la ayuda.

---------- Actualizado después de 1 hora ----------

Una pregunta. ¿Cuando se encienda el pin será con esa frecuencia, verdad?
¿Sabes si se puede usar sin el high y low?

Así cómo esto:
PHP:
if(pwm>= contador)
{
output_high(pin_b1); // se prenderá el pin
// En picbasic pro podría ser más o menos así:
// portb.1=1)
// Porque tengo la duda porque lo usare con puente h y no si agarre con high  y low, supongo, pero probaré.
}
 
else
 
{
output_low(pin_b1); // Se mantiene apagado
}
Agradeciendo de nuevo la ayuda.
 
Última edición por un moderador:
claro que se puede usar otra directiva que no sean propias del CCS

eso se hace declarando los TRIS bits del puerto del pic

ejemplo

declaramos un pin del puerto y lo llamo servo

servo;

if(pwm>= contador)
{
servo=1;
}

else

{
servo=0;
}
 
Atrás
Arriba