Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "APM_RC.h"
00022
00023 #include <avr/interrupt.h>
00024 #include "WProgram.h"
00025
00026 #if !defined(__AVR_ATmega1280__) && !defined(__AVR_ATmega2560__)
00027 # error Please check the Tools/Board menu to ensure you have selected Arduino Mega as your target.
00028 #else
00029
00030
00031 volatile unsigned int ICR4_old;
00032 volatile unsigned char PPM_Counter=0;
00033 volatile uint16_t PWM_RAW[8] = {2400,2400,2400,2400,2400,2400,2400,2400};
00034 volatile unsigned char radio_status=0;
00035
00036
00037
00038
00039 ISR(TIMER4_CAPT_vect)
00040 {
00041 unsigned int Pulse;
00042 unsigned int Pulse_Width;
00043
00044 Pulse=ICR4;
00045 if (Pulse<ICR4_old)
00046 Pulse_Width=(Pulse + 40000)-ICR4_old;
00047 else
00048 Pulse_Width=Pulse-ICR4_old;
00049 if (Pulse_Width>8000)
00050 PPM_Counter=0;
00051 else
00052 {
00053 PPM_Counter &= 0x07;
00054 PWM_RAW[PPM_Counter++]=Pulse_Width;
00055 if (PPM_Counter >= NUM_CHANNELS)
00056 radio_status = 1;
00057 }
00058 ICR4_old = Pulse;
00059 }
00060
00061
00062
00063
00064 APM_RC_Class::APM_RC_Class()
00065 {
00066 }
00067
00068
00069 void APM_RC_Class::Init(void)
00070 {
00071
00072 pinMode(11,OUTPUT);
00073 pinMode(12,OUTPUT);
00074 pinMode(13,OUTPUT);
00075
00076
00077 TCCR1A =((1<<WGM11)|(1<<COM1A1)|(1<<COM1B1)|(1<<COM1C1));
00078 TCCR1B = (1<<WGM13)|(1<<WGM12)|(1<<CS11);
00079 OCR1A = 3000;
00080
00081
00082 ICR1 = 40000;
00083
00084
00085 pinMode(2,OUTPUT);
00086 pinMode(3,OUTPUT);
00087 pinMode(4,OUTPUT);
00088 TCCR3A =((1<<WGM31)|(1<<COM3A1)|(1<<COM3B1)|(1<<COM3C1));
00089 TCCR3B = (1<<WGM33)|(1<<WGM32)|(1<<CS31);
00090 OCR3A = 3000;
00091 OCR3B = 3000;
00092 OCR3C = 3000;
00093 ICR3 = 40000;
00094
00095
00096 pinMode(44,OUTPUT);
00097 pinMode(45,OUTPUT);
00098 pinMode(46,OUTPUT);
00099
00100 TCCR5A =((1<<WGM51)|(1<<COM5A1)|(1<<COM5B1)|(1<<COM5C1));
00101 TCCR5B = (1<<WGM53)|(1<<WGM52)|(1<<CS51);
00102 OCR5A = 3000;
00103
00104
00105 ICR5 = 40000;
00106
00107
00108 pinMode(49, INPUT);
00109 pinMode(7,OUTPUT);
00110 pinMode(8,OUTPUT);
00111
00112 TCCR4A =((1<<WGM40)|(1<<WGM41)|(1<<COM4C1)|(1<<COM4B1)|(1<<COM4A1));
00113
00114
00115 TCCR4B = ((1<<WGM43)|(1<<WGM42)|(1<<CS41)|(1<<ICES4));
00116
00117 OCR4A = 40000;
00118 OCR4B = 3000;
00119 OCR4C = 3000;
00120
00121
00122
00123 TIMSK4 |= (1<<ICIE4);
00124 }
00125
00126 void APM_RC_Class::OutputCh(unsigned char ch, uint16_t pwm)
00127 {
00128 pwm=constrain(pwm,MIN_PULSEWIDTH,MAX_PULSEWIDTH);
00129 pwm<<=1;
00130
00131 switch(ch)
00132 {
00133 case 0: OCR5B=pwm; break;
00134 case 1: OCR5C=pwm; break;
00135 case 2: OCR1B=pwm; break;
00136 case 3: OCR1C=pwm; break;
00137 case 4: OCR4C=pwm; break;
00138 case 5: OCR4B=pwm; break;
00139 case 6: OCR3C=pwm; break;
00140 case 7: OCR3B=pwm; break;
00141 case 8: OCR5A=pwm; break;
00142 case 9: OCR1A=pwm; break;
00143 case 10: OCR3A=pwm; break;
00144 }
00145 }
00146
00147 uint16_t APM_RC_Class::InputCh(unsigned char ch)
00148 {
00149 uint16_t result;
00150 uint16_t result2;
00151
00152
00153
00154 result = PWM_RAW[ch]>>1;
00155 result2 = PWM_RAW[ch]>>1;
00156 if (result != result2)
00157 result = PWM_RAW[ch]>>1;
00158
00159
00160 result = constrain(result,MIN_PULSEWIDTH,MAX_PULSEWIDTH);
00161 radio_status=0;
00162 return(result);
00163 }
00164
00165 unsigned char APM_RC_Class::GetState(void)
00166 {
00167 return(radio_status);
00168 }
00169
00170
00171
00172 void APM_RC_Class::Force_Out0_Out1(void)
00173 {
00174 if (TCNT5>5000)
00175 TCNT5=39990;
00176 }
00177
00178 void APM_RC_Class::Force_Out2_Out3(void)
00179 {
00180 if (TCNT1>5000)
00181 TCNT1=39990;
00182 }
00183
00184 void APM_RC_Class::Force_Out6_Out7(void)
00185 {
00186 if (TCNT3>5000)
00187 TCNT3=39990;
00188 }
00189
00190
00191 APM_RC_Class APM_RC;
00192
00193 #endif // defined(ATMega1280)