Matrix - Analog to Digital Converter

From FriendlyARM WiKi
Jump to: navigation, search



Analog to Digital Converter
  • The Matrix-Analog_to_Digital_Converter is a single-chip, single-supply low-power 8-bit CMOS data acquisition device.
  • It utilizes the PCF8591 chip with four analog inputs, one analog output and a serial I2C-bus interface. Three address pins A0, A1 and A2 are used for programming the hardware address, allowing

the use of up to eight devices connected to the I2C-bus without additional hardware. Address, control and data to and from the device are transferred serially via the two-line bidirectional I2C-bus. The maximum conversion rate is given by the maximum speed of the I2C-bus.

  • The I2C hardware address is configured to 1001000x
  • The operating supply voltage is from 2.5V to 6.0V,Among the 2.54 mm spacing pin header the 5V pin is the supply voltage. If you need 0 - 3.3V analog signals and keep the acquisition resolution you can connect it to a 3.3V supply voltage.


  • Wide range supply voltage: 2.5V - 6.0V
  • I2C interface: 3.3V/5V
  • 8-bit A/D x 4
  • 8-bit D/A x 1
  • Small and easy to be used in various situations
  • 2.54 mm spacing pin
  • PCB dimension (mm): 16 x 24

Analog to Digital PCB

  • Pin Description:
Pin Description
5V Supply Voltage 5V
GND Ground
AOUT Analog Output
A3 Analog Input3
A2 Analog Input2
A1 Analog Input1
A0 Analog Input0

Basic Device Operation

The PCF8591's I2C-bus is for bidirectional, two-line communication between different ICs or modules. The two lines are a Serial DAta line (SDA) and a Serial CLock line (SCL). Both lines must be connected to a positive supply via a pull-up resistor. Data transfer may be initiated only when the bus is not busy. The AINT0 - AINT4 pins are analog inputs which can be configured to single-ended or differential inputs. The supply voltage is 0 - VDD.
1. Each PCF8591 device in an I2C-bus system is activated by sending a valid address to the device. The address consists of a fixed part and a programmable part. The programmable part must be set according to the address pins A0, A1 and A2. The address is always sent as the first byte after the start condition in the I2C-bus protocol. The last bit of the address byte is the read/write-bit which sets the direction of the following data transfer.
2. The second byte sent to a PCF8591 device is stored in its control register and is required to control the device function. The upper nibble of the control register is used for enabling the analog output, and for programming the analog inputs as single-ended or differential inputs. The lower nibble selects one of the analog input channels defined by the upper nibble.
3. The on-chip D/A converter and a high-gain comparator are used temporarily during an A/D conversion cycle. An A/D conversion cycle is always started after sending a valid read mode address to a PCF8591 device. The A/D conversion cycle is triggered at the trailing edge of the acknowledge clock pulse and is executed while transmitting the result of the previous conversion。


Connect to NanoPi M1

Refer to the following connection diagram to connect the module to the NanoPi M1

Connection Details:

Matrix-Analog_to_Digital_Converter NanoPi M1
SDA Pin3
SCL Pin5
5V Pin4
GND Pin6

Connect to NanoPi 2

Refer to the following connection diagram to connect the module to the NanoPi 2:

Connection Details:

Matrix-Analog_to_Digital_Converter NanoPi 2
SDA Pin3
SCL Pin5
5V Pin4
GND Pin6

Connect to NanoPi M2 / NanoPi 2 Fire

Refer to the following connection diagram to connect the module to the NanoPi M2/ NanoPi 2 Fire:

Connection Details:

Matrix-Analog_to_Digital_Converter NanoPi M2
SDA Pin3
SCL Pin5
5V Pin4
GND Pin6

Connect to NanoPC-T2

Refer to the following connection diagram to connect the module to the NanoPC-T2

Connection Details:

Matrix-Analog_to_Digital_Converter NanoPC-T2
SDA Pin6
SCL Pin5
5V Pin29
GND Pin30

Compile & Run Test Program

Boot your ARM board with Debian and copy the matrix code:

$ apt-get update && apt-get install git
$ git clone

If your cloning is done successfully a "matrix" directory will be generated.

Compile and install Matrix:

$ cd matrix
$ make && make install

Run test program:

$ matrix-adc

Note: this module is not plug and play therefore before running the module please make sure it is connected to an ARM board.
Here is what you should observe:

The channel0 value is 2460

When Channel 0 is connected to 5V its value reaches the maximum: 2550. When it is grounded its value is 0.

Code Sample

This Matrix code sample can work with all the ARM boards mentioned in this module's wiki. The name of this code sample is "matrix-analog_to_digital_converter". Here is its source code:

int main(int argc, char ** argv)
    int i = 0;
    int value = 0;
    int channel = 0;
    if (boardInit() < 0) {
        printf("Fail to init board\n");
        return -1;
    if (argc == 2)
        channel = atoi(argv[1]);
    system("modprobe "DRIVER_MODULE);
    signal(SIGINT, intHandler);
    for (i=0; i<ADC_READ_TIMES; i++) {
        if (pcf8591Read(channel, &value) != -1) {
            printf("The channel%d value is %d\n", channel, value);
        } else {
            printf("Fail to get channel%d value\n", channel);
    system("rmmod "DRIVER_MODULE);
    return 0;

For more details about this APIs called in this code sample refer to Matrix API reference manual



Update Log


  • Added Section 5


  • Re-organized and simplified wiki