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:
2.- New/ C Project
- Configurar proyecto:
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:
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:
--> Practica #15
VÍDEO:
No hay comentarios.:
Publicar un comentario