~~NOCACHE~~ ====== Power Distribution Unit (PDU) ====== The PDU is designed to efficiently convert electrical energy for three main power bus lines: 12V, 5V and 3.3V. This was done to overcome the problem of having to deal with inefficient power-converters found in many industry produced off-the-shelf components, used in the various application cases all over Apollo-NG's infrastructure. The idea is to have modular, bus-controlled, point-of-load conversion modules for remote systems and to use the PDU's highly-efficient (>90%) buck/boost converters to supply the MCU, Storage-Devices, Audio, Communications- and Navigation-Equipment and all other hardware in close vicinity of the System-Module-Rack (SMR). All devices are fed directly from the PDU, bypassing the on-board converters, thereby increasing the overall efficiency. ===== Specs ===== [{{:mission:tech:odyssey:pdu-overview.png?645}}] ~~CL~~ * Input: 7-18V * Output: * 12V/5A > 95% Efficiency * 5V/5A >= 91% Efficiency * 3.3V/5A >= 93% Efficiency * Overcurrent Protection * In-Vehicle Protection * Monitoring: * Voltage (Input/12V/5V/3.3V) * Current (Input) * Temperature * Costs to operate: 0.5W * Operational Temperature: -25°C to +75°C ===== Main Power Busses ===== ==== 12V ==== ==== 5V ==== ==== 3.3V ==== ===== Interface ===== ==== Sensors ==== * Allegro ACS715LLCTR-30A-T Hall effect-based linear current sensor * Power Supply, 12V, 5V & 3.3V Voltage Monitoring * DS18S20 Temperature sensor ==== Controller ==== AVR ATmega88 ==== Software ==== The protocol and software were developed with a strong focus on security/reliability, very low system requirements and enough room for future options and modifications. The software package in the git repo consists of two parts. === ATmega88 Firmware (and sources) === Developed and tested with GCC === PDUD - PDU Daemon (Python) === In order to keep the system impact on the SKU at a minimum, a polling system was out of the question. Luckily the Linux kernel supports inotify, as does python, which made the development of an inotify-event driven system very easy. * Kernel iNotifier watching changes in /var/state/apollo/odyssey/pdu/* * Wake on Change Interrupt routine: * Read changed value * Validate value * Check dependencies * Execute command on PDU * Go to sleep again * Periodically collecting and updating bus voltages, temperature and power consumption ==== Protocol ==== === Command Frames === The following tables show the protocol structure with example data: ** Command-Request Frame** 8 byte frame length ^ Byte ^ 0 ^ 1 ^ 2 ^ 3 ^ 4 ^ 5 ^ 6 ^ 7 ^ | Def.| Frame Begin (FB) | Bus Device Adress (BDA) | CMD | P1 | P2 | P3 | CHK | Frame End (FE) | | DATA | 0xFB | 0x10 | 0xCA | 0xFF | 0x00 | 0x00 | 0xB4 | 0xFE | ** Command-Response Frame ** 4 byte frame length ^ Byte ^ 0 ^ 1 ^ 2 ^ 3 ^ | Def.| Bus Device Adress (BDA) | R1 | R2 | CHK | | DATA | 0x10 | 0xFF | 0x00 | 0x79 | === Data Frames === ** Data-Request Frame** 8 byte frame length ^ Byte ^ 0 ^ 1 ^ 2 ^ 3 ^ 4 ^ 5 ^ 6 ^ 7 ^ | Def.| Frame Begin (FB) | Bus Device Adress (BDA) | CMD | P1 | P2 | P3 | CHK | Frame End (FE) | | DATA | 0xFB | 0x10 | 0xDA | 0x00 | 0x00 | 0x00 | 0xA7 | 0xFE | ** Data-Response Frame ** 13 byte frame length ^ Byte ^ 0 ^ 1 ^ 2 ^ 3 ^ 4 ^ 5 ^ 6 ^ 7 ^ 8 ^ 9 ^ 10 ^ 11 ^ 12 ^ | Def.| BDA | Loops | PDU_I || PDU_U || PSU_U || PS5_U || PS3_U || CHK | | DATA | 0x10 | 0x59 | 0xC3 | 0x56 | 0xA2 | 0x97 | 0x23 | 0x42 | 0x08 | 0x15 | 0xE1 | 0xFA | 0xCC | === On the wire === These DSO screenshots show the protocol on the wire: The left and middle image show different command-request (green) and command-response (yellow) frames, the right image shows a data-request (green) and data-response (yellow) frame. The latency for command execution is virtually non-existant (0.4ms), data-requests take a little more time to collect (2.5ms), this is due to the 13 byte framelength - it takes the ATmega a bit more time to calculate the checksum of the larger frame. {{:mission:tech:odyssey:pdu_protocol.png?208|}} {{:mission:tech:odyssey:pdu_protocol1.png?208|}} {{:mission:tech:odyssey:pdu_protocol2.png?208|}} ===== Operational Readiness Test (ORT) ===== ==== ORT Specs ==== ** Required tests to pass ORT ** * Uptime > 30 days without any erratic behaviour * Toggle PSU's in a 3 second interval for 96 hours without any erratic behaviour * Accurate results of temp/voltage/current sensors over time * Stable RS-232 signal quality * Low host-system impact of PDU daemon ** Results ** All tests passed without a glitch, the system works as designed, com signals are solid and the system impact of the PDU Daemon on the host is almost non-existent, due to its use of kernel inotifiers (see the video for a time lapsed summary). ==== Video ==== {{mission:tech:odyssey:pdu_readiness_test3-640p.webm|}} ===== Repository ===== Grab the latest code and all related files: **Anonymous GIT Access**\\ //git clone [[git://apollo.open-resource.org/pdu]]// If you want to add files or commit changes, send your work to the ops-team or apply for git RW access by sending your pub-key to the ops-team.