TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: alejosro en 04 de Noviembre de 2009, 14:44:01

Título: controlar Motor con adc y pwm
Publicado por: alejosro 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 );


}
Título: Re: controlar Motor con adc y pwm
Publicado por: MLO__ 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
Título: Re: controlar Motor con adc y pwm
Publicado por: alejosro 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
Título: Re: controlar Motor con adc y pwm
Publicado por: MLO__ en 05 de Noviembre de 2009, 11:25:30
 :?

Recuerdo que me funciono .... voy a buscar la simulación y veo