Ayuda para manejar PWM con Mikro C

hola como estan. espero que bien...

tengo problema para manejar PWM del PIC16F877A.

lo que quiero hacer en manejar dos motores con PWM (CCP1 y CCP2). si tengo apretado el button PORTA.F0 y aprieto el button PORTA.F5 el PWM1_Change_Duty y PWM_Change_Duty aumente o que si el button PORTA.F0 y aprieto el button PORTA.F4 el el PWM1_Change_Duty y PWM_Change_Duty disminuya hasta lo minimo que es los 20 del valor de la variable "dato"

no se si esta vien escrito el codigo o algo se me esta pasando..

el codigo:

Código:
unsigned int dato;
void main(){
   PWM1_Init(40000);
   PWM2_Init(40000);
   PORTA=0x00;
   TRISA=0xFF;
   PORTC=0x00;
   TRISC=0x00;
   PORTD=0x00;
   TRISD=0x00;
   PWM1_Start();
   PWM2_Start();
   while(1){
      dato=20;
      if(PORTA.F0){
         PORTD=0x01;
         while(PORTA.F0){
            if((PORTA.F5)&&(dato<255)&&(!PORTA.F4)){
               Delay_ms(200);
               dato=dato+80;
            }
            PWM1_Change_Duty(dato);
            PWM2_Change_Duty(dato);
         }
      }
   }
   Delay_ms(200);
}
y subo la foto del circuito ..

Espero que me puedan orientar y darme una mano..

muchas gracias por la ayuda..
 

Adjuntos

  • simulacion2.png
    simulacion2.png
    294.9 KB · Visitas: 55
sdel:

gracias por responder..

si trae dos CCP porque lo probe primero menajendo dos motore directos y lo regulaba por otro puerto por medio de un pote de 1k...
 
Hola, bien lo que yo veo en el codigo es que en el bucle principal inicias dato en 20. por lo que cualquier cambio que hagas despues no se va a notar porque inmediatamente vuelve a tener el valor 20, fijate si inicalizas en otro lado fuera del bucle principal. y en el esquema que subiste me parece que tendrias que conectar mclr a vcc.


cuando corres la simulación no hace nada?
 
Última edición:
Hola, bien lo que yo veo en el codigo es que en el bucle principal inicias dato en 20. por lo que cualquier cambio que hagas despues no se va a notar porque inmediatamente vuelve a tener el valor 20, fijate si inicalizas en otro lado fuera del bucle principal. y en el esquema que subiste me parece que tendrias que conectar mclr a vcc.


cuando corres la simulación no hace nada?

eso 20 es para dejar la en la minima velocidad cuando dejo de apretar el button en el pin RA0 en mi caso es "20".


aclaro que el circuito es para manejar los 2 motores, para avance, retroceso, giro izquierdo y derecho.

mclr y vcc no son necesarios va en todos los casos que realize nunca me molesto.



Perdon, pero lo primero que veo es varios errores en el esquematico, no todos los transistores deben ser NPN!

gracias por responde...

ya modifique el esquema pero aun no puedo hacerlo andar...

emula pero por la PORTD.F0 tiera low y heigh nada mas...

alli subo una imagen del cambio
 

Adjuntos

  • Sin título.png
    Sin título.png
    268.1 KB · Visitas: 40
Última edición:
Q9 y Q10 tambien deberias cambiarlos por transistores PNP ! y como la tension es de 12 V a esos transistores los vas a tener que polarizar con unos BC337,sinoquemaras elpuerto del PIC

Saludos!

También te están faltando todas las resistencias de base delos transistores del "Puente H"

Y las bases de los transistores PNP del puente también deberás dispararlos mediante otros transistores NPN para no quemar el puerto del PIC
 
Última edición:
Q9 y Q10 tambien deberias cambiarlos por transistores PNP ! y como la tension es de 12 V a esos transistores los vas a tener que polarizar con unos BC337,sinoquemaras elpuerto del PIC

Saludos!

También te están faltando todas las resistencias de base delos transistores del "Puente H"

Y las bases de los transistores PNP del puente también deberás dispararlos mediante otros transistores NPN para no quemar el puerto del PIC

bueno lo cambien por este circuito que esta en la imagen adjuntada...

pero lo que me pasa es que el codigo no responde a lo que escribi y no se que es lo que le sucede.. escribi uno mas basico pero ni aun asi lo hace..

este e s el codigo

Código:
unsigned int dato;
void main(){
   PWM1_Init(5000);
   PWM2_Init(5000);
   PORTA=0x00;
   TRISA=0xFF;
   PORTC=0x00;
   TRISC=0x00;
   PWM1_Start();
   PWM2_Start();
   while(1){
      if(!PORTA.F0){
        PWM1_Change_Duty(200);
      }
      if(!PORTA.F1){
        PWM2_Change_Duty(200);
      }
   }
   Delay_ms(200);
}

agradeceria mucho la ayuda
 

Adjuntos

  • Sin título3.png
    Sin título3.png
    226.5 KB · Visitas: 22
hola, intenta con

PWM1_Set_Duty(200);

y no

PWM1_Change_Duty(200);

con PWM1_Set_Duty(200); no funciona porque las librerias de PWM en MikroC son;

PWM_Start();
PWM_Stop();
PWM_Change_Duty();
PWM_Init();


pero igual las probe;;;;

la verdad que no entiendo del porque no funciona si el codigo es algo re basico...

capaz que debe ser el compilador o estoy pensando para el or...t....o...

no se que alguien me tire otras ayuditas xq ya va una semana y no puedo hacerlo andar...

muchas gracias por las respuestas
 
que raro, entonces tendras alguna version de mikroc que desconozco yo compile tu codigo y me da error en esas lineas, y en la libreria de pwm tengo esto:

PWM1_Init
PWM1_Set_Duty
PWM1_Start
PWM1_Stop

mira, hice unas modificaciones y te subo un codigo de ejemplo, funciona bien:

Código:
unsigned short dato;
unsigned short dato1;
void main(){
   PWM1_Init(3000);
   PWM2_Init(3000);
   TRISA=0xFF;
   PORTA=0x00;
   PORTC=0x00;
   TRISC=0x00;
   PWM1_Start();
   PWM2_Start();
   dato = 0;
   dato1 = 0;
   while(1){
        if(dato < 1000) dato = dato + 10;
        else dato= 0;
        PWM1_Set_Duty(dato);

        if(dato1 < 1000)dato1 = dato1 + 10;
        else dato1 = 0;
        PWM2_Set_Duty(dato);


        Delay_ms(100);
   }

}

los pulsadores te diria que los uses en el puerto b, con interrupciones. el delay que tenias al final estaba demas, bueno probalo espero que te sirva.

tambien te adjunto el archivo de proteus, el codigo en c y el hex para que lo cargues al proteus, lo acabo de probar aca en el trabajo. saludos
 

Adjuntos

  • pwm.zip
    14.6 KB · Visitas: 120
  • pwm.jpg
    pwm.jpg
    71.6 KB · Visitas: 37
Última edición:
ahi subi el adjunto

muchas gracias por responde ...

parece que es el compilador yo uso MIKRO C 8.2

tu codigo funciona muy bien en proteus 7.8

te subo una imagen para que veas que las librerias son total mente diferentes....

en el PORTB ta teng unos bottones pero las uso para manejar las luces y estan con interrupciones.

con los del PORTA queria manegar lo que es giro, avance, retoceso y velocidad...

me podes decir con que version lo hiciste asi pruebo esa......

muchas gracias por responder
 

Adjuntos

  • Sin título.png
    Sin título.png
    272.4 KB · Visitas: 29
listo... cambie de compilador de mikroc8.2 a mikroc MCU 4,6 y funciona muy bien lo de PWM..

Hora voy a escribir mi codigo y ver que onda esta version..

muchas gracias sdel
 
Buenas, he estado trabajando en un pwm en mikroc y tengo problemas,
la idea es que ingreso un número por teclado matricial 4x4 y este me indica en un lcd el porcentaje de velocidad
y define la velocidad que mueve un motor.

Este es el código en el que trabajo.
Código:
/*Esta variable debe estar definida en todos los proyectos por medio de la librería Keypad.
Así se define el puerto utilizado para conectar el teclado */
char keypadPort at PORTC;

//Pines de salida para el LCD
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D7 at RB3_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D4 at RB0_bit;

//Bits de configuración TRIS
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D7_Direction at TRISB3_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D4_Direction at TRISB0_bit;

char kp,
contador=0;

void main() {               //Inicio de programa

      OSCCON= 0x60;         //Oscilador interno a 4MHz.
      ANSEL = 0x00;         //Todos los pines de E/S se confguran como digitales
      ANSELH= 0x00;
      PORTA = 0x00;         //Estado inicial del puerto PORTA
      TRISA = 0xFF;         //Todos los pines del puerto PORTA se configuran como entradas
      PORTB = 0x00;         //Estado inicial del puerto PORTB
      TRISB = 0x00;         //Todos los pines del puerto PORTB se configuran como salidas
      PWM1_Init(5000);      //Inicialización del módulo PWM (5 KHz)
      PWM1_Start();         //Inicialización del módulo PWM1
      
           Keypad_Init();                       //Inicializa el teclado.
           Lcd_Init();                          //Inicialización del visualizador LCD
           Lcd_Cmd(_LCD_CURSOR_OFF);            //Comando LCD (apagar el cursor)
           Lcd_Cmd(_LCD_CLEAR);                 //Comando LCD (borrar el LCD)
           Lcd_Out(1,3,"Control PWM.");

           do{
                kp=0;
                do                         //Espera por una tecla.
                kp=Keypad_Key_Click();     //Lee el número de la tecla y lo guarda en kp.
                while (!kp);
                      switch (kp){
                      case  1: kp = 49;                                  //49 es el código ASCII del número 1.
                               Lcd_Out(2,4,"Velocidad 10%");
                               PWM1_Set_Duty(26);                        // Establece ciclo de trabajo
                               break;
                      case  2: kp = 50;                                  //2
                               Lcd_Out(2,4,"Velocidad 20%");
                               PWM1_Set_Duty(52);                        // Establece ciclo de trabajo
                               break;
                      case  3: kp = 51;                                  //3
                               Lcd_Out(2,4,"Velocidad 30%");
                               PWM1_Set_Duty(78);                        // Establece ciclo de trabajo
                               break;
                      case  4: kp = 65;                                  // A
                               Lcd_Out(2,4,"Pulse un numero");
                               break;
                      case  5: kp = 52;                                  // 4
                               Lcd_Out(2,4,"Velocidad 40%");
                               PWM1_Set_Duty(104);                       // Establece ciclo de trabajo
                               break;
                      case  6: kp = 53;                                  // 5
                               Lcd_Out(2,4,"Velocidad 50%");
                               PWM1_Set_Duty(130);                       // Establece ciclo de trabajo
                               break;
                      case  7: kp = 54;                                  // 6
                               Lcd_Out(2,4,"Velocidad 60%");
                               PWM1_Set_Duty(156);                       // Establece ciclo de trabajo
                               break;
                      case  8: kp = 66;                                  //B
                                Lcd_Out(2,4,"Pulse un numero");
                                break;
                      case  9: kp = 55;                                  // 7
                               Lcd_Out(2,4,"Velocidad 70%");;
                               PWM1_Set_Duty(182);                       // Establece ciclo de trabajo
                               break;
                      case 10: kp = 56;                                  // 8
                               Lcd_Out(2,4,"Velocidad 80%");
                               PWM1_Set_Duty(208);                       // Establece ciclo de trabajo
                               break;
                      case 11: kp = 57;                                  // 9
                               Lcd_Out(2,4,"Velocidad 90%");
                               PWM1_Set_Duty(230);                       // Establece ciclo de trabajo
                               break;
                      case 12: kp = 67;                                  // C
                                Lcd_Out(2,4,"Pulse un numero");
                                break;
                      case 13: kp = 42;                                   // *
                                Lcd_Out(2,4,"Pulse un numero");
                                break;
                      case 14: kp = 48;                                  // 0
                               PWM1_Set_Duty(0);                         // Establece ciclo de trabajo
                               Lcd_Out(2,4,"Velocidad 0%");
                               break;
                      case 15: kp = 35;                                  // #
                               Lcd_Out(2,4,"Pulse un numero");
                               break;
                      case 16: kp = 68;                                  // D
                               Lcd_Out(2,4,"Pulse un numero");
                               break;

                      }
                  contador++;                     //Cuenta el número de pulsaciones.
                      if (contador==2)           //Si se han efectuado 2 pulsaciones.
                       {
                        contador=0;
                        Delay_ms(1000);            //Espera 1 s.
                        }

              }while(1);
}
Agradecería que me ayuden porque no logro mover el motor.
 
Última edición por un moderador:
Hola a todos. Tengo un problema con el PWM.
He hecho todo el código y no me bota ningún error, pero al momento de simularlo en proteus no me sale nada, las salidas C1 y C2 están siempre en bajo. ¿Porque podría estar pasando esto?

Aquí dejo mi código, tal vez me este olvidando en inicializar algo.

Código:
void MCU_init(){
 PORTD = 0x00;
 TRISA = 0xFF;
 TRISB = 0xFF;
 TRISD = 0x00;
 TRISC = 0x80;
}

int current_duty;

void intensidad(){
 if(RB0_bit==1){
  //Delay_ms(50);
  current_duty++;
  PWM1_Set_Duty(current_duty);
 }
 if(RB1_bit==1){
  Delay_ms(50);
  current_duty--;
  PWM1_Set_Duty(current_duty);
 }
}

 
void main() {
 MCU_init();
 UART1_Init(9600);
 current_duty = 32;
 PWM1_Init(1000);
 PWM1_Start();
 PWM1_Set_Duty(current_duty);
 while(1){
   intensidad();}
}
 
Última edición por un moderador:
Atrás
Arriba