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/18 08:49] – raivo.sell | en:examples:motor:dc_speed [2020/07/20 09:00] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 18: | Line 18: | ||
| 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. | ||
| - | |||
| - | [{{ : | ||
| By using digital contorol, i.e. PWM signal to control the transistor and by this motor speed, there are several advantages over the analogous control. Most important ones for microcontroller driven systems are that speed can be controlled only by one single digital output (no need for complicated digital-analogous converter) and control is more effective (power dissipation are minimized). | By using digital contorol, i.e. PWM signal to control the transistor and by this motor speed, there are several advantages over the analogous control. Most important ones for microcontroller driven systems are that speed can be controlled only by one single digital output (no need for complicated digital-analogous converter) and control is more effective (power dissipation are minimized). | ||
| + | |||
| + | [{{ : | ||
| Simplified control schematics is shown on the figure. | Simplified control schematics is shown on the figure. | ||
| Line 29: | Line 29: | ||
| P = I × Vq, and if Vq = 0 also P = 0 W | 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 | + | 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 |
| P = I × Vq, and if I = 0 also P = 0 W | P = I × Vq, and if I = 0 also P = 0 W | ||
| - | As a conclusion, when transistor operates only on and off states the efficency | + | As a conclusion, when transistor operates only on and off states the efficiency |
| Line 47: | 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 58: | 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 87: | Line 89: | ||
| sei(); | sei(); | ||
| } | } | ||
| - | |||
| 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) | ||
| { | { | ||
| - | static int motorindex[4][2] = | ||
| - | { | ||
| - | { 0, 1 }, | ||
| - | { 2, 3 }, | ||
| - | { 4, 5 }, | ||
| - | { 6, 7 } | ||
| - | }; | ||
| - | |||
| if(direction == -1) | if(direction == -1) | ||
| { | { | ||
| - | compbuff[motorindex[index,0]] = 0x00; | + | compbuff[motorindex[index][0]] = 0x00; |
| - | compbuff[motorindex[index,1]] = speed; | + | compbuff[motorindex[index][1]] = speed; |
| } | } | ||
| if(direction == 1) | if(direction == 1) | ||
| { | { | ||
| - | compbuff[motorindex[index,0]] = speed; | + | compbuff[motorindex[index][0]] = speed; |
| - | compbuff[motorindex[index,1]] = 0x00; | + | compbuff[motorindex[index][1]] = 0x00; |
| } | } | ||
| } | } | ||
| Line 120: | Line 113: | ||
| <code c> | <code c> | ||
| - | // | + | |
| - | // Desc.: DC motor speed control | + | |
| - | // Hardware: ATMega2561 Controller board, Motor board with DC motor | + | |
| - | // Author: Raivo Sell, 2012 | + | |
| - | // | + | |
| #include < | #include < | ||
| #include < | #include < | ||
| Line 130: | Line 119: | ||
| 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 136: | 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 146: | Line 133: | ||
| <code c> | <code c> | ||
| - | // | + | |
| - | // Desc.: DC motor speed control with potentiometer | + | |
| - | // Hardware: ATMega2561 Controller board, Motor board with DC motor, Sensor board | + | |
| - | // Author: Raivo Sell, 2012 | + | |
| - | // | + | |
| #include < | #include < | ||
| - | |||
| #include < | #include < | ||
| #include < | #include < | ||
| Line 173: | 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, | ||
| } | } | ||
| } | } | ||
| </ | </ | ||