This is an old revision of the document!
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
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).
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.
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
In conclusion, we can say that if the transistor is a switch element on the scheme, then the system efficiency is high and the power used by transistors is low. Compared with a linear (analog) system, where the transistor consumes of the half-open state the same amount of power than the motor, it is a very big energy savings. In practice, there is no lossless system and in fact, the losses occur when the transistor switch one state to other. Therefore, higher losses are occurring when the transistors are switched at higher frequencies.
The HomLab uses a combined ships to drive DC motors, which includes 2 integrated H-bridges and circuit breaking diodes. The motor is controlled with three digital signals, one of them is operation enabling signal enable and the other two are determining the state of the transistors in the H-bridge. Never can occur that two vertical transistors are opened, because this would short-circuit the power source. This means that the driver is designed as foolproof and only option that can be chosen is which transistor (upper or bottom) of one side of the H-bridge (of “semi-bridge”) is opened. In other words the polarity is selected using two driving signals which is applied to the two ends of the coil of the motor.
The Combo Board of the HomeLab allows connecting up to four DC motors. Basically, for every motor there is a H-bridge which is controlled with two digital output pins of the microcontroller, because the enable pin is constantly high. If both controlling pins have same value, then the motor is stopped if different then it revolves in the corresponding direction. The state of the H-bridge is described in the following table:
| Input A | Input B | Output A | Output B | Result |
|---|---|---|---|---|
| 0 | 0 | - | - | The motor is stopped |
| 1 | 1 | + | + | The motor is stopped |
| 1 | 0 | + | - | The motor revolves in direction 1 |
| 0 | 1 | - | + | The motor revolves in direction 2 |
For each motor that is connected to the H-bridge is operated by two of the digital output of the microcontroller. The motor speed is is controlled by timers that generate a continuous PWM signals to the H-bridge, the direction of rotation of the motor is controlled to the second terminal. Motor speed is controlled a relative values from 0 to 255, where 0 means that the motor is standing and 255 is the maximum moving speed of the motor. The following code describes a function’s, which are described in the HomeLab II (ATmega2561) library to control DC motors.
// 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; } }
The controlling pins of four motor-controllers are determined with the array dcmotor_pins in the library. Before controlling the motors, function dcmotor_drive_pwm_init with the number of the motor-controller (0 – 3) must be called out. It sets the pins as output. It should also set the timer prescaler, for HomeLab II timer2_prescale and for HomeLab III timer_prescale, which determines the frequency of the PWM signal. In case of HomeLab II, as the program does not have functions which are using timer, it is appropriate for the value TIMER2_NO_PRESCALE. When for example an ultrasound sensor are used, then should be chosen TIMER2_PRESCALE 8, otherwise the controller performance may not be sufficient and the sensor readings may be corrupted. This is not applying in the HomeLab III. Higher values of the prescaler are not recommended, because it makes the motor rotation intermittent, and generates vibration.
Function dcmotor_drive_pwm is for control motor speed. This function need three input values: motor number, direction (-1, 0, +1), where -1 is the rotation in one direction, +1 other direction and 0 for stop and thirdly, the speed range of 0-255. The speed value is not linked to a specific rotational speed, it is the relative value between minimal and maximal motor speed. Motor actual speed depends on the motor type, load and the supply voltage. Motor speed accuracy is 8-bits, which means that the minimum control accuracy is 1/255 of the maximum engine speed.
The following is an example program which controls first and second DC motor so that first motor rotates half of the speed and the second motor speed is controlled by a potentiometer.
// 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); } }