All Things Digital

There are numerous RC Receiver interfacing techniques published on the web. My quadcopter design is using only one processor for all its computation. For this reason, I spent extra time designing the interfaces to be as efficient as possible. Even though RC Receiver interfaces aren’t super complicated, they can cause real-time scheduling issues because of the number of interrupts and the time spent inside these interrupt routines.

Typical RC Receivers output the channel values in a given sequence of pulse width modulated (PWM) signals. The transmitters and receivers I have tested are Spektrum made. All Spektrum models seem to have the same design style. After a small bit of testing, I found that the several channels of signals are output in the same order everytime and have a small time separation. Since the standard for RC PWM is 50Hz, each pulse comes every 20 milliseconds. The top 5 lines of the picture above show an example output of a 5 channel Spektrum made receiver.

In a microcontroller, the most accurate way to measure incoming pulses is to use an input capture with a timer. Measurement occurs when a free running timer value is latched into a register when an event occurs. Obviously, a higher frequency timer yields a more precise pulse measuring system. Since most microcontrollers only have a few input capture pins, some special circuitry must be used to measure several pulses. Since the Spektrum systems do not overlap their output pulses, a simple OR gate structure can be used to combine all the signals into one signal.

Since my quadcopter will be using the Spektrum DX5e and AR500, I’m using a quad 2-input OR gate IC (MC14071BCP), to create this combined signal. As shown in the timing diagram at the top, there are still 2 voltage transistions per pulse. This results in 10 interrupts for this design style. For synchronization purposes, there is always a time between the last pulse and the beginning of the first pulse that is longer than the longest possible pulse. To capture the values sent by the transmitter, the software is setup for an interrupt to occur on every transition of the signal. All of the interrupts, except the last one, have a very small amount of time to process. The last interrupt copies out the five pulse width values and triggers an availability flag so that the rest of the software can have access to it.

An interesting thing that I noticed while testing is that Spektrum has a constant delay of 60 microseconds between each pulse. To make the system even more efficient, turning off the falling edge interrupts for the first four pulses then back on for the last interrupt results in 4 less interrupts. For the first 4 pulse width values, 60 microseconds would just be subtracted off.

For my system, this OR gate structure serves another purpose. The AR500 receiver runs on 5 volts, however, the microcontroller (LPC1768) runs on 3.3 volts. Of course there are many ways for converting one to another but the MC14071BCP IC has a wide voltage range and is tolerant to 5 volt inputs when running at 3.3 volts. Without extra circuitry, it will convert the five 5 volt signals from the AR500 into one 3.3 volt signal that represents all five channels.

In conclusion, I’ve found that using a simple OR gate IC is very efficient for pin usage, timer utilization, voltage translation, and interrupt time efficiency.

Update:

I implemented this RC receiver interface on the LPC1768 connected to a AR500. My results are accurate to about 60-70ns. This leads me to believe that the AR500 is running on the typical ATmega8 (or 168 or 328) microcontroller running at 16MHz (1/16MHz = 62.5 ns).

Before I begin discussing the quadcopter design, here is a diagram that shows the high-level software structure for my design:

All future software design posts will reference to this diagram. Here is a short explanation of the necessity and function of each block:

PWM Decoder Driver:
In order to interpret flight commands from a standard RC Transmitter/Receiver, any multi-rotor design must have some sort of PWM decoder. My decoder will be expecting a single signal containing all PWM channels (details here). The decoder driver will translate the several channels of pulse widths into values to be interpreted by the command translator.

Command Translator:
Depending on the flight mode, the PWM values given by the transmitter are interpreted differently. The command translator determines which mode the user is flying in and translates the commands accordingly.

I2C Master:
The inertial sensors I’ve chosen to use all run on the I2C protocol. This high-speed protocol will be a great interface to use because of its addressing scheme and its interrupt time efficiency. The I2C protocol is more complicated that most serial protocols but the LPC1768 has built-in hardware to handle the physical layer. The I2C interrupt scheme for this hardware is very efficient with each interrupt needing only a few lines of code.

Sensor Fusion:
As mentioned in an earlier post, I will be implementing several sensor fusion algorithms to find out which has the best performance. The first one I will implement is the Extended Kalman Filter (EKF). The EKF algorithm is widely known to be one of the best methods for state (in my case aircraft attitude) estimation. This filter will take the sensor readings from the various sensors and output an estimation of the current aircraft attitude. For my initial design it will be important to measure:

Roll – Side to side angle relative to the horizon

Pitch – Front to back angle relative to the horizon

Roll Rate – Side to side rotational rate relative to the horizon

Pitch Rate – Front to back rotational rate relative to the horizon

Yaw Rate – Horizontal rotational rate relative to magnetic heading

Magnetic Heading – Direction relative to magnetic north

Proportional-Integral-Derivative (PID) Stabilization:
Once the desired aircraft attitude is determined from the transmitter commands and the actual aircraft attitude is determined from the sensor fusion algorithm, PID controllers are used to determine the fastest way to make the desired attitude become the actual attitude. PID controllers are very efficient for control of a system in which an accurate physical model is unknown. Using calculus to determine error slopes and areas, PID controllers compensate for environmental noise and disturbances while overcoming steady state error and oscillations. PID controllers are VERY simple to design and code but are VERY hard to tune and calibrate. (see this post)

Multi-Rotor Throttle Mixing (MRTM):
Standard helicopters use Cyclic Collective Pitch Mixing (CCPM) to adjust the aircraft attitude. It works by adjusting the pitch of the blades depending on their current angular position. I came up with term MRTM, as I haven’t found a term defined for multi-rotor helicopters. MRTM works by adjusting the speed of several propellers in such a way that results in the same aircraft control and a typical helicopter (a post will soon follow that explains this in detail). MRTM can be used to control the attitude of many styles of multi-rotor helicopters.

PWM Encoder Driver:
Once everything has been computed, the PWM Encoder takes the control values and generates a pulse width modulated (PWM) output for each motor. This is the exact opposite process of the PWM Decoder. The LPC1768 has good support for PWM output. I’ll be able to output all channels of PWM without using any interrupts or processing time. Can’t beat that!

About this blog

This blog is dedicated to the countless hours I spend tinkering and creating seemingly useless yet fun devices. I've spent numerous years improving my geekness and there is no end in sight. I like sharing my ideas and creations so feel free to ask :)