martes, 21 de febrero de 2017

PRACTICA # 6 CONVERTIDOR A/D 12 BITS

OBJETIVO:
       Se hará uso del módulo A/D de 12 bits de resolución con el que cuenta el MCU R5F563NB de la tarjeta de evaluación YRDKRX63N. El valor de muestreo será visualizado el LCD 96x64 en tiempo real.
  • Configurar el modulo A/D de 12 bits
  • Imprimir el valor del convertidor en el LCD.

DESARROLLO:
  • Del manual Renesas RX63N RDK User's Manual ubicamos el canal AN002
  • Del YRDKRX63N Schematic ubicamos el Potenciómetro: 

  • Del RX63N Group User's Manual: Hardware página 1720 hacemos referencia de la selección y la dirección del canal analógico 2:

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


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


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



5.- Configuraremos el A/D a 12 bits de resolución y un tiempo de muestreo de 2.26 us en el archivo r_cg_adc.c

void R_ADC_Create(void)
{   
              /* Power up the S12ADC */
                MSTP(S12AD) = 0;

        // potenciometer p42
                PORT4.PDR.BIT.B2  = 0;    /* Set I/O pin direction to input. */
                PORT4.PMR.BIT.B2  = 0;    /* First set I/O pin mode register to GPIO mode. */
                MPC.P42PFS.BYTE = 0x80;   /* Set port function register to analog input, no interrupt. */

                /* ADCSR: A/D Control Register
                b7    ADST     0 a/d conversion start, Stop a scan conversion process
                b6    ADCS     0 Scan mode select, Single-scan mode
                b5    Reserved 0 This bit is always read as 0. The write value should always be 0.
                b4    ADIE     0 Disables conversion complete IRQ to ICU
                b3:b2 CKS      3 A/D conversion clock select = PCLK/2
                b1    TRGE     0 Disables conversion to start w/ trigger
                b0    EXTRG    0 Trigger select, Scan conversion start by a timer source or software
                        */
                S12AD.ADCSR.BYTE = 0x0C;

                /* ADANS1: A/D Channel Select Register 1
                        b15:b5  Reserved: These bits are always read as 0. The write value should always be 0.
                b4:b0   ANS1:     Selects analog inputs of the channels AN016 to AN020 that are subjected to A/D conversion
                */
                S12AD.ADANS1.WORD = 0x0000;

                /* ADADS0: A/D-converted Value Addition Mode Select Register 0
                b15:b0  ADS0: A/D-Converted Value Addition Channel Select for AN000 to AN015.
                */
                S12AD.ADADS0.WORD = 0x0000;

                /* ADADS1: A/D-converted Value Addition Mode Select Register 1
                        b15:b5  Reserved: These bits are always read as 0. The write value should always be 0.
                b4:b0   ADS1: A/D-Converted Value Addition Channel Select for AN016 to AN020.
                */
                S12AD.ADADS1.WORD = 0x0000;

                /* ADADC: A/D-Converted Value Addition Count Select Register
                b1:b0   ADC: 00 = 1 time conversion (same as normal conversion)
                */
                S12AD.ADADC.BYTE = 0x00;   /* 1-time conversion */

                /* ADCER: A/D Control Extended Register
                b15     ADRFMT:0  Right align the data in the result registers
                b5      ACE:0 Disables automatic clearing of ADDRn after it is read
                */
                S12AD.ADCER.WORD = 0x0000;   /* Right align data, automatic clearing off. */

                /* ADSTRGR: A/D Start Triggger Select Register
                b7:b4   Reserved. Always read/write 0.
                b3:b0   ADSTRS: 0, Software trigger or ADTRG0#
                */
                S12AD.ADSTRGR.BYTE = 0x00;

               // tSCAN = tD + (tCONV × N) + tED   // pag. 1734  N -> is number of channels to convert, ADCLK = PCLK/2 = 24 Mhz
               // tD = 2PCLK + 3ADCLK = 2*(1/48Mhz) + 3*(1/24Mhz) = 0.16 us
               // tCONV = 50ADCLK = 50*(1/24Mhz) = 2 us
               // N = 1
               // tED = 1PCLK + 2ADCLK = 1*(1/48Mhz) + 2*(1/24Mhz) = 0.1 us
               // tSCAN = 0.16 us + (2 us × 1) + 0.1 us = 2.26 us
               // F = 1 / 2.26 us = 442.4 kz
}

6.- La función main queda como sigue:

void main(void)
{

            set_ipl(0);              // enable interrupts
            SR_Oscilador();          //  F = 96 Mhz
            SR_LCD_GRAPH();          //  LCD 96x64
            SR_TIMER_0();            // Inicializa el Timer 0 en cascada para 16 bits
            SR_ADC();                // ADC 12 bits ch 2

            while(1)
            {
                        AdcValue = adc_get_vdd();          // adquiere el valor 12 bits del ch 2
                        voltage = (3.3 * AdcValue) / 4096.0;
                        LCDPrintf(0, 0, "Microcarsil ");
                        LCDPrintf(1, 0, "    2017    ");
                        LCDPrintf(2, 0, "Carlos Silva");
                        LCDPrintf(3, 0, "            ");
                        LCDPrintf(4, 0, "Practica #6 ");
                        LCDPrintf(5, 0, "            ");
                        LCDPrintf(6, 0, "AD12 = %.3f ", voltage);
                        LCDPrintf(7, 0, "            ");
                        delay_ms(100);
            }

}

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

2.- Si el compilador te marca el error _sin es por falta de agregar la librería math.h. Puedes seleccionarla en las propiedades del proyecto en Standard Library.


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


VÍDEO:



No hay comentarios.:

Publicar un comentario