Control de Motor DC con PWM


En este proyecto primero surgió la idea de hacer un adaptador para motores de DC para que puedan comportarse o ser controlados mediante PWM como un servo de modelismo, pero como mi idea era usar un potenciómetro, tenía que aparte de esto poner un generador de pulsos PWM externo gobernado por dicho potenciómetro, entonces simplifique el paso intermedio y cree esta interface de control que se controlad mediante una señal que oscila entre 0 y 5V por ejemplo la salida del punto medio de un potenciómetro donde tenemos como particularidad que el centro del potenciómetro nos mantenga la salida apagada del motor, es decir cuando el potenciómetro este en el centro los dos bornes del motor estarán a 0V, lo cual mantendrá el motor parado.
Al girar el potenciómetro hacia un extremo o el otro, el motor comenzara a girar de forma gradual, es decir aumenta su velocidad mientras más lejos se encuentra el potenciómetro del centro, teniendo los extremos del potenciómetro como velocidad máxima.

Al poseer el freno en el centro tenemos la posibilidad de que al girar el potenciómetro al extremo derecho el motor gire de forma horaria, y cuando pasamos al otro extremo gire de forma anti horaria, esto sería de la siguiente forma:



El circuito es extremadamente simple, se utiliza un microcontrolador de la línea 12F para no ocupar espacio, pero si se quiere usar otro no hay problema, de hecho es posible usar el modulo PWM del MCU y obviar la parte de tON y tOFF, en este MCU no contamos con PWM por eso se hace a mano.

A la salida del MCU se encuentra un puente H usado solo la mitad pero puede suplantarse por 4 transistores.

 

El Programa:



#include <12F675.h>
#device adc=8
#FUSES NOWDT
#FUSES INTRC_IO
#FUSES NOCPD
#FUSES NOPROTECT
#FUSES NOMCLR
#FUSES NOPUT
#FUSES NOBROWNOUT
#use delay(int=4000000)
#define SALIDA_PWM PIN_A1
#define MOTOR1_P PIN_A4
#define MOTOR1_N PIN_A5
void main(){
   setup_adc_ports(sAN0|VSS_VDD);
   setup_adc(ADC_CLOCK_DIV_2);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_comparator(NC_NC);
   int8 tOFF, tON;
   while(true){
      set_adc_channel(0);
      tOFF=read_adc();
      if(tOFF<120){
         tON=255-tOFF;
         output_low(SALIDA_PWM);
         delay_us(tOFF);
         output_high(SALIDA_PWM);
         delay_us(tON);
         output_high(MOTOR1_P);
         output_low(MOTOR1_N);
      }else{
         if(tOFF>137){
            tON=255-tOFF;
            output_low(SALIDA_PWM);
            delay_us(tON);
            output_high(SALIDA_PWM);
            delay_us(tOFF);
            output_high(MOTOR1_N);
            output_low(MOTOR1_P); 
         }else{
            output_low(MOTOR1_P);
            output_low(MOTOR1_N);
         }
      }
   }
}

No hay comentarios.:

Publicar un comentario