I2C Error Compendium: Difference between revisions
No edit summary |
|||
Line 19: | Line 19: | ||
* increase spacing between I2C cables and motor wires | * increase spacing between I2C cables and motor wires | ||
* twist wires | * twist all wires where possible including the IMU cable(reduces Electromagnetic interference); for the IMU this can take several forms, such as twisting all four together, just twisting SCL and SDL, twisting SCL with GND and SDA with VCC etc. | ||
* shield the wires; using e.g. a coax cable or wrapping the wires with | * shield the wires; using e.g. a coax cable or wrapping the wires with a self adhesive conductive cloth, "EMI shielding" | ||
* lower the (motor) voltage | * lower the (motor) voltage | ||
* add ferrite rings; these can be fitted in various ways, such as, | * add ferrite rings; these can be fitted in various ways, such as, putting the rings on the I2C wires and/or the motor wires, they can be fitted at either ends of the wires. | ||
* reduce the I2C pullup resistors on the IMU module e.g. to 1k | * reduce the I2C pullup resistors on the IMU module e.g. to 1k | ||
Line 31: | Line 31: | ||
== Capacitive Load == | == Capacitive Load == | ||
Capacitive load decreases the slew rate of the signal, and eventually prevents the electronics | Capacitive load decreases the slew rate of the signal, and eventually prevents the electronics from detecting the signal correctly, and an I2C error occurs. | ||
Capacitive load arises from the cables | Capacitive load arises from the cables themselves, and the longer the cables are the higher the capacitive load becomes. | ||
Therefore, for any I2C system there is an "intrinsic" maximum length up to which the I2C communication will work. In practice this maximal length is not achieved, since, as discussed in the introduction, other I2C error source may be present, reducing the practical length. The capacitive load by the cables depends also on the type of cables. Thin wires for instance have a smaller capacity than thicker wires. In practice, however, there is usually little room to play with that factor. | |||
Capacitive load also arises from anything conducting in the surrounding of the I2C clock and/or data wires. | Capacitive load also arises from anything conducting in the surrounding of the I2C clock and/or data wires. |
Revision as of 02:15, 13 January 2015
by OlliW
I2C errors are probably the most annoying side effect of the technology we are using in our brushless gimbals.
I2C errors occur when the signals on the I2C clock and data lines (SCL,SDA) are disturbed beyond certain limits, and this happens for two main reasons:
- capacitive load on the I2C clock and/or data lines
- induced signal disturbances due to capacitive coupling to outside fields
Importantly, all error sources add up. One therefore can't give decisive threshold values, for example, the length of the I2C wires should not be more than 40 cm long. Without any further error sources one might be able to use much longer wires, but if motor wires are too close to the IMU cabling then shorter wires might be required.
It's like a glass of wine: When it's full, it's full. It doesn't matter whether it was filled with Bordeaux, Chianti, or any other mixture. When the glass is filled with only a tiny bit of Bordeaux, one can add a lot of Chianti before it overflows, but when the glass is nearly full of Bordeaux, only a tiny drop of Chianti will fit before it reaches the overflows point. So, its not possible to tell how much Chianti is acceptable, since this depends on how much Bordeaux is already in the glass, the only thing that can be determined is that the more Chianti you poor in the glass the more likely it will overflow.
Ways to Reduce the I2C Error Rate
Before looking at the I2C errors, here is a brief summary to help reduce problems with the error-prone I2C connection to an IMU module:
- reduce length of cable
- increase spacing between I2C cables and motor wires
- twist all wires where possible including the IMU cable(reduces Electromagnetic interference); for the IMU this can take several forms, such as twisting all four together, just twisting SCL and SDL, twisting SCL with GND and SDA with VCC etc.
- shield the wires; using e.g. a coax cable or wrapping the wires with a self adhesive conductive cloth, "EMI shielding"
- lower the (motor) voltage
- add ferrite rings; these can be fitted in various ways, such as, putting the rings on the I2C wires and/or the motor wires, they can be fitted at either ends of the wires.
- reduce the I2C pullup resistors on the IMU module e.g. to 1k
Capacitive Load
Capacitive load decreases the slew rate of the signal, and eventually prevents the electronics from detecting the signal correctly, and an I2C error occurs.
Capacitive load arises from the cables themselves, and the longer the cables are the higher the capacitive load becomes.
Therefore, for any I2C system there is an "intrinsic" maximum length up to which the I2C communication will work. In practice this maximal length is not achieved, since, as discussed in the introduction, other I2C error source may be present, reducing the practical length. The capacitive load by the cables depends also on the type of cables. Thin wires for instance have a smaller capacity than thicker wires. In practice, however, there is usually little room to play with that factor.
Capacitive load also arises from anything conducting in the surrounding of the I2C clock and/or data wires.
That's indeed a major factor, and - fortunately - it is under our control to a high degree. The possible contributors falling into this category are very diverse; they range from things such as spacing between the wires among themselves or to GND or Vcc, shielding such as in coax wires, twisted or non-twisted wires and how they are twisted, conducting areas like metal bars or carbon plates to which the IMU module is mounted or the cables are fixed to, connectors, and so on. It is as it was said, it arises from anything conducting in the surrounding. Fortunately, the rules which determine the value of capacitors are well known. In a nutshell, the larger the conducting area the larger the capacitance, and the larger the distance to the conducting area the smaller the capacitance. This immediately gives us the rules at hand to control, and possibly avoid them.
The acceptable capacitive load, from both the cables and the surrounding, depends on additional factors, such as the current capabilities of the I2C drivers and the pullup resistors.
Induced Signal Disturbances
Wires in the proximity to the I2C clock and data lines may, due to capacitive coupling, induce fault voltages in I2C lines and thus disturb the I2C signals. This again may prevent the electronics to detect the I2C signals correctly or even bring it into an unexpected state, and an I2C error occurs. The I2C errors due to induced disturbances are often fatal in the sense that it can be hard for the electronics to recover properly from them.
For our gimbals, the primary origin of these disturbances is the motor wires. The motor wires carry high voltage signals, high in comparison to the ca. 3 V of the I2C signals, which moreover are pulsed with large slew rates. When they come close to the I2C lines, the motor wires can easily disturb the signals on the I2C lines.
The strength of the induced disturbances depends on additional factors, such as the current capabilities of the I2C drivers and the pullup resistors.
Practical Implications
Equipped with that understanding of the origin of the I2C errors, most of the counter measures listed in the above become obvious now.
Some of them can have both positive and negative effects. For instance, twisting the I2C wires or shielding them can be very successful in protecting the I2C signals from the induced disturbances by the motor wires, but on the other hand they also increase the capacitive load. Whether these counter measures work or not hence depends on the particular situation, if induced disturbances or capacitive load are the dominating I2C error sources.
Ferrite rings are very commonly used to suppress I2C errors. When placed on the motor wires they reduce the slew rate of the motor signals and whereby their ability to induce fault voltages in the I2C lines. When placed on the I2C lines they can compensate, to some extend, the capacitive load and thereby improve the I2C signal quality.
The alert reader has noticed that increasing the currents in the I2C lines or decreasing the pullup resistors, respectively, helps to diminish both the effects of the capacitive load and induced voltage disturbances. This in fact helps very well, and it is a good idea to use small pullup resistors. One may wonder why not to use really small pullup resistors instead of the typical resistors in the 1 k - 10 k range. Well, the answer is that the standard I2C current drivers are not designed to handle currents larger than a few mA (and this in turn is of course related to the way I2C works). So, too small pullup resistors may damage your electronics. Circuitry exists to create low-impedance I2C communications, but it is not used in our low-budget applications.