domingo, 15 de enero de 2017

PRACTICA # 10 ACELERÓMETRO 3 EJES (I2C)

OBJETIVO:
       Haremos uso de la interface RIIC0 con el que cuenta el MCU R5F562N8 de la tarjeta de evaluación YRDKRX62N. Haremos funcionar el sensor acelerómetro ADXL345 cuyo protocolo es I2C e imprimiremos su valor en la LCD gráfica en grados Celsius.
  •  Inicializaremos el módulo RIIC0
  •  Se crearán rutinas de lectura y escritura I2C
  •  Se implementará la API del sensor acelerómetro para manejo de sus funciones.

DESARROLLO:
  •  Del YRDKRX62N schematic ubicamos el sensor acelerómetro y su dirección:

PASOS:
  •  Creación de un proyecto:
1.- Abrir el software e2studio
2.- New/ C Project / Renesas RXC ToolChain


3.- Seleccionar el target R5F562N8, debug hardware Segger jLink, después next


4.- Seleccionar C/C++ Source file y por ultimo Finish.


5.- Las rutinas de lectura del sensor acelerómetro se encuentran en el archivo accelerometer.c

/* ADXL345 IIC Registers */
#define ACCEL_ADDR_XYZ  0x3Au
#define DATA_FORMAT_REG 0x31u
#define POWER_CTL_REG            0x2Du
#define FIFO_CTL_REG             0x38u
#define DATAX_REG       0x32u
#define DATAY_REG       0x34u
#define DATAZ_REG       0x36u
#define SELF_TEST       0x80u
#define DATA_FORMAT     0x03u
#define PWR_CFG       0x08u
#define FIFO_CFG     0x00u
const uint8_t acc_reg_addr[3] = { DATAX_REG, DATAY_REG, DATAZ_REG };
#define ACCEL_ADDR  (ACCEL_ADDR_XYZ >> 1)

void Accelerometer_Init(void)
{
            uint8_t  accel_data[2];

                                                                              /* accelerometer data format                     */
                                                                              /* range +/- 16g                                 */
                                                                              /* right justified with sign extension           */
                accel_data[0] = DATA_FORMAT_REG;                              /* Full resolution mode                          */
                accel_data[1] = 0x0B;
                I2C_Write(ACCEL_ADDR, accel_data, 2, true);

                accel_data[0] = POWER_CTL_REG;                                   /* take accelerometer out of standby mode        */
                accel_data[1] = 0x08;
                I2C_Write(ACCEL_ADDR, accel_data, 2, true);

                accel_data[0] = FIFO_CTL_REG;                                    /* put FIFO into bypass mode                     */
                accel_data[1] = 0x00;
                I2C_Write(ACCEL_ADDR, accel_data, 2, true);
}

unsigned short *Accelerometer_Get(void)
{
            unsigned short u16AcelerometerValues[3];
    uint8_t target_reg, acc_axis;
    uint8_t target_data[2] = {0x00, 0x00};

    for(acc_axis=0; acc_axis<3; acc_axis++)
    {
                        target_reg = acc_reg_addr[acc_axis];
                        I2C_Write(ACCEL_ADDR, &target_reg, 1, true);
                        I2C_Read(ACCEL_ADDR, target_data, 2, true);
        u16AcelerometerValues[acc_axis] = (target_data[1] << 8) + target_data[0];
    }
    return u16AcelerometerValues;
}



6.- La API I2C se encuentra en el archivo I2C.c cuyas rutinas son:

void I2C_Start(void);
   void I2C_Read(uint8_t  addr, uint8_t *p_data, uint32_t   len, bool  start)
   void I2C_Write(uint8_t  addr, uint8_t *p_data, uint32_t   len, bool  stop)

  • Agregar código, compilar y debug:
1.- Bajar el código de:

2.- Compilar con el icono del martillo y debug con el icono del insecto:


VÍDEO:

No hay comentarios.:

Publicar un comentario