FRDM-KL46Z_Pasos Es un programa que permite controlar un Motor a Pasos en sus diferntes modos de operación y tampbien permite controlar un Motor de CD en Modo ON-OFF Adelante y Atrás

Dependencies:   mbed Debounced tsi_sensor TSI TextLCD MMA8451Q USBDevice

main.cpp

Committer:
Antulius
Date:
2019-06-28
Revision:
1:e7f73d96ddde
Parent:
0:a935d23434d9

File content as of revision 1:e7f73d96ddde:

/* ###########################################################################
**    Archivo        : main.c
**    Proyecto       : FRDM-KL46Z_Pasos
**    Procesador     : MKL46Z256VLL4
**    Herramienta    : Mbed
**    Version        : Driver 01.01
**    Compilador     : GNU C Compiler
**    Fecha/Hora     : 14-07-2015, 11:48, # CodeGen: 0
**    Descripción    :
**      El programa genera las diferentes secuencias para operar un motor a pasos 
**      (Stepper Motor).
**      Este programa tiene 3 modos de operación:
**          1) Medio Paso
**          2) Pasos Completo
**          3) Pasos Wave
**      Además puede girar en el sentido horario o anti horario
**   Componentes     : GPIO, Timer, etc .
**   Configuraciones : Includes, Stacks y Drivers externos
**   Autores         :
**         ATEAM Development Group:
**          - Antulio Morgado Valle
**
**   Versión        : Beta
**   Revisión       : A
**   Release        : 0
**   Bugs & Fixes   :
**   Date           : 20/10/2019
**                    Added support for Led_RGB
**                    22/09/2018 
**                    Added LCD Menu, Beta version (with bugs)
**
** ###########################################################################*/
/*
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:  Includes
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
*/
#include "mbed.h"
#include "MKL46Z4.h"
#include "stdio.h"
#include "string.h"
#include "TSISensor.h"      // Libreria para Touch Sensor Interface
#include "TextLCD.h"        // Libreria para escritura en LCD 
#include "I2C.h"            // Libreria para la interface I2C
#include "SPI.h"            // Libreria para la interface SPI
#include "Serial.h"         // Libreria para la interface Serial
#include "MMA8451Q.h"       // Libreria para el Acelerómetro

#include "stdio.h" 
/*
:...............................................................................
:  Definiciones
:...............................................................................
*/
#define   MMA8451_I2C_ADDRESS (0x1d<<1) // Dirección del Acelerómetro

#define   Modo_Wave             3 
#define   Paso_Doble            2
#define   Paso_Completo         1 
#define   Medio_Paso            0 
#define   Sentido_Horario       1 
#define   Sentido_Antihorario   0 
#define   On                    0
#define   Off                   1
#define   TRUE                  1
#define   FALSE                 0
#define   DO2                   0.0078125            // 128 Hz
#define   DOs2                  0.0073740180703125   // 136 Hz
#define   RE2                   0.006960146234375    // 144 Hz
#define   REs2                  0.0065695032421875   // 152 Hz
#define   MI2                   0.006200785359375    // 161 Hz
#define   FA2                   0.005852762015625    // 171 Hz
#define   FAs2                  0.0055242717265625   // 181 Hz
#define   SOL2                  0.0052142181796875   // 192 Hz
#define   SOLs2                 0.0049215666015625   // 203 Hz
#define   LA2                   0.004645340296875    // 215 Hz
#define   LAs2                  0.004384617375       // 228 Hz
#define   SI2                   0.0041385277109375   // 242 Hz
#define   DO3                   0.00390625           // 256 Hz
#define   DOs3                  0.00368700903515625  // 271 Hz
#define   RE3                   0.0034800731171875   // 287 Hz
#define   REs3                  0.00328475162109375  // 304 Hz
#define   MI3                   0.0031003926796875   // 323 Hz
#define   FA3                   0.0029263810078125   // 342 Hz
#define   FAs3                  0.0055242717265625   // 362 Hz
#define   SOL3                  0.00260710908984375  // 384 Hz
#define   SOLs3                 0.00246078330078125  // 406 Hz
#define   LA3                   0.0023226701484375   // 431 Hz
#define   LAs3                  0.0021923086875      // 456 Hz
#define   SI3                   0.00206926385546875  // 483 Hz
#define   DO4                   0.00390625           // 512 Hz
#define   DOs4                  0.001843504517578125 // 542 Hz
#define   RE4                   0.00174003655859375  // 575 Hz
#define   REs4                  0.001642375810546875 // 609 Hz
#define   MI4                   0.00155019633984375  // 645 Hz
#define   FA4                   0.00146319050390625  // 683 Hz
#define   FAs4                  0.001381067931640625 // 724 Hz
#define   SOL4                  0.001303554544921875 // 767 Hz
#define   SOLs4                 0.001230391650390625 // 813 Hz
#define   LA4                   0.00116133507421875  // 861 Hz
#define   LAs4                  0.00109615434375     // 912 Hz
#define   SI4                   0.001034631927734375 // 966 Hz
#define   DO5                   0.001953125          // 1024 Hz
/*
+-------------------------------------------------------------------------------
|  Configuración de Puertos 
+-------------------------------------------------------------------------------
*/
Ticker     Barrido;                     // Interrupción del Timer
BusOut     Salidas(PTE19, PTE18, PTE17, PTE16); // Salidas a las bobinas:  A  /A   B  /B
DigitalOut Led_Azul  (PTE2);            // Definición para el Led Azul
DigitalOut Led_Verde (PTE3);            // Definición para el Led Verde
DigitalOut Led_Rojo  (PTE6);            // Definición para el Led Rojo
DigitalOut Green_Led (PTD5);            // Led de Actividad del Programa
DigitalOut Red_Led   (PTE29);           // Led de Actividad del Programa
DigitalIn  Adelante  (PTC3, PullUp);    // Switch para mover hacia Adelante
DigitalIn  Atras     (PTC12,PullUp);    // Switch para mover hacia Atras     
BusIn      Modo      (PTB18,PTB19);     // Modo de operación de los motores
PwmOut     Backlight (PTD2);            // Activacion Backlight del LCD
PwmOut     Buzzer    (PTE31);           // Salida del Buzzer

/*
** -------------------------------------------------------------------
**    Inicialización de los Pines de Funciones Especiales.
** -------------------------------------------------------------------
*/
TSISensor  tsi;                         //activa el Touch Sensor Interface

// Host PC Communication channels
Serial      terminal(USBTX, USBRX);     // USB Terminal Interface Tx, Rx
//Serial    terminal(PTA2,PTA1);        // Terminal Serial
//Serial    terminal(PTE0, PTE1);       // Tx, Rx Using MAX3232 or BlueTooth
//Serial    terminal(PTE22, PTE23);
// -------- Bluetooth Communication support --------
Serial      bluetooth(PTE0, PTE1);      // Tx, Rx

/************************************************* 
* Inicializa la biblioteca TextLCD con los números de los pines de la interface
* Board Freedom FRDM-KL25Z
* IDE  Mbed On Line Compiler
* LCD  SPI  SN74595
* Pin  Board     LCD
*      SPI_MOSI  SER   (white) 
*      SPI_MISO  none  (blue)  
*      SPI_CLK   SRCLK
*      SPI_PCS   RCLK
*      5V       5V  (red)
*      GND      GND (black)
* LCD  I2C  PCF8574A
* Pin  Board    LCD
*      I2C_SCL  SCL (white) + resistance pull-up 4.7k
*      I2C_SDA  SDA (blue)  + resistance pull-up 4.7k
*      5V       5V  (red)
*      GND      GND (black)
* LCD  Port PTE
* LCD  Port PTC
***************************************************/
// -------- I2C Communication ---------
//I2C         i2c_LCD(PTC2,PTC1);             // SDA, SCL

// -------- SPI Communication ---------
//SPI         spi_LCD(PTD6,PTD7,PTD5,PTD4);   // MOSI, MISO, SCLK, SSEL

//--------- LCD instantiation -----------
//TextLCD_SPI lcd(&spi_LCD, PTD4, TextLCD::LCD16x4, TextLCD::HD44780);  // SPI bus, SN74595 expander, CS pin, LCD Type 
//TextLCD_I2C lcd(&i2c_LCD, 0x7E, TextLCD::LCD20x4);                    // I2C bus, PCF8574A Arduino Shield, LCD Type
TextLCD     lcd(PTC6, PTC7, PTC8, PTC9, PTC10, PTC11, TextLCD::LCD20x4); // 4bit bus: rs, e, d4-d7
/*
+-------------------------------------------------------------------------------
|  Variables Globales de Usuario 
+-------------------------------------------------------------------------------
*/
uint8_t  paso;
uint8_t  No_Pasos;
uint8_t  Revoluciones;
uint8_t  Sentido;
uint8_t  modo_paso;
uint16_t Velocidad=50000;
char     Cadena[20];
char     Modo_0[]="Medio Paso\n\r";
char     Modo_1[]="Paso Completo\n\r";
char     Modo_2[]="Medio Paso\n\r";
char     Modo_3[]="Modo Wave\n\r";
char     Modo_4[]="Antihorario \n\r";
char     Modo_5[]="Horario \n\r";
uint8_t  Unipolar[8]      = {0x01,0x03,0x02,0x06,
                             0x04,0x0C,0x08,0x09} ;     // Unipolar
uint8_t  Bipolar[4]       = {0x05,0x09,0x0A,0x06} ;     // BiPolar
uint8_t  Wave_Drive[4]    = {0x01,0x02,0x04,0x08} ;     // Modo Onda 
uint8_t  Modo_Completo[4] = {0x03,0x06,0x0C,0x09} ;     // Paso Doble
bool     Flag;
uint8_t  dummy;
/*
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|  Definición de Funciones Prototipo y Rutinas de los Vectores de Interrupción
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
*/
void Barrido_OnInterrupt(void);              // Rutina de Atención al Ticker
void Buzzer_SetPeriodMode(float Periodo,bool Estado);
void outstrg(char *ap_cad);
void Despliega_L1(char *ap_cad);
void Despliega_L2(char *ap_cad); 
void Despliega_L3(char *ap_cad); 
void Despliega_L4(char *ap_cad);
 
/* END Events */        // Rutinas de Atención a Interrupciones


/*
#===============================================================================
|
|               P R O G R A M A     P R I N C I P A L
|
#=============================================================================== 
*/
int main() {
  /* Write your code here */
  Barrido.attach_us(&Barrido_OnInterrupt, Velocidad);   // Le asigna el periodo de barrido cada 10 ms
  No_Pasos=0,paso=0,modo_paso=Medio_Paso;   // Configuración de Arranque del Motor
  Red_Led   = Off;                          //Apaga Led's de los botones
  Green_Led = Off;     
  terminal.baud(115200);                    //velocidad de transmisión para la terminal serial
  /* Configufración del Display LCD */      /* Mucho OjO !!! */
//  spi_LCD.frequency(100000);      // Frecuencia de operación para el SPI (100KHz)
//  spi_LCD.format(8,0);            // Modo de Operación para el SPI
//  i2c_LCD.frequency(100000);      // Frecuencia de operación para el I2C (100KHz)
//  i2c_LCD.start();                // Inicio de operación para el I2C
  lcd.printf("  MOTOR A PASOS");    //mensaje a desplegar en el LCD
  terminal.printf("  MOTOR A PASOS\n\r\n");   
  Buzzer=Off;                       // Apaga el Buzzer
  Flag=TRUE;                        // Enciende la bandera
  while(1) 
  {
  if (Flag==TRUE)
    {
     outstrg ("MODO DEL MOTOR A PASOS: ");
       if (modo_paso==Modo_Wave)        strcpy (Cadena,Modo_3);
       if (modo_paso==Paso_Doble)       strcpy (Cadena,Modo_2);
       if (modo_paso==Paso_Completo)    strcpy (Cadena,Modo_1);  
       if (modo_paso==Medio_Paso)       strcpy (Cadena,Modo_0);         
     outstrg (Cadena);
     outstrg ("SENTIDO DEL MOTOR: ");
       if (Sentido==Sentido_Antihorario) strcpy (Cadena, Modo_4);
       if (Sentido==Sentido_Horario)     strcpy (Cadena, Modo_5);   
     outstrg (Cadena);
     dummy=sprintf(Cadena,"Paso:      %3d  \n\r",paso); 
     Despliega_L2 (Cadena);
     outstrg (Cadena);   
     dummy=sprintf(Cadena,"No. Pasos: %3d  \n\r",No_Pasos); 
     Despliega_L3 (Cadena);
     outstrg (Cadena);  
     dummy=sprintf(Cadena,"Vueltas: %3d  \n\r",Revoluciones); 
     Despliega_L4 (Cadena);
     outstrg (Cadena);
//     outstrg (Cadena);     
     Flag=FALSE ; 
//     if (tsi.readPercentage()!=0.0) Backlight = 1.0-tsi.readPercentage(); // Lee el TSI y cambia el Backlight del LCD
     if (tsi.readPercentage()!=0.0) Velocidad = (1.0-tsi.readPercentage())*65535; // Lee el TSI y cambia la velocidad del motor
     wait(0.1);
   
    }       // End Flag
  }         // End While
}           // End Main 
/* END Pasos */
/* END main() */
/*
................................................................................
:  Rutinas de los Vectores de Interrupción
................................................................................
*/
                // Las Rutinas de Atención a Interrupcion van aquí !

void Barrido_OnInterrupt(void)              // Rutina de Atención al Ticker
{
//    if (paso>8)paso=0;
//    Buzzer_SetPeriodMode(LA4,FALSE);      // Apaga el Buzzer
    modo_paso=Modo;
  if (Flag==FALSE)
  {
    if (Atras==FALSE)                       // Se presionó el Botón Izquierdo?
    {
      Red_Led=On;
      Sentido=Sentido_Antihorario;
      if (modo_paso==Modo_Wave)             // Modo: WAVE DRIVE
       {
         Buzzer_SetPeriodMode(DO2,TRUE);
         Buzzer=On;                         // Enciende el Buzzer
         if (paso==0) paso=3;
             else paso-- ;
             Salidas=Wave_Drive[paso];
             
       }
      if (modo_paso==Paso_Completo)            // Modo: FULL STEP
       {
        Buzzer_SetPeriodMode(MI2,TRUE);
        Buzzer=On;                          // Enciende el Buzzer
        if (paso==0) paso=6;
            else 
            {
             paso--; 
             paso--;                  
            }
            Salidas=(Unipolar [paso]);           
       }
      if (modo_paso==Medio_Paso)            // Modo: HALF STEP
       {
        Buzzer_SetPeriodMode(SOL2,TRUE);
        Buzzer=On;                          // Enciende el Buzzer
        if (paso==0) paso=7;
            else paso-- ;
            Salidas=(Unipolar [paso]);  
       }
      if (modo_paso==Paso_Doble)             // Modo: DOUBLE STEP
       {
         Buzzer_SetPeriodMode(LAs2,TRUE);
         Buzzer=On;                         // Enciende el Buzzer
         if (paso==0) paso=3;
             else paso-- ;
             Salidas=Bipolar[paso];
             
       } 
      No_Pasos-- ;
      Red_Led = Off;                        // Apaga Led's de los botones   
    }
    Flag=TRUE;
  if (Adelante==FALSE)                       // Se presionó el Botón Derecho?
    {
     Green_Led=On;
     Sentido=Sentido_Horario;
     if (modo_paso==Modo_Wave)              // Modo: WAVE DRIVE
       {
         Buzzer_SetPeriodMode(DO3,TRUE); 
         Buzzer=On;                         // Enciende el Buzzer
         if (paso==3) paso=0;
             else paso++ ;
             Salidas=(Wave_Drive [paso]);    
       }
     if (modo_paso==Paso_Completo)          // Modo: FULL STEP
       {
        Buzzer_SetPeriodMode(MI3,TRUE);
        Buzzer=On;                         // Enciende el Buzzer
        if (paso==6) paso=0;
            else 
             {
              paso++; 
              paso++;
             }
            Salidas=(Unipolar [paso]);               
       }
     if (modo_paso==Medio_Paso)             // Modo: HALF STEP
       {
        Buzzer_SetPeriodMode(SOL3,TRUE);
        Buzzer=On;                          // Enciende el Buzzer
        if (paso==7) paso=0;
            else paso++ ;
            Salidas=(Unipolar [paso]);      
       }   
      if (modo_paso==Paso_Doble)             // Modo: DOUBLE STEP
       {
         Buzzer_SetPeriodMode(LAs3,TRUE);
         Buzzer=On;                         // Enciende el Buzzer
         if (paso==3) paso=0;
             else paso++ ;
             Salidas=Bipolar[paso];
             
       }        
      No_Pasos++ ;     
    } 
      //Flag=TRUE;
      Green_Led = Off;                      //Apaga Led's de los botones    
  }
     if (No_Pasos==180)  Revoluciones++;  
   Flag=TRUE ;  
}
/* END Events */

/*
________________________________________________________________________________
|
|  Funciones Prototipo
|_______________________________________________________________________________
*/
                // Las Funciones Prototipo van aquí !
                
void Buzzer_SetPeriodMode(float Periodo,bool Estado)
{
    Buzzer.period(Periodo);
    Buzzer.pulsewidth(Periodo/2);
    if (Estado==1)Buzzer=0.5; 
    if (Estado==0)Buzzer=0.0; 
}


void outstrg(char *ap_cad) 
{  
  while(*ap_cad)
  {  
   while(!terminal.writeable()); 
   terminal.putc(*ap_cad++);
   printf("%s",*ap_cad);
  }
}

void Despliega_L1(char *ap_cad) 
{
    lcd.locate(0,1);            //Coloca cursor de la LCD al inicio de la Linea 1.
    lcd.printf("", *ap_cad);    //Imprime mensaje en la LCD.
}
void Despliega_L2(char *ap_cad) 
{
    lcd.locate(0,2);            //Coloca cursor de la LCD al inicio de la Linea 2.
    lcd.printf("", *ap_cad);    //Imprime mensaje en la LCD.
}
void Despliega_L3(char *ap_cad) 
{
    lcd.locate(0,3);            //Coloca cursor de la LCD al inicio de la Linea 3.
    lcd.printf("", *ap_cad);    //Imprime mensaje en la LCD.
}
void Despliega_L4(char *ap_cad) 
{
    lcd.locate(0,4);            //Coloca cursor de la LCD al inicio de la Linea 4.
    lcd.printf("", *ap_cad);    //Imprime mensaje en la LCD.
}
/* END Routines */ 

/* END program */ 

/*
+--------------------------------------------------------------------------------
|                               EJERCICIO
|
| 1.-   Habilitar el módulo TSI para cambiar la velocidad del motor.
| 2.-   Habilitar el programa para que despligue los datos en la pantalla LCD: 
|       
+-------------------------------------------------------------------------------
|                               EXAMEN
|
| 1.-   Modificar el programa para que envie datos y se pueda modificar a traves 
|       del teléfono celular por medio de la interface Bluetooth.
| Suerte!
+-------------------------------------------------------------------------------
|
|                     T H E     A N T U L I U S   T E A M
|  Research, Development, Systems Equipment, Support & Spare Parts    I n c.
|                (C) Copyright 1989-2014, All rigths Reserved
|
| This program is licensed under rules of
| THE BEANERS TECHNOLOGIES PROYECT
+-------------------------------------------------------------------------------
*/
/* END Mbed */