martes, 14 de febrero de 2017

PRACTICA # 13 PWM

OBJETIVO:
       Haremos uso del módulo MTU6 con el que cuenta el MCU R5F563NB de la tarjeta de evaluación YRDKRX63N. Generaremos una frecuencia de 10 Khz que será reflejado en un LED por medio de la variación del potenciómetro (duty cycle).
  • Inicializaremos la unidad de timer MTU4
  • Inicializaremos el ADC de 10 bits
  • Variaremos el potenciómetro para modificar el duty cycle de la frecuencia de 10Khz

DESARROLLO:
  • Del RX63N Group User's Manual: Hardware página 753 está especificado la salida MTIOC4A que utilizaremos del módulo MTU4.

  •  Del YRDKRX63N schematic observamos que la señal de salida del PWM esta referenciada al LED11:


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.- La inicialización del MTU4 se encuentra en el archivo pwm.c y se muestra a continuación:

void MTU4_Init(void)
{
            MSTP(MTU4) = 0;      /* Cancel MTU peripheral stop state. */

            MTU.TSTR.BIT.CST4 = 0; /* Stop MTU 4 */

            MTU.TRWER.BIT.RWE = 1; /* Enable read/write access to the write-protected MTU3 and MTU4 registers. */
            MTU.TOER.BIT.OE4A = 1; /* Enable MTIOC4A output. In MTU3 and MTU4, set TOER prior to setting TIOR. */

            /* Port E2 Pin Function Select Register (PE2PFS)
             b7      Reserved: This bit is always read as 0. The write value should always be 0.
             b6      ISEL:     Interrupt Input Function Select, 0 = not used as IRQn input pin
             b5      Reserved: This bit is always read as 0. The write value should always be 0.
             b4:b0   PSEL:     These bits select the peripheral function.
             */
            MPC.PE2PFS.BYTE = 0x01; /* 1 defines PE2 to be MTIOC4A, with no IRQ. */

            PORTE.PDR.BIT.B2 = 1; /* Set PE2 as output. */

            PORTE.PMR.BIT.B2 = 1; /* Set PE2 as peripheral function bit */

            /* Timer Control Register (TCR)
             b7:b5   CCLR: Counter Clear Source 1 = TCNT cleared by TGRA compare match/input capture
             2 = TCNT cleared by TGRB compare match/input capture
             b4:b3   CKEG: Clock Edge           0 = count at rising edge
             b2:b0   TPSC: Time Prescaler       1 = count on PCLK / 4
             */
            MTU4.TCR.BYTE = 0x21; /* Clear on TGRA match. Prescaler = PCLK / 4 setting. */

            /* Timer Mode Register (TMDR)
             b7      ---   Reserved. Always read/write 0.
             b6      BFE - TPUm.TGRE operates normally
             b5      BFB - TPUm.TGRB operates normally
             b4      BFA - TPUm.TGRA operates normally
             b3:b0   MD  - 0 = Normal operation
             2 = Set PWM mode 1
             */
            MTU4.TMDR.BYTE = 0x02;

            /* Timer I/O Control Register (TIORH)
             b7:b4   IOB - 5 = Ouptut: initial 1, 0 at TGRB compare match
             b3:b0   IOA - MTIOC4A pin function:
             6 = output: initial 1, then 1 after TGRA match
             */
            MTU4.TIORH.BYTE = 0x56; /* High on TGRA, Low on TGRB. */

            /* Timer I/O Control Register (TIORL)
             b7:b4   IOD - 0 = output: none
             b3:b0   IOC - 0 = output: none
             */
            MTU4.TIORL.BYTE = 0x00;

            /* Timer General Registers (TGRx)
             *  b15:b0 TGRx either output compare or input capture register.
             *         x may be A, B, C, or D, depending on which registers this MTU has.
             * TGRA is being used as the PWM base frequency counter. Count is cleared on match to this value.
             * TGRB is being used as the PWM pulse width counter. The output is switched when this count is reached.
             */
            MTU4.TGRA = 1200-1;               // 10KHz    --> 12 Mhz / 1200 = 10 khz
            MTU4.TGRB = 600;                  // Duty 50%

            /* Timer Interrupt Enable Register (TIER)
             b7      TTEG - A/D conversion start request generation
             b6      reserved
             b5      TCIEU - Underflow interrupts
             b4      TCIEV - Overflow interrupts
             b3      TGIED - TGRD interrupt
             b2      TGIEC - TGRC interrupt
             b1      TGIEB - TGRB interrupt
             b0      TGIEA - TGRA interrupt
             */
            MTU4.TIER.BYTE = 0x0; /* 0 = no interrupts */

            MTU4.TCNT  = 0;                               // Clear Count

            MTU.TSTR.BIT.CST4 = 1;           // Count Start    // Enable MTU4.
}

6.- El programa main queda de la siguiente manera:

void main(void)
{
            set_ipl(0);              // enable interrupts
            SR_Oscilador();          //  F = 96 Mhz
            SR_TIMER_0();            // Inicializa el Timer 0 en cascada para 16 bits
            SR_ADC();                // ADC 10 bits ch 2
            SR_INIT_PWM();           // inicia pwm MTU6 pin A2

            while(1)
            {
                        AdcValue = adc_get_vdd();          // adquiere el valor 10 bits del ch 2  4096 posiciones
                        // MTU4.TGRA  = 1200;  MTU4.TGRB  = 600; al 50%
                        // 4096     --- 1200
                        // AdcValue ---  X
                period = 0xFFFF & (MTU4.TGRA);
                        u16DutyCycle = (period * AdcValue) / 4096;
                        MTU4.TGRB = u16DutyCycle;                            // duty cycle 0 -- 100%
                        delay_ms(100);
            }
}
  • Agregar código, compilar y debug:
1.- Bajar el código de:
--> Practica #13

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



VÍDEO:

1 comentario: