FRDM-KL46Z_PWM-8_TSI_SLCD Es un demo sobre la utilización del TSI en modo Analógico para controlar el porcentaje de modulación de cada uno de los canales PWM y mostrar su valor en el display SLCD de la Tarjeta.

Dependencies:   mbed tsi_sensor SLCD

main.cpp

Committer:
Antulius
Date:
2019-06-26
Revision:
1:a15b72b2d043
Parent:
0:ec9a22de0d15

File content as of revision 1:a15b72b2d043:

/* ###########################################################################
**    Archivo        : main.c
**    Proyecto       : FRDM-KL46Z_PWM-8_TSI_SLCD
**    Procesador     : MKL46Z256VLL4
**    Tarjeta        : FDRM-KL46Z
**    Herramienta    : Mbed
**    Version        : Driver 01.01
**    Fecha/Hora     : 27-05-2019, 15:18, # CodeGen: 0
**    Descripción    :
**         Este proyecto realiza el control de 8 salidas PWM para su aplicación 
**         en la iluminación de una barra de LED's controaldo su intensidad
**         individualmente mediante el TSI
**   Componentes     : PWM(D0-D7), DisplayLCD, TSI, GPIO
**   Autores         : Monserrat Gutierrez Aranda
**         ATEAM Development Group:
**          - Antulio Morgado Valle
**   Versión        : Beta
**   Revisión       : A
**   Release        : 0
**   Bugs & Fixes   :
**   Date           : 
**
** ###########################################################################*/
/*
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:  Includes
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
*/
#include "mbed.h"
#include "SLCD.h"
#include "tsi_sensor.h"
/*
:...............................................................................
:  Definiciones
:...............................................................................
*/
// Very simple program to read the analog slider and print its value
// on the LCD. Also flashes the RED led.
// -- Al Williams

/* This defines will be replaced by PinNames soon */
#if defined (TARGET_KL25Z) || defined (TARGET_KL46Z)
  #define ELEC0 9
  #define ELEC1 10
#elif defined (TARGET_KL05Z)
  #define ELEC0 9
  #define ELEC1 8
#else
  #error TARGET NOT DEFINED
#endif
/*
+-------------------------------------------------------------------------------
|  Configuración de Puertos 
+-------------------------------------------------------------------------------
*/
//Configuración Terminal Serial
Serial      terminal(USBTX,USBRX); // OjO USBTX = PTA2, USBRX = PTA1
//Configuración TSI Analógico
TSIAnalogSlider tsi(ELEC0, ELEC1, 40);
//Configuración LCD
SLCD        slcd; 
//Configuración de PWM's para control de luminocidad
/*
PwmOut      led1(PTC1);    // PTC1_TPM0_CH0
PwmOut      led2(PTA4);    // PTA4_TPM0_CH1
PwmOut      led3(PTA5);    // PTA5_TPM0_CH2
PwmOut      led4(PTA6);    // PTA6_TPM0_CH3
PwmOut      led5(PTA7);    // PTA7_TPM0_CH4
PwmOut      led6(PTD5);    // PTD5_TPM0_CH5
PwmOut      led7(PTA12);   // PTA12_TPM1_CH0
PwmOut      led8(PTA13);   // PTA13_TPM1_CH1
*/
PwmOut      led1(A5);    // PTC1_TPM0_CH0  
PwmOut      led2(A4);    // PTC2_TPM0_CH1
PwmOut      led3(D5);    // PTA5_TPM0_CH2  
PwmOut      led4(D2);    // PTD2_TPM0_CH3
PwmOut      led5(D6);    // PTD6_TPM0_CH4
PwmOut      led6(D7);    // PTC9_TPM0_CH5
PwmOut      led7(D3);    // PTA12_TPM1_CH0
PwmOut      led8(D8);    // PTA13_TPM1_CH1  

DigitalOut gpo(D0);
DigitalOut led(LED_RED);
//Configuración de terminales de entrada
//DigitalIn   Push1(PTC12);    //
//DigitalIn   Push2(PTC3);     //
//Interrupciones externas
InterruptIn incrementa (SW1);      //
InterruptIn decrementa (SW3);      //
/*
+-------------------------------------------------------------------------------
|  Variables Globales de Usuario 
+-------------------------------------------------------------------------------
*/
//LCD
char buffer[5];
//Selección de PWM
int menu = 0;
/*
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|  Definición de Funciones Prototipo y Rutinas de los Vectores de Interrupción
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
*/
//LCD
char Int2Char(int);
void Number2Buffer(int, int);
void imprimir(int, int);
//Interrupciones
void incrementaIRQ(void);
void decrementaIRQ(void);

/* END Definitions */  
////////////////////////////////////////////////////////////////////////////////
/*
#===============================================================================
|
|               P R O G R A M A     P R I N C I P A L
|
#=============================================================================== 
*/
int main()
{
 //Se inicializa la Terminal Serial   
 terminal.baud(115200);  
 terminal.printf("8 PWM's controlados por TSI"); 
//Se inicializa el LCD 4x8            
    slcd.Home();
    slcd.printf("HOLA");
    wait(2.5);
    slcd.All_Segments(1);
    wait(0.5);
    slcd.All_Segments(0);
    wait(0.1); 
//Encendemos el punto 1 de la LCD
    slcd.DP1(1);
//Inicializamos interrupciones externas
    incrementa.mode(PullUp); 
    decrementa.mode(PullUp); 
    incrementa.fall(&incrementaIRQ);     //
    decrementa.fall(&decrementaIRQ);     //
//Se inicializan los PWM's
    led1 = 0;
    led2 = 0;
    led3 = 0;
    led4 = 0;
    led5 = 0;
    led6 = 0;
    led7 = 0;
    led8 = 0;  
//Bucle infinito
    while (true) 
    {        
        switch(menu)
        {
            case 0:
                if(tsi.readPercentage()!=0){led1 = tsi.readPercentage();}
                imprimir(1,led1*100);
                terminal.printf("1,%d \r",led1*100 );
                break;
            case 1:
                if(tsi.readPercentage()!=0){led2 = tsi.readPercentage();}
                imprimir(2,led2*100);
                terminal.printf("2,%d \r",led2*100 );
                break;
            case 2:
                if(tsi.readPercentage()!=0){led3 = tsi.readPercentage();}
                imprimir(3,led3*100);
                terminal.printf("3,%d \r",led3*100 );
                break;
            case 3:
                if(tsi.readPercentage()!=0){led4 = tsi.readPercentage();}
                imprimir(4,led4*100);
                terminal.printf("4,%d \r",led4*100 );
                break;
            case 4:
                if(tsi.readPercentage()!=0){led5 = tsi.readPercentage();}
                imprimir(5,led5*100);
                terminal.printf("5,%d \r",led5*100 );
                break;
            case 5:
                if(tsi.readPercentage()!=0){led6 = tsi.readPercentage();}
                imprimir(6,led6*100);
                terminal.printf("6,%d \r",led6*100 );
                break;
            case 6:
                if(tsi.readPercentage()!=0){led7 = tsi.readPercentage();}
                imprimir(7,led7*100);
                terminal.printf("7,%d \r",led7*100 );
                break;
            case 7:
                if(tsi.readPercentage()!=0){led8 = tsi.readPercentage();}
                imprimir(8,led8*100);
                terminal.printf("8,%d \r",led8*100 );
                break;
            default:              
                break;
        }
        wait(0.1);
    }
}  

/* END main */
/*
................................................................................
:  Rutinas de los Vectores de Interrupción
................................................................................
*/
void incrementaIRQ()
{
    if(menu>=7){menu = 7;}
    else{menu++;}
}
void decrementaIRQ()
{
    if(menu<=0){menu = 0;}
    else{menu--;}
}

/* END Events */  
/*
________________________________________________________________________________
|
|  Funciones Prototipo
|_______________________________________________________________________________
*/
char Int2Char(int numero)
{
    return numero + '0';
}
void Number2Buffer(int display, int porcentaje)
{
    int centena = porcentaje/100;
    int decena  = (porcentaje-(centena*100))/10;
    int unidad  = porcentaje-centena*100-decena*10;
    buffer[0]= Int2Char(display);
    buffer[1]= Int2Char(centena);
    buffer[2]= Int2Char(decena);
    buffer[3]= Int2Char(unidad);
}
void imprimir(int display, int porcentaje)
{
    Number2Buffer(display,porcentaje);
    slcd.printf(buffer);
}

/* END Program */

/* END Mbed */