Guest User

Untitled

a guest
May 27th, 2018
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.24 KB | None | 0 0
  1. #include <avr/io.h>
  2. #include <util/delay.h>
  3. #include <avr/interrupt.h>
  4.  
  5. unsigned int servo[9] = {1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 6000};
  6.  
  7. ISR(TIMER1_COMPA_vect) {
  8.         static unsigned char servo_num;
  9.         PORTB = (1<<servo_num);          // end pulse for servo (n), start pulse for servo (n+1)            
  10.         OCR1A = servo[servo_num];        // set width of pulse
  11.         servo_num++;                     // prepare next servo
  12.         if(servo_num > 8) servo_num = 0; // again from servo 0;
  13. }
  14.  
  15. uint8_t servo_setup(){
  16.         DDRB = 255;                        // portb output
  17.         TCCR1B |= (1<<WGM12) | (1<<CS11);  // pwm mode 4,CTC, prescale=8
  18.         TIMSK1 |= (1<<OCIE1A);             // enable T1_compareA interrupt
  19.         TCNT1 = 65530;
  20.         sei();
  21. }
  22.  
  23. uint16_t servo_write(uint8_t num, uint8_t val){
  24.         servo[num] = scale(val, 0, 180, 1000, 2000);
  25. }
  26.  
  27. double scale(double x, double in_min, double in_max, double out_min, double out_max){
  28.         return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
  29. }
  30.  
  31. ~                                                                                                                                                                        
  32. ~
Add Comment
Please, Sign In to add comment