This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| en:examples:motor:dc_speed [2012/05/15 10:36] – raivo.sell | en:examples:motor:dc_speed [2020/07/20 09:00] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 6: | Line 6: | ||
| ===== Theory ===== | ===== Theory ===== | ||
| + | [{{ : | ||
| Permanent magnet DC motors are very common in robotics and mechatronics. DC motors are relatively easy to control, both direction and speed. Motor rotation direction is determined by power supply polarity and H-bridge driver is often used when DC motor is controlled by microcontroller. | Permanent magnet DC motors are very common in robotics and mechatronics. DC motors are relatively easy to control, both direction and speed. Motor rotation direction is determined by power supply polarity and H-bridge driver is often used when DC motor is controlled by microcontroller. | ||
| Line 11: | Line 12: | ||
| Controlling the speed of DC motor can be realized either by analogous or digital signaling. | Controlling the speed of DC motor can be realized either by analogous or digital signaling. | ||
| + | |||
| + | [{{ : | ||
| In general, motor speed is dependent of the applied voltage. When powering motor with its nominal voltage, motor runs at its nominal speed at no load condition. When reducing the voltage motor speed and torque also decreases. This kind of speed control can be called as analogous motor speed control. This can be realized for example with one transistor. | In general, motor speed is dependent of the applied voltage. When powering motor with its nominal voltage, motor runs at its nominal speed at no load condition. When reducing the voltage motor speed and torque also decreases. This kind of speed control can be called as analogous motor speed control. This can be realized for example with one transistor. | ||
| - | < | ||
| In robotics DC motors are in most cases controlled by microcontrollers and as microcontrollers are digital devices it is much easier to control motor speed also digitally. To do that, instead of keeping transistor open partly, transistors need to be closed and opened constantly using pulse width modulation (PWM), so the total energy supplied to the motor is somewhere between motor switched off and motor running on full power. Opened time in the whole PWM period is called duty cycle, which is marked as percents. 0% means the transistor is closed constantly – it is not conducting current. 100% means the transistor is constantly open and is conducting current all the time. The frequency of the PWM has to be high enough to avoid vibrations in the shaft of the motor. At low frequencies the motor produces noise and due to that, modulation frequencies over 20 kHz are used quite often. On the other hand the efficiency of the transistors might not be so good at higher frequencies. Vibrating of the shaft of the motor is reduced by inertia of the rotor and the inductivity of the coils. Instead of using single transistor, H-bridge can be feed with the same PWM signal by controlling so motor speed and direction. | In robotics DC motors are in most cases controlled by microcontrollers and as microcontrollers are digital devices it is much easier to control motor speed also digitally. To do that, instead of keeping transistor open partly, transistors need to be closed and opened constantly using pulse width modulation (PWM), so the total energy supplied to the motor is somewhere between motor switched off and motor running on full power. Opened time in the whole PWM period is called duty cycle, which is marked as percents. 0% means the transistor is closed constantly – it is not conducting current. 100% means the transistor is constantly open and is conducting current all the time. The frequency of the PWM has to be high enough to avoid vibrations in the shaft of the motor. At low frequencies the motor produces noise and due to that, modulation frequencies over 20 kHz are used quite often. On the other hand the efficiency of the transistors might not be so good at higher frequencies. Vibrating of the shaft of the motor is reduced by inertia of the rotor and the inductivity of the coils. Instead of using single transistor, H-bridge can be feed with the same PWM signal by controlling so motor speed and direction. | ||
| - | Note: do not mix up RC PWM signal | + | By using digital contorol, i.e. PWM signal |
| + | [{{ : | ||
| + | |||
| + | Simplified control schematics is shown on the figure. | ||
| + | Control voltage Vc from microcontroller output pin turns on and off the transistor Q in approx. 20 kHz frequency. When Q is turned on (saturation), | ||
| + | We can calculate the power dissipated by the transistor by using formula P = I × V. Applying this to Q: | ||
| + | |||
| + | P = I × Vq, and if Vq = 0 also P = 0 W | ||
| + | |||
| + | This means that almost no power is consumed by transistor when it is ON state. Similar situation is also when transistor is closed (OFF state). In this situation nearly no current | ||
| + | |||
| + | |||
| + | P = I × Vq, and if I = 0 also P = 0 W | ||
| + | |||
| + | As a conclusion, when transistor operates only on and off states the efficiency can be very high as nearly no power is consumed by transistor itself. Compared with linear (analogous) control of the transistor when half of the power can be consumed by transistor in case motor is operated at half speed. However in practice, digital control (PWM) is also not totally lossless as transistors cannot be turned on and off instantaneously. Therefore little dissipation occurs in every transistor and every switching, by cousing bigger dissipation when frequency is higher. | ||
| + | |||
| + | |||
| + | Note: do not mix up RC Servo PWM signal with ordinary PWM signals. | ||
| ===== Practice ===== | ===== Practice ===== | ||
| + | |||
| The Motor module of the HomeLab includes motor board and DC motor equipped with integrated gearbox and encoder. Motor board allows connecting up to four DC motors. The schemes and instructions for connection are found in the chapter “Motors module”. | The Motor module of the HomeLab includes motor board and DC motor equipped with integrated gearbox and encoder. Motor board allows connecting up to four DC motors. The schemes and instructions for connection are found in the chapter “Motors module”. | ||
| Every motor is connected to H-bridge which is controlled with two digital output pins of the microcontroller. Motor speed is controlled by timers which are generating software PWM signal for H-bridge. | Every motor is connected to H-bridge which is controlled with two digital output pins of the microcontroller. Motor speed is controlled by timers which are generating software PWM signal for H-bridge. | ||
| Line 27: | Line 47: | ||
| <code c> | <code c> | ||
| - | // | ||
| - | // The setup of the pins driving pins. | ||
| - | // | ||
| static pin dcmotor_pins[4][2] = | static pin dcmotor_pins[4][2] = | ||
| { | { | ||
| Line 38: | Line 55: | ||
| }; | }; | ||
| + | static int motorindex[4][2] = | ||
| + | { | ||
| + | { 0, 1 }, | ||
| + | { 2, 3 }, | ||
| + | { 4, 5 }, | ||
| + | { 6, 7 } | ||
| + | }; | ||
| - | // | ||
| // Initialize PWM for specified DC motor. | // Initialize PWM for specified DC motor. | ||
| - | // | ||
| void dcmotor_drive_pwm_init(unsigned char index, timer2_prescale prescaler) | void dcmotor_drive_pwm_init(unsigned char index, timer2_prescale prescaler) | ||
| { | { | ||
| Line 68: | Line 90: | ||
| } | } | ||
| - | |||
| - | // | ||
| - | // Change PWM for specified DC motor | ||
| - | // | ||
| void dcmotor_drive_pwm(unsigned char index, signed char direction, unsigned char speed) | void dcmotor_drive_pwm(unsigned char index, signed char direction, unsigned char speed) | ||
| { | { | ||
| - | switch | + | if(direction == -1) |
| { | { | ||
| - | case 0: | + | compbuff[motorindex[index][0]] = 0x00; |
| - | if(direction == -1) | + | compbuff[motorindex[index][1]] = speed; |
| - | { | + | |
| - | compbuff[0] = 0x00; | + | |
| - | compbuff[1] = speed; | + | |
| - | } | + | |
| - | if(direction == 1) | + | |
| - | { | + | |
| - | compbuff[0] = speed; | + | |
| - | compbuff[1] = 0x00; | + | |
| - | } | + | |
| - | + | ||
| - | break; | + | |
| - | + | ||
| - | + | ||
| - | case 1: | + | |
| - | + | ||
| - | if(direction == -1) | + | |
| - | { | + | |
| - | compbuff[2] = 0x00; | + | |
| - | compbuff[3] = speed; | + | |
| - | } | + | |
| - | if(direction == 1) | + | |
| - | { | + | |
| - | compbuff[2] = speed; | + | |
| - | compbuff[3] = 0x00; | + | |
| - | } | + | |
| - | + | ||
| - | break; | + | |
| - | + | ||
| - | case 2: | + | |
| - | + | ||
| - | if(direction == -1) | + | |
| - | { | + | |
| - | compbuff[4] = 0x00; | + | |
| - | compbuff[5] = speed; | + | |
| - | } | + | |
| - | if(direction == 1) | + | |
| - | { | + | |
| - | compbuff[4] = speed; | + | |
| - | compbuff[5] = 0x00; | + | |
| - | } | + | |
| - | + | ||
| - | break; | + | |
| - | + | ||
| - | case 3: | + | |
| - | + | ||
| - | if(direction == -1) | + | |
| - | { | + | |
| - | compbuff[6] = 0x00; | + | |
| - | compbuff[7] = speed; | + | |
| - | } | + | |
| - | if(direction == 1) | + | |
| - | { | + | |
| - | compbuff[6] = speed; | + | |
| - | compbuff[7] = 0x00; | + | |
| - | } | + | |
| - | + | ||
| - | break; | + | |
| - | + | ||
| } | } | ||
| + | if(direction == 1) | ||
| + | { | ||
| + | compbuff[motorindex[index][0]] = speed; | ||
| + | compbuff[motorindex[index][1]] = 0x00; | ||
| + | } | ||
| } | } | ||
| + | |||
| </ | </ | ||
| Line 147: | Line 113: | ||
| <code c> | <code c> | ||
| - | // | + | |
| - | // Desc.: DC motor speed control | + | #include <homelab/delay.h> |
| - | // Hardware: ATMega2561 module, Motor board with DC motor | + | |
| - | // Author: Raivo sell, 2012 | + | |
| - | // | + | |
| #include < | #include < | ||
| int main(void) | int main(void) | ||
| { | { | ||
| - | |||
| // DC motor 0 init with no prescaler | // DC motor 0 init with no prescaler | ||
| dcmotor_drive_pwm_init(0, | dcmotor_drive_pwm_init(0, | ||
| Line 162: | Line 124: | ||
| while(1) | while(1) | ||
| { | { | ||
| - | + | // DC motor drive with half of the nominal speed | |
| - | // DC motor drive with half of the nominal speed | + | |
| dcmotor_drive_pwm(0, | dcmotor_drive_pwm(0, | ||
| } | } | ||
| Line 172: | Line 133: | ||
| <code c> | <code c> | ||
| - | // | + | |
| - | // Desc.: DC motor speed control with potentiometer | + | |
| - | // Hardware: ATMega2561 module, Motor board with DC motor, Sensor board | + | |
| - | // Author: Raivo sell, 2012 | + | |
| - | // | + | |
| #include < | #include < | ||
| - | |||
| #include < | #include < | ||
| #include < | #include < | ||
| Line 199: | Line 155: | ||
| // DC motor drive with speed from potentiometer | // DC motor drive with speed from potentiometer | ||
| - | // As potentiometer has 10-bit output but DC motor drive function | + | // As potentiometer has 10-bit output but DC motor drive |
| - | // 8-bit input the adc output have to be converted | + | // function |
| - | // e.g dividing the output with 4, or shifting bit 2 position >>2 | + | // to 8-bit e.g dividing the output with 4, or shifting bit |
| + | // 2 position >>2 | ||
| dcmotor_drive_pwm(0, | dcmotor_drive_pwm(0, | ||
| } | } | ||
| } | } | ||
| </ | </ | ||