Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

28/06/2015 #1


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:
Código PHP:
define osc 4

trisa
0

trisb
=255

dato 
var byte
var byte

inicio
:
dato=portb

for i1 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.
28/06/2015 #2

Avatar de Gudino Roberto duberlin

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.
28/06/2015 #3


gracias solo una duda que es fcia?
28/06/2015 #4
Moderador general

Avatar de Fogonazo

carlosalberto1997 dijo: Ver Mensaje
gracias solo una duda que es fcia?
Frecuencia es un valor numérico que indica la cantidad de repeticiones de un acontecimiento periódico en una unidad de tiempo.
28/06/2015 #5


o ya entiendo es que la frecuencia no la había visto asi gracias
28/06/2015 #6

Avatar de TRILO-BYTE

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;
}


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

}

else

{
output_low(pin_b1); se mantiene apagado
}



contador++;
delay_us(39);
}
28/06/2015 #7


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:
Código 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.
29/06/2015 #8

Avatar de TRILO-BYTE

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;
}
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.