Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
en:examples:motor:dc_speed [2012/05/15 10:59] raivo.sellen:examples:motor:dc_speed [2020/07/20 09:00] (current) – external edit 127.0.0.1
Line 12: 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. 
 +
 +[{{  :examples:motor:dc:sample_pwm_signals.png?220|PWM signal examples for one period}}]
  
 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.
-<note>Pilt</note> 
  
 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 with ordinary PWM signals.+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).
  
 +[{{  :examples:motor:dc:mootori_pwm_juhtimine.png?220|Controlling motor speed with PWM}}]
 +
 +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), full current I flows freely through the motor M. In this state transistor acts as a closed switch and voltage on the transistor Vq is nearly 0 by leaving almost full Vdd across the motor. 
 +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  flows through the motor and transistor. Calculating the power consumed by transistor once again:
 +
 +
 +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 28: 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 39: 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 69: 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 (index)+ 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;
 +
 } }
 +
 </code> </code>
  
Line 148: 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 <homelab/delay.h> #include <homelab/delay.h>
 #include <homelab/module/motors.h> #include <homelab/module/motors.h>
Line 158: 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, TIMER2_NO_PRESCALE);   dcmotor_drive_pwm_init(0, TIMER2_NO_PRESCALE);
Line 164: 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, 1, 128);         dcmotor_drive_pwm(0, 1, 128);       
   }   }
Line 174: 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 <homelab/delay.h> #include <homelab/delay.h>
- 
 #include <homelab/module/motors.h> #include <homelab/module/motors.h>
 #include <homelab/adc.h> #include <homelab/adc.h>
Line 201: 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 to 8-bit + // function 8-bit input the adc output have to be converted  
- // 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, 1, speed/4);  dcmotor_drive_pwm(0, 1, speed/4);
   }   }
 } }
 </code> </code>
en/examples/motor/dc_speed.1337079588.txt.gz · Last modified: 2020/07/20 09:00 (external edit)
CC Attribution-Share Alike 4.0 International
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0