Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //this programm will put out a PPM signal
- //////////////////////CONFIGURATION///////////////////////////////
- #define chanel_number 6 //set the number of chanels
- #define default_servo_value 1500 //set the default servo value
- #define PPM_FrLen 22500 //set the PPM frame length in microseconds (1ms = 1000µs)
- #define PPM_PulseLen 300 //set the pulse length
- #define onState 1 //set polarity of the pulses: 1 is positive, 0 is negative
- #define sigPin 10 //set PPM signal output pin on the arduino
- //////////////////////////////////////////////////////////////////
- /*this array holds the servo values for the ppm signal
- change theese values in your code (usually servo values move between 1000 and 2000)*/
- int ppm[chanel_number];
- void setup()
- {
- //initiallize default ppm values
- for(int i=0; i<chanel_number; i++)
- {
- ppm[i]= default_servo_value;
- }
- pinMode(sigPin, OUTPUT);
- digitalWrite(sigPin, !onState); //set the PPM signal pin to the default state (off)
- cli();
- TCCR1A = 0; // set entire TCCR1 register to 0
- TCCR1B = 0;
- OCR1A = 100; // compare match register, change this
- TCCR1B |= (1 << WGM12); // turn on CTC mode
- TCCR1B |= (1 << CS11); // 8 prescaler: 0,5 microseconds at 16mhz
- TIMSK1 |= (1 << OCIE1A); // enable timer compare interrupt
- sei();
- pinMode(A0, INPUT);
- pinMode(A1, INPUT);
- pinMode(A2, INPUT);
- pinMode(A3, INPUT);
- pinMode(A4, INPUT);
- pinMode(A5, INPUT);
- //Serial.begin(9600);
- }
- void loop()
- {
- //THROTTLE
- int throttle = analogRead(A1);
- //Serial.println(throttle);
- throttle = map(throttle, 90, 965, 1050, 1950);
- ppm[0] = throttle;
- //YAW
- int yaw = analogRead(A0);
- //Serial.println(yaw);
- yaw = map(yaw, 60, 945, 1050, 1950);
- ppm[3] = yaw;
- //PICTH
- int pitch = analogRead(A2);
- //Serial.println(pitch);
- pitch = map(pitch, 90, 946, 1050, 1950);
- ppm[2] = pitch;
- //ROLL
- int roll = analogRead(A3);
- //Serial.println(roll);
- roll = map(roll, 110, 987, 1050, 1950);
- ppm[1 ] = roll;
- //CH1
- int ch1 = digitalRead(A4);
- ppm[4] = (ch1 == HIGH) ? 1850 : 1100;
- //CH2
- int ch2 = digitalRead(A5);
- ppm[5] = (ch2 == HIGH) ? 1850 : 1100;
- //delay(10);
- }
- ISR(TIMER1_COMPA_vect)
- { //leave this alone
- static boolean state = true;
- TCNT1 = 0;
- if(state) { //start pulse
- digitalWrite(sigPin, onState);
- OCR1A = PPM_PulseLen * 2;
- state = false;
- }
- else{ //end pulse and calculate when to start the next pulse
- static byte cur_chan_numb;
- static unsigned int calc_rest;
- digitalWrite(sigPin, !onState);
- state = true;
- if(cur_chan_numb >= chanel_number){
- cur_chan_numb = 0;
- calc_rest = calc_rest + PPM_PulseLen;//
- OCR1A = (PPM_FrLen - calc_rest) * 2;
- calc_rest = 0;
- }
- else{
- OCR1A = (ppm[cur_chan_numb] - PPM_PulseLen) * 2;
- calc_rest = calc_rest + ppm[cur_chan_numb];
- cur_chan_numb++;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment