CONTROL MOTOR 24VDC CON PWM - PART II

ya analizamos las primeras etapas del control de un motor DC con PWM, ahora concluiremos con las ultimas partes que nos quedan.

Sensores A y B
estos sensores deben de estar desfasados 90º, por tal motivo deberán de estar ubicados correctamente sobre el disco ranurado.


Conversor Frecuencia a Voltaje
con el LM331

con el LM2907
consideraciones: para evitar errores de carga y descarga de los capacitores internos de los conversores, se recomienda adaptar antes la señal que entrara al C F-V para que esta señal tenga cruze por cero. y esto se obtiene con un comparador.

Sentido de Giro
 diagrama de tiempos
 Layout
simulación aqui

Una vez ensamblado y probado cada bloque, solo resta armar el sistema completo.... y grabar el pic y realizar las pruebas necesarias.

Realize un programa en C para realizar estas pruebas, aca el codigo para CCS con el PIC 16f876a

/*
Titulo:  Programa prueba para comprobar en correctofuncionamiento
         del circuito armado: pic, C F-V, sentidos de giros, etc
Autor:   Americo Alvarez S.
Fecha:   10 diciembre del 2013
Ver.:    2 
*/
#include 16f876a.h
#device adc=10
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES HS                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected
#FUSES RESERVED                 //Used to set the reserved FUSE bits
#use delay(crystal=20000000)   //Cristal Utilizado 20MHz
#byte trisc=0x87
//----------------------variables globales
int16 ana;
float ANA0,ANA1;
//--------------------------------------------------------------------subrutinas
void ADC_RA0 (void)           //lectura ADC del canal AN0
{
   set_adc_channel(0);        //Habilitación canal analogico an0
   delay_us(20);              //T(ACQ)=caracteristico del micro
   ana = read_adc();          //leemos señal analogica 1 = referencia
   ANA0= ana*0.73;            //adaptamos señal considerando 5v = 750
}
void ADC_RA1 (void)           //lectura ADC del canal AN1
{
   set_adc_channel(1);        //Habilitación canal analogico an1
   delay_us(20);              //T(ACQ)=caracteristico del micro
   ana = read_adc();          //leemos señal analogica 2 = C F-V conversor F-V
   ANA1= (1.45*ana)-317.1;//adaptamos señal considerando ofsset y maximo  ---->>reducir operaciones 
   if(ANA1<=0)
        {ANA1=0;}
}
//------------------------------------------------------------programa principal
void main(void)
{
 setup_adc_ports(AN0_AN1_AN3);
 setup_adc(ADC_CLOCK_INTERNAL);
 setup_timer_2(T2_DIV_BY_16,249,1);  //frecuencia de pwm 1250 Hz aprox 1Kz
 setup_ccp1(ccp_pwm);
//definimos variables locales
int16 un;
float e,ctrl;
float Tm=5;            //tiempo de muestreo en ms
trisc=0;                //puerto c todo en salida
output_low(PIN_C5);     //condicion inicial sentido de giro
output_low(PIN_C4);     //condicion inicial sentido de giro
set_pwm1_duty(0);       //condicion inicial giro

while (true)
    {
//-------------------------------------------------------------calculo del error
    ADC_RA0();               //leemos canal analogico AN0 ANA0
    ADC_RA1();               //leemos canal analogico AN1 ANA1
    if(input(PIN_A4)==0)
        {e=ANA0-ANA1;}       //giro positivo
    else
        {e=ANA0+ANA1;}       //giro negativo
    if(e<=0) 
        { //giro positivo
        output_high(PIN_C4);
        output_low(PIN_C5);
        }
    else 
        { //giro negativo
        output_high(PIN_C5);
        output_low(PIN_C4);
        }
//---------------------------------------------------------controlador utilizado
     ctrl=1*e;   //control proporcional
//---------------------------------------------------------calculo de salida PWM 
     if(ctrl>=1000) //1000 = 100% = 24v
        {ctrl=1000;}
     else
        {
        if(ctrl<=0) //0 = 0% = 0v
           {ctrl=0;}
        }
     un = ctrl;
     set_pwm1_duty(un);      //750 = 75% = 18v, Referencia maxima
     delay_ms(Tm);
   }
}