Table of Contents

 

Motor DC

Conhecimento prévio: [HW] User Interface Module, [HW] Combo module, [AVR] Counters/Timers, [AVR] Analog-to-digital Converter, [LIB] Motors, [LIB] Analog to Digital Converter

Teoria

Motor DC

Motores de corrente contínua (ou motores DC) de ímã permanente são muito comuns em diferentes aplicações, onde são essenciais pequenas dimensões, alta potência e baixo preço. Devido à sua velocidade relativamente elevada, eles são utilizados em conjunto com a transmissão (à saída menor velocidade e um binário mais elevado).

O gráfico ideal de relação entre a velocidade (V), a corrente (I), potência (P), eficiência (η) e torque (T) de um motor DC.

Motores DC ímã permanente têm uma construção bastante simples e o seu controle é bastante elementar. Embora o controlo seja fácil, a sua velocidade não é precisamente determinada pelo sinal de controlo, pois depende de vários factores, principalmente do binário aplicado no veio de corrente e da alimentação. A relação entre binário e velocidade de um motor de corrente contínua ideal é linear, o que significa: quanto mais alta é a carga sobre o eixo menor é a velocidade do veio e maior é a corrente através da bobina.

Motores DC com escova usam corrente contínua e, basicamente, não precisam de sistema eletrônico de controle especiais porque toda a comunicação necessária é feita dentro do motor. Quando o motor está a funcionar, duas escovas estáticas estão a deslizar sobre o comutador rotativo e segurando a tensão sobre as bobinas. O sentido de rotação do motor é determinado pela polaridade da corrente. Se o motor deve girar somente numa direção, então a corrente pode vir através de relé ou alguma outra conexão simples. Se o motor tem que girar em ambos os sentidos, então um circuito electrónico chamado ponte-H é usado.

A ponte-H tem quatro transistores (ou quatro grupos) a direccionar a corrente para accionar o motor. O esquema elétrico da ponte-H é semelhante à letra H e é daí que vem o nome. A peculiaridade da ponte-H é a possibilidade de aplicar ambas as polaridades direcionais para o motor. A imagem ao lado mostra a principal economia da ponte-H com base no exemplo dos interruptores. Se dois interruptores diagonais estão fechados, o motor começa a funcionar. A direcção da rotação do motor depende em diagonal que os interruptores fecham. Na ponte-H real os interruptores são substituídas por transistores que são seleccionados de acordo com a corrente do motor e tensão.

O princípio de funcionamento de ponte-H utilizado em interruptores.

Ponte-H também pode alterar o sentido de rotação além da velocidade de rotação do motor. Também existem pontes-H integradas, para a realização de correntes menores. Para maiores correntes, MOSFET-s de poder especial são usados. A ponte-H com outros produtos eletrônicos é chamado controlador ou driver do motor.

Embora a velocidade do motor DC seja fácil de controlar, não existe garantia de que a velocidade desejada seja alcançada. A velocidade real depende de muitos factores, principalmente binário no eixo de saída do motor, corrente e outras características do motor. A velocidade e o binário de saida do motor ideal saída é linearmente dependente, isto é, quanto maior for o binário de saída, menor é a velocidade do motor, e consome mais corrente. Isto depende do tipo exacto de motor no caso de motor real.

Um motor DC pode ser controlado com sinais analógicos ou digitais.

Normalmente, a velocidade do motor é dependente da tensão aplicada nos terminais do motor. Se o motor alimentar uma tensão nominal, ele roda a uma velocidade nominal. Se a tensão dada ao motor é reduzida, a velocidade do motor e o binário são reduzidos também. Este tipo de controle de velocidade é também chamado de controle analógico. Isto pode ser implementado, por exemplo, usando um transistor ou um reostato.

Motores DC são controlados por microcontroladores, e porque microcontroladores são dispositivos digitais, também é razoável controlar os motores digitalmente. Isto é conseguida através da utilização de modulação de largura de impulso (PWM - pulse with modulation), por transistores de comutação rápida on - off. A potência do motor total é algo entre parado e velocidade máxima. O tempo de todo o período de PWM quando o transistor é aberto, chamado ciclo de trabalho, que é medido em percentagem. 0% significa que o transistor está constantemente fechado e não conduz, 100% significa que o transistor está aberto e conduz. A frequência de PWM deve ser suficientemente elevada para evitar a vibração do eixo do motor. Em baixas freqüências o motor produz um ruído e, portanto, é principalmente utilizada a modulação de frequência acima de 20 kHz. No entanto, a eficiência dos transistores sofre em freqüências muito altas.

Em comparação com o controlo analógico, o digital tem uma série de vantagens. A principal vantagem do sistema controlado por microcontroladores é que ele requer apenas uma única saída digital e não há necessidade de conversor digital-para-analógico complicado. O controlador digital também é mais eficiente porque menos energia é convertida em calor.

Um esquema simplificado de controlo é mostrada no seguinte desenho. A tensão de controlo Vc está vindo para o pino de saída do microcontrolador e comuta o transistor Q on-off com uma frequência de aproximadamente 20 kHz. Quando o transistor Q está ligado, então a corrente total I está a atravessar o motor M. Neste caso, o transistor se comporta como um interruptor fechado e uma queda de tensão Vq é próxima de 0, e toda a tensão de entrada Vdd continua a no motor.

A potência total que passa no transistor gem pode ser calculada pela fórmula:

P = I * V

P = I * Vq, e quando Vq ~ 0, então P ~ 0 W

Isto significa que o transistor passa quase nenhuma energia no estado aberto. Uma situação semelhante é também o caso quando o transistor está no estado fechado. Neste caso, não existe fluxo de corrente através do transistor ou do motor. Agora, a energia que atravessa o transistor, é calculada como se segue:

P = I * Vq, e quando I = 0, então P = 0 W

Em conclusão, podemos dizer que, se o transistor é um elemento de comutação no esquema, em seguida, a eficiência do sistema é alta e a potência usada pelos transistores é baixa. Em comparação com um sistema linear (analógico), em que o transistor em estado semi-aberto consome a mesma quantidade de energia do que o do motor, que é uma grande poupança de energia. Na prática, não existe um sistema sem perdas e, de facto, as perdas ocorrem quando o transistor comuta de um estado para outro. Portanto, as perdas mais elevadas ocorrem quando os transistores são ligados em freqüências mais altas.

Prática

O HomeLab inclui componentes para controlar motores DC, incluindo 2 pontes-H integradas e diodos de quebra de circuitos. O motor é controlado com três sinais digitais, um deles é sinal de ligação enable e os outros dois são a determinação do estado dos transistores na ponte-H. Nunca pode ocorrer que dois transistores verticais sejam abertos, porque isso seria curto-circuitar a fonte de alimentação. Isto significa que o driver é concebido à prova de falhas e que só pode ser escolhida a opção de qual o transistor que é aberto (superior ou inferior) de um lado da ponte-H (de “semi-ponte”). Em outras palavras, a polaridade é seleccionada utilizando dois sinais de accionamento aplicados às duas extremidades da bobina do motor.

A placa de combinaçãodo HomeLab permite conectar até quatro motores DC. Basicamente, para cada motor existe uma ponte-H, que é controlada com dois pinos de saída digital do microcontrolador, porque o pino de ligação está constantemente alto. Se ambos os pinos controladores têm mesmo valor, então o motor está parado, se for diferente, então ele gira na direção correspondente. O estado da ponte-H está descrita na tabela seguinte:

Entrada A Entrada B Saida A Saida B Resultado
0 0 - - O motor está parado
1 1 + + O motor está parado
1 0 + - O motor gira na direcção 1
0 1 - + O motor gira na direcção 2

Para cada motor ligado à ponte-H é operado por duas saídas digitais do microcontrolador. A velocidade do motor é controlada por temporizadores que geram sinais PWM contínuos para a ponte-H, o sentido da rotação do motor é controlado no segundo terminal. A velocidade do motor é controlada a valores relativos entre 0 e 255, em que 0 significa que o motor está parado e 255 é a velocidade máxima do movimento do motor. O código que se segue descreve uma função descrita na biblioteca do HomeLab II (ATmega2561) para controlar os motores DC.

// The setup of the pins driving pins
static pin dcmotor_pins[4][2] =
{
	{ PIN(B, 7), PIN(B, 4) },
	{ PIN(D, 1), PIN(D, 0) },
	{ PIN(D, 7), PIN(D, 6) },
	{ PIN(D, 5), PIN(D, 4) }
};
static int motorindex[4][2] =
{
	{ 0, 1 },
	{ 2, 3 },
	{ 4, 5 },
	{ 6, 7 }
};
// Initializing a PWM to chosen motor
void dcmotor_drive_pwm_init(unsigned char index, timer2_prescale prescaler)
{
  	unsigned char i, pwm;
 
	pin_setup_output(dcmotor_pins[index][0]);
	pin_setup_output(dcmotor_pins[index][1]);
 
	motor[index] = 1;
  	pwm = PWMDEFAULT;
 
  	// Starting all channels
  	for(i=0 ; i<CHMAX ; i++)
  	{
    	  // PWM state variable initialization
    	  compare[i] = pwm;           
    	  compbuff[i] = pwm;          
  	}
 
  	// Starting Timer 2 to normal mode
  	timer2_init_normal(prescaler);
  	// Allow Timer 2 interrupt
  	timer2_overflow_interrupt_enable(true);
 
  	// Enable global interrupts
  	sei();
}
// Generating a PWM for chosen motor
void dcmotor_drive_pwm(unsigned char index, signed char direction, 
unsigned char speed) 
{
	if(direction == -1)
	{
		compbuff[motorindex[index][0]] = 0x00;
		compbuff[motorindex[index][1]] = speed;
	}
	if(direction == 1)
	{
		compbuff[motorindex[index][0]] = speed;
		compbuff[motorindex[index][1]] = 0x00;
	} 
}

Os pinos controladores de 4 controladores de motor são determinados com o array dcmotor_pins na biblioteca. Antes de controlar os motores, a função dcmotor_drive_pwm_init com o número do motor-controlador (0-3) deve ser chamada. Ela define os pinos como saída. Também define o pré escalador do temporizador, para o HomeLab II timer2_prescale e para o HomeLab III timer_prescale, que determina a frequência do sinal PWM. No caso do HomeLab II, como o programa não tem funções que usem o temporizador, é apropriado para o valor TIMER2_NO_PRESCALE. Quando, por exemplo, são usados sensores de ultra-som, então deve ser escolhido TIMER2_PRESCALE 8, caso contrário, o desempenho do controlador pode não ser suficiente e as leituras dos sensores podem vir corrompidas. Isto não se aplica no HomeLab III. Valores mais altos do pré escalador não são recomendados, porque torna a rotação do motor intermitente, e gera vibração.

Função dcmotor_drive_pwm é usada para controlar a velocidade do motor. Esta função tem três valores de entrada: número do motor, direção (-1, 0, +1), onde -1 é a rotação numa direção, +1 na outra direção e 0 para parar e, em terceiro lugar, a gama de velocidade de 0-255. O valor de velocidade não está associado a uma velocidade de rotação específica, é o valor relativo entre a velocidade minima e máxima do motor. A velocidade real do motor depende do tipo de motor, da carga e da tensão de alimentação. A precisão de velocidade do motor é de 8-bits, o que significa que a precisão mínima de controlo é 1/255 da velocidade máxima do motor.

O seguinte é um exemplo de programa que controla o primeiro e o segundo motor DC de modo que o primeiro motor roda a metade da velocidade e a velocidade do segundo motor é controlada por um potenciómetro.

// Robotic HomeLab DC motor driving example program
#include <homelab/module/motors.h>
#include <homelab/adc.h>
 
// Main program
int main(void)
{
	// Variable of speed
	int speed;
 
	// Start of ADC
	adc_init(ADC_REF_AVCC, ADC_PRESCALE_8);
 
	// DC1 & DC2 motor initialization (without timer prescaler)
	// HomeLab II
	//dcmotor_drive_pwm_init(1, TIMER2_NO_PRESCALE);
	//dcmotor_drive_pwm_init(2, TIMER2_NO_PRESCALE);
	// HomeLab III
	dcmotor_drive_pwm_init(1, TIMER_NO_PRESCALE);
	dcmotor_drive_pwm_init(2, TIMER_NO_PRESCALE);
 
 
	// Endless loop
	while (true)
	{
	   // Reading potentiometer value (average of 4)
	   speed = adc_get_average_value(15, 4);
	   // ADC value is 12-bit but DC motor input is 8-bit
	   // conversion can be ether dividing the value with 8 or
	   // make bit shifting to right 3 times (>>3)
	   dcmotor_drive_pwm(1, 1, speed/8);
	   dcmotor_drive_pwm(2, 1, 128);
	}
}