jueves, 22 de diciembre de 2016

PRACTICA # 15 PWM

OBJETIVO:

Haremos uso del módulo TAU1 y sus canales 0 (maestro) y 1 (esclavo) del MCU R5F104PJAFB para generar una frecuencia de 10 Khz que será reflejado en un LED por medio de la variación del potenciómetro (duty cycle) con los que cuenta la tarjeta de evaluación YRDKRL78G14.
  •  Inicializaremos la unidad de timer TAU1
  •  Inicializaremos el ADC de 10 bits
  •  Variaremos el potenciómetro para modificar el duty cycle de la frecuencia de 10Khz

DESARROLLO:
  • Del YRDKRL78G14 schematic identificamos el P65 que corresponde al RLED4 al que haremos variar la intensidad.


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



  •  Configurar proyecto:
1.- Clic derecho en el proyecto generado y seleccionar Properties



2.- Seleccionar C/C++ Build / Settings / Linker / Device y establecer los siguientes parámetros:
OCD = 85
Option Byte = efffe8
Palomear: Use range of debug monitor area. Nota: No establecer ningún valor solo dejarlo en blanco.
Apply y después OK.



3.- La Inicialización del TAU1 en sus 2 canales maestro0 y esclavo 1 es:

void R_TAU1_Create(void)
{
    TAU1EN = 1U;    /* supplies input clock */
    TPS1 = _0000_TAU_CKM0_FCLK_0 | _0000_TAU_CKM1_FCLK_0 | _0000_TAU_CKM2_FCLK_1 | _0000_TAU_CKM3_FCLK_8;
    /* Stop all channels */
    TT1 = _0001_TAU_CH0_STOP_TRG_ON | _0002_TAU_CH1_STOP_TRG_ON | _0004_TAU_CH2_STOP_TRG_ON |
          _0008_TAU_CH3_STOP_TRG_ON | _0200_TAU_CH1_H8_STOP_TRG_ON | _0800_TAU_CH3_H8_STOP_TRG_ON;
    /* Mask channel 0 interrupt */
    TMMK10 = 1U;    /* disable INTTM10 interrupt */
    TMIF10 = 0U;    /* clear INTTM10 interrupt flag */
    /* Mask channel 1 interrupt */
    TMMK11 = 1U;    /* disable INTTM11 interrupt */
    TMIF11 = 0U;    /* clear INTTM11 interrupt flag */
    /* Mask channel 1 higher 8 bits interrupt */
    TMMK11H = 1U;    /* disable INTTM11H interrupt */
    TMIF11H = 0U;    /* clear INTTM11H interrupt flag */
    /* Mask channel 2 interrupt */
    TMMK12 = 1U;    /* disable INTTM12 interrupt */
    TMIF12 = 0U;    /* clear INTTM12 interrupt flag */
    /* Mask channel 3 interrupt */
    TMMK13 = 1U;    /* disable INTTM13 interrupt */
    TMIF13 = 0U;    /* clear INTTM13 interrupt flag */
    /* Mask channel 3 higher 8 bits interrupt */
    TMMK13H = 1U;    /* disable INTTM13H interrupt */
    TMIF13H = 0U;    /* clear INTTM13H interrupt flag */
    /* Channel 0 is used as master channel for PWM output function */
    TMR10 = _0000_TAU_CLOCK_SELECT_CKM0 | _0000_TAU_CLOCK_MODE_CKS | _0000_TAU_COMBINATION_MASTER |
            _0000_TAU_TRIGGER_SOFTWARE | _0001_TAU_MODE_PWM_MASTER;
    TDR10 = _0C7F_TAU_TDR10_VALUE;
    TO1 &= ~_0001_TAU_CH0_OUTPUT_VALUE_1;
    TOE1 &= ~_0001_TAU_CH0_OUTPUT_ENABLE;
    /* Channel 1 is used as slave channel for PWM output function */
    TMR11 = _0000_TAU_CLOCK_SELECT_CKM0 | _0000_TAU_CLOCK_MODE_CKS | _0000_TAU_COMBINATION_SLAVE |
            _0400_TAU_TRIGGER_MASTER_INT | _0009_TAU_MODE_PWM_SLAVE;
    TDR11 = _0640_TAU_TDR11_VALUE;
    TOM1 |= _0002_TAU_CH1_OUTPUT_COMBIN;
    TOL1 &= ~_0002_TAU_CH1_OUTPUT_LEVEL_L;
    TO1 &= ~_0002_TAU_CH1_OUTPUT_VALUE_1;
    TOE1 |= _0002_TAU_CH1_OUTPUT_ENABLE;
    /* Set TO11 pin */
    P6 &= 0xDFU;
    PM6 &= 0xDFU;
}

void R_TAU1_Channel0_Start(void)
{
    TOE1 |= _0002_TAU_CH1_OUTPUT_ENABLE;
    TS1 |= _0001_TAU_CH0_START_TRG_ON | _0002_TAU_CH1_START_TRG_ON;
}


4.- El programa principal queda de la siguiente manera:

void main(void)
{
                        __EI();
                        SR_Oscilador();          // configura las frecuencias 32 Mhz cpu y Fsub a 32.768 khz
                        SR_INTERVAL_TIMER();     //  configura las frecuencia Fsub = 32.768 khz para IT y acceder a los delay_ms y delay_100us
                        SR_ADC();                // ADC ch 8
                        SR_INIT_PWM();           // configura TAU1 ch 0 y ch 1 para f = 10 khz

                        while(1)
                        {
                                               AdcValue = adc_get_vdd();                    // adquiere el valor 10 bits del ch 8
                                               // Duty factor [%] = {Set value of TDRmp (slave)}/{Set value of TDRmn (master) + 1} × 100
                                               // TDR10 = 3199;  TDR11 = 1600; al 50%
                                               // 1024     --- 3199
                                               // AdcValue ---  X
                                               period = 0xFFFF & (TDR10 + 1);
                                               u16DutyCycle = (period * AdcValue) / 1024;
                                               TDR11 = 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, debug con el icono del insecto y correr software:



VÍDEO:

No hay comentarios.:

Publicar un comentario