Autor Tema: controlar Motor con adc y pwm  (Leído 2345 veces)

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

Desconectado alejosro

  • PIC10
  • *
  • Mensajes: 3
controlar Motor con adc y pwm
« en: 04 de Noviembre de 2009, 14:44:01 »
Hola todos, porfavor si me puede ayudar les agradezco, estoy tratando mediante un potencimetro realizar el control de velocidad de un motor, me funciona pero no con la maxima resolucion del PWM. es decir solo un rango del poteciometro, que tendre mal en codigo?

Gracias

Código: [Seleccionar]
#include <p18f452.h>
#include <delays.h>
#include <adc.h>
#include <stdio.h>
#include <stdlib.h>
#include <pwm.h>
long ciclo;
int y;
int z;
/*DESHABILITACION DE WDT, LVP*/
#pragma romdata CONFIG
_CONFIG_DECL(_CONFIG1H_DEFAULT & _OSC_HS_1H,\
             _CONFIG2L_DEFAULT,\
             _CONFIG2H_DEFAULT & _WDT_OFF_2H,\
             _CONFIG3H_DEFAULT,\
             _CONFIG4L_DEFAULT & _LVP_OFF_4L,\
             _CONFIG5L_DEFAULT,\
             _CONFIG5H_DEFAULT,\
             _CONFIG6L_DEFAULT,\
             _CONFIG6H_DEFAULT,\
             _CONFIG7L_DEFAULT,\
             _CONFIG7H_DEFAULT);


void main (void)

{
OpenADC( ADC_FOSC_16 & ADC_RIGHT_JUST & ADC_8_TAD & ADC_8ANA_0REF,ADC_CH0 & ADC_INT_OFF );
Delay10TCYx( 5 ); // Delay for 50TCY
ConvertADC(); // Start conversion
while( BusyADC() ); // Wait for completion
y = ReadADC(); // Read result
CloseADC(); // Disable A/D converter
TRISD= 0b11100000;
OpenPWM1(0xff);
PORTDbits.RD2=1;
PORTDbits.RD1=1;

z=y*1.246;






SetDCPWM1(z);
//Delay10TCYx( 50 );
//PORTDbits.RD3 == 3;
//Delay10TCYx( 50);
//PORTDbits.RD4 == 4;
//Delay10TCYx( 50 );


}

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: controlar Motor con adc y pwm
« Respuesta #1 en: 05 de Noviembre de 2009, 01:07:08 »
Hola.

Tambien visualiza el Dutty Cicle en una LCD.

Código: C#
  1. #include <p18f452.h>
  2. #include <adc.h>
  3. #include <timers.h>    
  4. #include <pwm.h>               
  5. #include <delays.h>
  6. #include <xlcd.h>              
  7. #include <stdlib.h>
  8.  
  9. int s1,i;
  10. char pwm[2];
  11.  
  12. void main (void)
  13. {      
  14.        
  15.         OpenADC( ADC_FOSC_64 & ADC_RIGHT_JUST & ADC_5ANA_0REF, ADC_CH0 & ADC_INT_OFF );
  16.         OpenTimer2(T2_PS_1_16);
  17.         OpenPWM1(0xff);
  18.         OpenXLCD(FOUR_BIT & LINES_5X7);
  19.  
  20.         for(;;)
  21.                 {
  22.                         WriteCmdXLCD(BLINK_OFF & CURSOR_OFF);
  23.                         SetChanADC(ADC_CH1);
  24.                         Delay10TCYx( 5 );              
  25.                         ConvertADC();                          
  26.                         while( BusyADC() );                                                            
  27.                         s1 = ReadADC();
  28.                         SetDCPWM1(s1);
  29.                         s1 = 100- ((s1/10))-1;
  30.  
  31.                         itoa(s1,pwm);
  32.                         while(BusyXLCD());
  33.                         SetDDRamAddr(0x80);
  34.                         putrsXLCD("D.C:");
  35.                         while(BusyXLCD());
  36.                         putsXLCD(pwm);
  37.                         WriteDataXLCD(0x20);
  38.                         putrsXLCD("% ");
  39.                        
  40.                        
  41.        
  42.                 }
  43.         ClosePWM1();   
  44.         CloseTimer2();  
  45.         CloseADC();                                    
  46. }
  47.  
  48.  
  49. //OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO       RETARDOS        LCD             OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO000000000000000000000000000000000000000000000000000000000000000000000000
  50.  
  51. void DelayFor18TCY( void )
  52. {
  53. Nop();
  54. Nop();
  55. Nop();
  56. Nop();
  57. Nop();
  58. Nop();
  59. Nop();
  60. Nop();
  61. Nop();
  62. Nop();
  63. Nop();
  64. Nop();
  65. }
  66. void DelayPORXLCD( void )
  67. {
  68. Delay1KTCYx(60); //Delay of 15ms
  69. return;
  70. }
  71. void DelayXLCD( void )
  72. {
  73. Delay1KTCYx(20); //Delay of 5ms
  74. return;
  75. }

Segun veo en tu codigo, tu multiplicas el valor de la conversion por una constante, eso afecta el valor de carga para la funcion del PWM no?

Saludos
El papel lo aguanta todo

Desconectado alejosro

  • PIC10
  • *
  • Mensajes: 3
Re: controlar Motor con adc y pwm
« Respuesta #2 en: 05 de Noviembre de 2009, 11:20:08 »
Hola , Gracias por tu respuesta, pero lo que veo es que tu codigo coloca directamente el valor de la conversion den el dutycicle PR2 pero creo que no se puede porque el ADC es de 10bits y el registro es de 8 bits. la constante es para eso precisamente, pero creo q no me funciona bien porque no es la constante ..esto es lo nuevo que tengo
Código: [Seleccionar]
#include <p18f452.h>
#include <delays.h>
#include <adc.h>
#include <stdio.h>
#include <stdlib.h>
#include <pwm.h>
long ciclo;
float conversion;
int z;
/*DESHABILITACION DE WDT, LVP*/
#pragma romdata CONFIG
_CONFIG_DECL(_CONFIG1H_DEFAULT & _OSC_HS_1H,\
             _CONFIG2L_DEFAULT,\
             _CONFIG2H_DEFAULT & _WDT_OFF_2H,\
             _CONFIG3H_DEFAULT,\
             _CONFIG4L_DEFAULT & _LVP_OFF_4L,\
             _CONFIG5L_DEFAULT,\
             _CONFIG5H_DEFAULT,\
             _CONFIG6L_DEFAULT,\
             _CONFIG6H_DEFAULT,\
             _CONFIG7L_DEFAULT,\
             _CONFIG7H_DEFAULT);


void main (void)

{
OpenADC( ADC_FOSC_16 & ADC_LEFT_JUST & ADC_8ANA_0REF,ADC_CH0 & ADC_INT_OFF );
Delay10TCYx( 5 ); // Delay for 50TCY
ConvertADC(); // Start conversion
while( BusyADC() ); // Wait for completion
conversion = ReadADC(); // Read result
CloseADC(); // Disable A/D converter
TRISD= 0b11100000;
OpenPWM1(0xff);
PORTDbits.RD2=1;
PORTDbits.RD1=1;
z= conversion *0.0048875855327;
SetDCPWM1(z);
}

Les agradezco si me pueden ayudar gracuas

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: controlar Motor con adc y pwm
« Respuesta #3 en: 05 de Noviembre de 2009, 11:25:30 »
 :?

Recuerdo que me funciono .... voy a buscar la simulación y veo
El papel lo aguanta todo