jueves, 12 de enero de 2017

PRACTICA # 13 PWM

OBJETIVO:
       Haremos uso del módulo MTU6 con el que cuenta el MCU R5F562N8 de la tarjeta de evaluación YRDKRX62N. 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 MTU6
  •  Inicializaremos el ADC de 10 bits
  •  Variaremos el potenciómetro para modificar el duty cycle de la frecuencia de 10Khz

DESARROLLO:

  • Del RX62N Group User's Manual: Hardware página 842 está especificado la salida MTIOC6C que utilizaremos del módulo MTU6.

  • Del YRDKRX62N schematic haremos un puente en el conector JN3, entre el pin 11 y 13. Esto con la finalidad de que la señal de salida del PWM del TIOC6C pase al LED1:



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

void MTU6_Init(void)
{
    // MTU6 = PWM Mode 1
            MSTP(MTU6) = 0;                               // Wake up MTU6
            MTU6.TCR.BIT.TPSC = 1;           // PCLK/4  = 12 Mhz
            //MTU6.TCR.BIT.CKEG = 1;         // Count rising edge
            MTU6.TCR.BIT.CCLR = 6;           // TCNT cleared by TGRD compare match
            MTU6.TMDR.BIT.MD  = 2;           // PWM mode 1
            //MTU6.TMDR.BIT.BFA = 0;         // TGRA, TGRC normal mode
            MTU6.TIORL.BIT.IOC = 1;          // Output from TIOC6C: 0 at initial, 1 on compare match
            MTU6.TIORL.BIT.IOD = 2;          // 0 at initial, 0 on compare match

            MTU6.TGRD = 1200-1;               // 10KHz    --> 12 Mhz / 1200 = 10 khz
            MTU6.TGRC = 600;                  // Duty 50%

            MTU6.TCNT = 0;                                // Clear Count
            MTUB.TSTR.BIT.CST0 = 1;          // Count Start    // Enable MTU6.
}


6.- El programa principal 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 4
            SR_INIT_PWM();           // inicia pwm MTU6 pin A2

            while(1)
            {
                        AdcValue = adc_get_vdd();          // adquiere el valor 10 bits del ch 8
                        // MTU6.TGRD = 1200;  MTU6.TGRC = 600; al 50%
                        // 1024     --- 1200
                        // AdcValue ---  X
                       period = 0xFFFF & (MTU6.TGRD);
                        u16DutyCycle = (period * AdcValue) / 1024;
                        MTU6.TGRC = u16DutyCycle;                            // duty cycle 0 -- 100%
                        delay_ms(100);
            }

}


  • 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