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);
}
}
}
}
Gracias por compartir tus experiencias de electronica.Felicitaciones por esta muy bien cuidada web.
ResponderBorrar