8 Canales de PWM con un 16F628A

Hola, he estado utilizando el PWM recientemente, pero me gustaría sacar 3 pwm duty distintos en el puerto B
(RB0,RB1 Y RB2), para mover 3 pequeños motores DC, sinceramente no sé como hacerlo, pero lo he intentado.
Les dejo mi código en CCS.

Código:
#include <16f887.h>
#fuses nomclr,nolvp,noprotect
#use delay (clock=4m)
#byte portb=6
#byte trisb=0x86

#bit bit_pwm0= portb.0
#bit bit_pwm1= portb.1
#bit bit_pwm2= portb.2

void main (void){

int8 pwm0, pwm1, pwm2;

setup_ccp1(ccp_pwm);
setup_timer_2(t2_div_by_16,124,1);

while(1){
pwm0=31;
set_pwm1_duty(pwm0);
delay_ms(2000);

pwm1=62;
set_pwm1_duty(pwm1);
delay_ms(2000);

pwm2=93;
set_pwm1_duty(pwm2);
delay_ms(2000);
}
}

PD: ya lo simule pero no hace nada
 

Adjuntos

  • CC.PNG
    CC.PNG
    54.7 KB · Visitas: 23
Última edición por un moderador:
Sinceramente no se como se programa esta cosa, a PWM le veo muchas opciones así que no se si con un código tan simple se configure todo, pero según el data sheet en este PIC el PWM es en los pines RC2(P1A), RD5(P1B), RD6(P1C), RD7(P1D), no los que estas utilizando.

veo que estas repitiendo set_pwm1_duty(pwm0); y solo alteras el valor, no se si los otros dos sean con set_pwm2_duty(pwm1); set_pwm3_duty(pwm2); pero al menos pareciera que el pin si está respondiendo por que veo un cuadrito rojo marcado en el correspondiente a P1A y no configuraste nada para RC2.
 
Última edición:
Que tal comunidad.

Voy directo al grano: Lean detenidamente este link; 8 Canales de PWM con un 16F628A antes de seguir, ya que sobre esa publicacion se basan mis dudas/preguntas.

!
te hago una pregunta clave:

esa persona , cuales son las caracteristicas de los PWM que programa ??
por que , (segun mi idea) usando interrupcion no es lo mismo que el PWM de mayor frecuencia tenga 50 Khz (y me deje solo 80 ck para instrucciones entre interrupciones , o sea nada ) .
que la maxima frecuencia de PWM sea de 5 Khz con lo cual dispongo entre interrupciones de 800 ck (ya es otra cosa) .
 
Sinceramente no se como se programa esta cosa, a PWM le veo muchas opciones así que no se si con un código tan simple se configure todo, pero según el data sheet en este PIC el PWM es en los pines RC2(P1A), RD5(P1B), RD6(P1C), RD7(P1D), no los que estas utilizando.

veo que estas repitiendo set_pwm1_duty(pwm0); y solo alteras el valor, no se si los otros dos sean con set_pwm2_duty(pwm1); set_pwm3_duty(pwm2); pero al menos pareciera que el pin si está respondiendo por que veo un cuadrito rojo marcado en el correspondiente a P1A y no configuraste nada para RC2.

HOLA, Gracias por tu pronta respuesta, realmente si se puede manejar el pwm por medio del puesrto b, de hecho ya hay un programa asi, solo que no lo comprendo, y yo utilizo el pwm1 para generar la onda, lo unico que se cambia es el duty cycle pero lo que no se es como pasarlo al puerto b



te hago una pregunta clave:

esa persona , cuales son las caracteristicas de los PWM que programa ??
por que , (segun mi idea) usando interrupcion no es lo mismo que el PWM de mayor frecuencia tenga 50 Khz (y me deje solo 80 ck para instrucciones entre interrupciones , o sea nada ) .
que la maxima frecuencia de PWM sea de 5 Khz con lo cual dispongo entre interrupciones de 800 ck (ya es otra cosa) .

concuerdo, creo que preguntó sin tener una idea clara del pwm
 
Última edición:
Entonces será PWM por Software, un contador que incrementa por interrupciones de un timer, la salida inicia en H, cuando el contador alcanza el valor deseado del duty cycle la salida se pone en L, cuando el contador alcanza el limite se reinicia y manda las salidas a H nuevamente, usando esto se puede hacer PWM en todos los GPIO del MCU.
 
si, basicamente es contar y cuando se llega se ejecuta (el cambio) .
no es complicado con soft. es mas.......es repetitivo, asi que se diseña bien y listo , se repite .
pero como se dijo si la frecuencia maxima , (o el periodo minimo ) es muy pequeño se corre el riesgo (seguro ) de que se la pase "interrumpiendo " al programa principal, y es mas, casi hasta ni ejecutar.

por eso un tema es saber con coherencia de pwm y que tiempos se pueden .
luego me parece que hay otra, usando un solo micro y sin pedirle exigencias se puede hacer un poquito mas eficiente.

yo hace mucho estoy lejos de programar y lo hacia en asm, no se lso recursos de hoy dia.

pero si puedo generar 2 interrupciones distintas y entonces tener:
1 programa principal .(PP)
2 dos programas secundarios que corren bajo interrupciones.

asi separo, digamos que exijo solo un pwm de alta frecuencia , pues el timer que hace de base te tiempo para este llama a una interrupcion que tiene lo justo, solo para verificar, incrementar contador y accionar flags necesarios de ese solo pwm .
asi si tengo muchas interrupciones seguidas por culpa de ese timer, pero me consumen pocas instrucciones.

igual , hay que ver que hace el PP, para mi eso es hilar fino, no sea cosa que el PP este en cosas raras y cada rato una interrupcion.
es cosa de estar empapado en el tema, yo ya no lo estoy y ver si no se hace demasiado molesto.


luego los demas PWM que son de baja frecuencia, pues esos no problem.
un PWM es contar, comparar registros y cuando llega al valor cambiar la salida, asi que de dificil no tiene absolutamente nada .
 
Última edición:
Entonces será PWM por Software, un contador que incrementa por interrupciones de un timer, la salida inicia en H, cuando el contador alcanza el valor deseado del duty cycle la salida se pone en L, cuando el contador alcanza el limite se reinicia y manda las salidas a H nuevamente, usando esto se puede hacer PWM en todos los GPIO del MCU.

Asi es my friend, eso es lo que hago, ya se como generarlo en el pin del ccp pero no se como hago el codigo para que ese valor del ccp me lo mande a un pin del puerto b, mi idea era controlar 3 motores . saludos



si, basicamente es contar y cuando se llega se ejecuta (el cambio) .
no es complicado con soft. es mas.......es repetitivo, asi que se diseña bien y listo , se repite .
pero como se dijo si la frecuencia maxima , (o el periodo minimo ) es muy pequeño se corre el riesgo (seguro ) de que se la pase "interrumpiendo " al programa principal, y es mas, casi hasta ni ejecutar.

por eso un tema es saber con coherencia de pwm y que tiempos se pueden .
luego me parece que hay otra, usando un solo micro y sin pedirle exigencias se puede hacer un poquito mas eficiente.

yo hace mucho estoy lejos de programar y lo hacia en asm, no se lso recursos de hoy dia.

pero si puedo generar 2 interrupciones distintas y entonces tener:
1 programa principal .(PP)
2 dos programas secundarios que corren bajo interrupciones.

asi separo, digamos que exijo solo un pwm de alta frecuencia , pues el timer que hace de base te tiempo para este llama a una interrupcion que tiene lo justo, solo para verificar, incrementar contador y accionar flags necesarios de ese solo pwm .
asi si tengo muchas interrupciones seguidas por culpa de ese timer, pero me consumen pocas instrucciones.

igual , hay que ver que hace el PP, para mi eso es hilar fino, no sea cosa que el PP este en cosas raras y cada rato una interrupcion.
es cosa de estar empapado en el tema, yo ya no lo estoy y ver si no se hace demasiado molesto.


luego los demas PWM que son de baja frecuencia, pues esos no problem.
un PWM es contar, comparar registros y cuando llega al valor cambiar la salida, asi que de dificil no tiene absolutamente nada .

oye tu sabes como puedo controlas 3 motores con pwm en el puesrto b?, arriba tengo mi duda, me podrias ayudar?
 
Última edición:
Atrás
Arriba