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:servo [2015/11/12 08:07] heikopikneren:examples:motor:servo [2020/07/20 09:00] (current) – external edit 127.0.0.1
Line 1: Line 1:
 ====== Servomotor ====== ====== Servomotor ======
  
-//Necessary knowledge: [HW] [[en:hardware:homelab:motor]], [HW] [[en:hardware:homelab:sensor]], [AVR] [[en:avr:io]], [LIB] [[en:software:homelab:library:module:motor]], [LIB] [[en:software:homelab:library:adc]]//+//Necessary knowledge:  
 +[HW] [[en:hardware:homelab:digi]], [HW] [[en:hardware:homelab:combo]],  
 +[AVR] [[en:avr:timers]], [AVR] [[en:avr:adc]],   
 +[LIB] [[en:software:homelab:library:module:motor]], [LIB] [[en:software:homelab:library:adc]]//
  
 ===== Theory ===== ===== Theory =====
Line 24: Line 27:
  
 <code c> <code c>
-// The value of the timer (20 ms)for achieving the full period of PWM.+// The value of the timer (20 ms)for achieving the full period of PWM
 // F_CPU is the clock rate of the microcontroller which is divided with  // F_CPU is the clock rate of the microcontroller which is divided with 
-// 50 Hz and 8.+// 50 Hz and 8
 #define PWM_PERIOD      (F_CPU / 8 / 50) #define PWM_PERIOD      (F_CPU / 8 / 50)
    
 // Middle position of PWM servo (5 ms / 20 ms) // Middle position of PWM servo (5 ms / 20 ms)
-// Middle position is 15/200 of full period.+// Middle position is 15/200 of full period
 #define PWM_MIDDLE_POS  (PWM_PERIOD * 15 / 200) #define PWM_MIDDLE_POS  (PWM_PERIOD * 15 / 200)
    
-// Factor for converting the percents (-100% to 100%)to periods.+// Factor for converting the percents (-100% to 100%)to periods
 // +1 is added to ensure that semi periods would reach to the boundaries  // +1 is added to ensure that semi periods would reach to the boundaries 
-// of 1 ms and 2 ms or // a little over.+// of 1 ms and 2 ms or // a little over
 #define PWM_RATIO       (PWM_PERIOD / 20 / 2 / 100 + 1) #define PWM_RATIO       (PWM_PERIOD / 20 / 2 / 100 + 1)
  
-// Set-up of the pins.+// Set-up of the pins
 static pin servo_pins[2] = static pin servo_pins[2] =
 { {
Line 44: Line 47:
 }; };
  
-// Preparing the servo motor for working.+// Preparing the servo motor for working
 void servomotor_init(unsigned char index) void servomotor_init(unsigned char index)
 { {
- // The pin of PWM signal for output.+ // The pin of PWM signal for output
  pin_setup_output(servo_pins[index]);   pin_setup_output(servo_pins[index]); 
    
- // Setup of timer 1.+ // Setup of timer 1
  // Prescaler = 8  // Prescaler = 8
  // Fast PWM mode, where TOP = ICR  // Fast PWM mode, where TOP = ICR
- // OUTA and OUTB to low in comparisson.+ // OUTA and OUTB to low in comparisson
  timer1_init_fast_pwm(  timer1_init_fast_pwm(
  TIMER1_PRESCALE_8,  TIMER1_PRESCALE_8,
Line 61: Line 64:
  TIMER1_FAST_PWM_OUTPUT_DISABLE);  TIMER1_FAST_PWM_OUTPUT_DISABLE);
    
- // Determining the period by maximum value.+ // Determining the period by maximum value
  timer1_set_input_capture_value(PWM_PERIOD);   timer1_set_input_capture_value(PWM_PERIOD);
 } }
  
-// Determining the position of the servo motor.+// Determining the position of the servo motor
 // The parameter of the position is from -100% to +100%. // The parameter of the position is from -100% to +100%.
 void servomotor_position(unsigned char index, signed short position) void servomotor_position(unsigned char index, signed short position)
Line 84: Line 87:
 </code> </code>
  
-The example program uses described functions of the library of the HomeLab. In the beginning of the program the first servo motor’s PWM signal generator is started with the //servomotor_init// function. The value of the position of the servo motor is obtained from the channel number 3 of the analogue-digital converter, where a potentiometer on the board of sensors is connected. To get the range -100 % - +100 % necessary for controlling the servo motor, half of the maximum (512) is subtracted of the ADC value and the result is divided with 5.  The result is +/- 102, but small inaccuracy does not count because servo motors also differ by the relation of the PWM signal and revolving angle. Final PWM‘s semi period’s width in applications has to be determined using test-and-error method. Also the remote controls of RC models have corresponding opportunities for precise setup. When the program is started the rotors position of the servomotor is changed according to the position of the potentiometer. +The example program uses described functions of the library of the HomeLab. In the beginning of the program the first servo motor’s PWM signal generator is started with the //servomotor_init// function. The value of the position of the servo motor is obtained from the channel of the analogue-digital converter, where a potentiometer on the board of sensors is connected. To get the range -100 % - +100 % necessary for controlling the servo motor, half of the maximum (512) is subtracted of the ADC value and the result is divided with 5.  The result is +/- 102, but small inaccuracy does not count because servo motors also differ by the relation of the PWM signal and revolving angle. Final PWM‘s semi period’s width in applications has to be determined using test-and-error method. Also the remote controls of RC models have corresponding opportunities for precise setup (trim function). When the program is started the rotors position of the servomotor is changed according to the position of the potentiometer. 
  
 <code c> <code c>
-// +// Testing program of the motors module of the HomeLab kit
-// Testing program of the motors module of the HomeLab kit+
-//+
 #include <homelab/adc.h> #include <homelab/adc.h>
 #include <homelab/module/motors.h> #include <homelab/module/motors.h>
Line 98: Line 99:
  short position;  short position;
  
- // Set-up of the ADC.+ // Set-up of the ADC
  adc_init(ADC_REF_AVCC, ADC_PRESCALE_8);  adc_init(ADC_REF_AVCC, ADC_PRESCALE_8);
  
- // Set-up of the motor. + // Set-up of the motor 
- servomotor_init(0);+ servomotor_init(1);
  
- // Endless loop. + // Endless loop 
- while (true)+ while (1)
  {  {
  // Reading the position of the potentiometer and   // Reading the position of the potentiometer and 
  // converting the range of  // converting the range of
- // the servo motor. + // the servo motor 
- position = ((short)adc_get_value(3) - (short)512) / (short)5;+ // For HomeLab II ADC must be read for the corresponding channel,  
 + // and use the following formula: 
 + // position = ((short)adc_get_value(3) - (short)512) / (short)5
 + position = ((short)adc_get_value(15) / 10) - 102 ;
  
- // Determining the position of the servo motor. + // Determining the position of the servo motor 
- servomotor_position(0, position);+ servomotor_position(1, position);
  }  }
 } }
 </code> </code>
en/examples/motor/servo.1447315659.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