PPM to PWM using pulseIn or Interrupts?


hello all,
i have been working on interface control 2 high-powered h-bridges using rc transmitter/receiver , arduino. have been partly successful in far, using pulsein command capture servo pulse rc receiver, , mapping usable pwm value. however, using pulsein command takes time multiple signals. try use interrupts capture , store 2 pulse signals each time go high, , whenever loop function running, write mapped pwm values h-bridge.

here code have come far... borrowed. after reading interrupts 3 days, still cannot figure out how integrate them sketch.

should use call interrupt each time signal rising, use pulsein measure signal, store variable in interrupt function, or can store variables obtained during interrupt, , use them in loop?

any appreciated!
btw, each rc pulse between 1000-2000 microseconds, , there new pulse every 20 milliseconds.

code: [select]

//read ppm signals 2 channels of rc reciever , convert values pwm in either direction.
//

int motor1_a = 5;    
int motor1_b = 6;    
int motor2_a = 9;
int motor2_b = 11;    

//neutral indicator led's (fwd , rev led's on motor driver board.
int ledpin1 = 7;      
int ledpin2 = 10;

int ppmin1 = 2;  // connect desired channel (ppm signal) rc receiver digital pin 2 on arduino.
int ppmin2 = 3;

volatile int rcval1;  // store rc signal pulse length
int lastgood1;
int adj_val1;  // mapped value between 0-511

volatile int rcval2;  // store rc signal pulse length
int lastgood2;
int adj_val2;  // mapped value between 0-511


void setup() {
 
 serial.begin(9600);  

 // set other pins you're using outputs:
 //motor1 pins
 pinmode(motor1_a, output);
 pinmode(motor2_a, output);
 pinmode(motor1_b, output);
 pinmode(motor2_b, output);

 //led's
 pinmode(ledpin1, output);
 pinmode(ledpin2, output);
 
 //ppm inputs rc receiver
 pinmode(ppmin1, input); //pin 2 input
 pinmode(ppmin2, input); //pin 3 input
   
 //attachinterrupt(0, rc1, rising);    // catch interrupt 0 (digital pin 2) going high , send rc1()
 //attachinterrupt(1, rc2, rising);    // catch interrupt 1 (digital pin 3) going high , send rc2()
}

void loop() {
 
 rcval1 = pulsein(ppmin1, high, 20000);      //read rc channel 1
 if (rcval1 == 0) {rcval1 = lastgood1;} else {lastgood1 = rcval1;}
 adj_val1 = map(rcval1, 1000, 2000, 0, 511);
 constrain (adj_val1, 0, 511);

 rcval2 = pulsein(ppmin2, high, 20000);      //read rc channel 2
 if (rcval2 == 0) {rcval2 = lastgood2;} else {lastgood2 = rcval2;}
 adj_val2 = map(rcval2, 1000, 2000, 0, 511);  
 constrain (adj_val2, 0, 511);

////////// motor1 /////////

 if (adj_val1 > 260) {  
   //forward
   analogwrite(motor1_a, adj_val1 - 260); //write adj_val1 motor1
   digitalwrite(motor1_b, low);
   digitalwrite(ledpin1, low);
 }
 else if (adj_val1 < 250) {
   //reverse
   digitalwrite(motor1_a, low);    
   analogwrite(motor1_b, 250 - adj_val1); //write adj_val1 motor1
   digitalwrite(ledpin1, low);
 }
 else {
 //stop
 digitalwrite(ledpin1, high); // turn on neutral light, turn motor pins off
 digitalwrite(motor1_a, low);
 digitalwrite(motor1_b, low);
}

 /////// motor 2 //////////

 if (adj_val2 > 260) {
   //forward
   analogwrite(motor2_a, adj_val2 - 260);  //write adj_val2 motor2
   digitalwrite(motor2_b, low);
   digitalwrite(ledpin2, low);
 }

 else if (adj_val2 < 250) {
   //reverse
   digitalwrite(motor2_a, low);
   analogwrite(motor2_b, 250 - adj_val2);
   digitalwrite(ledpin2, low);
 }
 
 else {
 //stop
 digitalwrite(ledpin2, high);
 digitalwrite(motor2_a, low);
 digitalwrite(motor2_b, low);

}


 //print values
 serial.print("channel 1:  ");
 serial.print(adj_val1);
 serial.print("        ");  
 serial.print("rcval1 raw:  ");
 serial.print(rcval1);  
 serial.print("        ");
 serial.print("channel 2:  ");  
 serial.print(adj_val2);
 serial.print("        ");
 serial.print("rcval2 raw:  ");
 serial.print(rcval2);  
 serial.println("        ");

}

/*
void rc1() {
   rcval1 = pulsein(ppmin1, high, 20000);      //read rc channel 1
}

void rc2() {
   rcval2= pulsein(ppmin2, high, 20000);      //read rc channel 1
}
*/

anyone?? can find 1 example on how setup interrupt , runs slowly...


Arduino Forum > Forum 2005-2010 (read only) > Software > Syntax & Programs > PPM to PWM using pulseIn or Interrupts?


arduino

Comments