Autor Tema: problemilla con el PWM  (Leído 2875 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado newells5

  • PIC10
  • *
  • Mensajes: 18
problemilla con el PWM
« en: 24 de Marzo de 2006, 10:39:00 »
Bueno os cuento lo que pasa...

Tengo que hacer un programa que dependiendo del estado de 8 interruptores varie la velocidad de un motor de corriente continua, y tengo que hacerlo con el PWM.

Este ejercicio ya le hice en assembler y funcionó perfectamente pero en C soy incapaz de hacerle andar.

Yo me manejo bastante bien en ensamblador pero quiero aprender C y me cuesta, ya que hago las cosas con instrucciones en C pero sigo pensando con 1 y 0.

Aqui os dejo el código que he hecho, que yo creo que no hace falta más, pero no se... tampoco pondria la mano en el fuego.

#include "C:SJD2OSCARPIC C5 velocidad motorPWM.h"

#byte PORTB = 0x06

void main()
{
   int B;
   set_tris_B(11111111);
   set_tris_C(11111011);
   
   SET_TIMER2(0xAA);
   SETUP_TIMER_2(T2_DIV_BY_4,0xF0,1);

   SETUP_CCP1(CCP_PWM);
   do{
      B = PORTB;
      SET_PWM1_DUTY(B);
   }while(true);
}

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
RE: problemilla con el PWM
« Respuesta #1 en: 24 de Marzo de 2006, 10:45:00 »
Me parece que va a funcionar.

Sólo leerá el estado de los interruptores una vez, el programa no es cíclico. Tienes que reiniciar el PIC o cortarle la energía para que se cambie la velocidad del motor.

Talvez si agregas...

while(1)
{
B=PORTB;
SET_PWM1_DUTY(B);
}

Eso leerá el puerto B y actualizará la velocidad del motor.

Si no te interesa que el motor actualice su velocidad, el programa está bien.

Otra cosa, talvez quieras subir el pwm.h que estás incluyendo, ese no lo he visto.

Desconectado newells5

  • PIC10
  • *
  • Mensajes: 18
RE: problemilla con el PWM
« Respuesta #2 en: 24 de Marzo de 2006, 10:48:00 »
ya me di cuenta del bucle, lo edite a la vez que respondiste   ^_^

en el PCW.h solo tengo los fuses y la frecuencia

#include <16F877.h>
#FUSES NOWDT, XT, NOPUT, NOPROTECT, BROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=4000000)


PMuchas risas:: con el bucle creado sigue sin rular...

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
RE: problemilla con el PWM
« Respuesta #3 en: 24 de Marzo de 2006, 10:51:00 »
Ya me acordé... la instrucción...

SET_PWM1_DUTY(B);

utiliza un dato del tipo de 16bits.

Declara B como int 16:

int16 B;

Prueba y avísame que pasa.

Desconectado newells5

  • PIC10
  • *
  • Mensajes: 18
RE: problemilla con el PWM
« Respuesta #4 en: 24 de Marzo de 2006, 10:51:00 »
No sus lo vais a creer, estoy empleando 3 tarjetas, una con un motor, otra con interruptores y la picdem.

me faltaba referenciar la masa de los interruptores....   lalalalala

Desconectado newells5

  • PIC10
  • *
  • Mensajes: 18
RE: problemilla con el PWM
« Respuesta #5 en: 24 de Marzo de 2006, 10:59:00 »
He probado con "int" y con "long int" y funciona exactamente igual.

Voy a seguir haciendo ejercicios en C con CCP en comparacion, si me atasco me asomo x aki     Muchas risasMuchas risasMuchas risasMuchas risas

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
RE: problemilla con el PWM
« Respuesta #6 en: 24 de Marzo de 2006, 11:03:00 »
Solo se me ocurre que los cálculos de tu PWM estén mal.

O la conexión de tu motor ande fallando.

O que haya que hacer un casting...

B=(int16)PORTB;

¿Qué es exactamente lo que hace?

Desconectado newells5

  • PIC10
  • *
  • Mensajes: 18
RE: problemilla con el PWM
« Respuesta #7 en: 24 de Marzo de 2006, 11:09:00 »
Que ya esta solucionado, funciona perfectamente, el problema (a parte de que no hice el bulce) es que no habia referenciado la masa de la tarjeta de los interruptores.

El ejercicio funciona perfectamente. Ahora estoy haciendo lo mismo pero metiendo el valor al PWM con un potenciómetro a traves del conversor A/D.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
RE: problemilla con el PWM
« Respuesta #8 en: 24 de Marzo de 2006, 11:13:00 »
Ahh pensaba que no funcionaba. Qué bien.

Desconectado newells5

  • PIC10
  • *
  • Mensajes: 18
RE: problemilla con el PWM
« Respuesta #9 en: 24 de Marzo de 2006, 11:53:00 »
Arriba esta el programa para controlar la velocidad de un motor CC dependiendo del estado de 8 interruptores. Aqui os dejo el siguiente que he hecho, que es tambien para controlar la velocidad de un motor CC, pero esta vez con un potenciometro.

Ya se que es muy basico y tal, pero si a alguien le interesa, pos ahi lo tiene...

////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
/////                                                                              /////
/////   Hacer un programa que varie la velocidad de un motor de CC dependiendo     /////
/////   del estado de un potenciometro. Emplear el conversor A/D y el PWM.         /////
/////                                                                              /////
////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////

#include "C:SJD2OSCARPIC C7 ADC2ADC02.h" //fuses y frecuencia de reloj

#include <lcd_picdem.c>  //libreria del LCD

void main()      //PROGRAMA PRINCIPAL
{
   unsigned int i = 0x00;
   float const c = 5.0/256.0;      //constante para la conversion A/D
   float final;
   set_TRIS_C(11111011);         //RC2 salida
   SETUP_CCP1(CCP_PWM);         //CCP1 como PWM
   SET_TIMER2(0xAA);            //cargo 0xAA en el timer 2
   SETUP_TIMER_2(T2_DIV_BY_4,0xF0,1);   
   RA0_ANALOG;               
   setup_ADC(ADC_CLOCK_INTERNAL);
   set_adc_channel(0);
   delay_us(50);
   do
   {
      i = read_adc();         //lee el valor del potenciometro
      final = i*c;         //pasa el valor a un rango de 0 a 5
      lcd_init();
      lcd_gotoxy(1,1);
      printf(lcd_putc,"Valor: %u",i);      //muestro la lectura 0-256
      lcd_gotoxy(1,2);
      printf(lcd_putc,"%fV",final);      //muestro la lectura 0-5
      SET_PWM1_DUTY(i);               //cargo el valor 0-256 al PWM
      delay_ms(100);
   }while(true);
}


El archivo ADC02.h

#include <16F877.h>
#FUSES NOWDT, XT, NOPUT, NOPROTECT, BROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=4000000)


 

anything