Francisco Sarabia / Mbed 2 deprecated STM32F103C8T6_MinimosCuadrados

Dependencies:   mbed

main.cpp

Committer:
franciscos
Date:
2020-03-04
Revision:
0:0b7bc4adc2a7

File content as of revision 0:0b7bc4adc2a7:

/* #############################################################################
**    Archivo        : main.c
**    Proyecto       : STM32F103C8_Caratula
**    Procesador     : STM32F103C8T6
**    Plataforma     : Blue Pill
**    Herramienta    : Mbed Compiler
**    Version        : Driver 01.01
**    Compilador     : GNU C Compiler
**    Fecha/Hora     : 17-02-2020, 22:53, # CodeGen: 0
**    Descripción    :
**         Este proyecto hace una carátula para mostrar la presentación
**         This module contains user's application code.
**   Componentes     : GPIO, Timer, etc .
**   Configuraciones : Includes, Stacks y Drivers externos
**   Autores         :
**         ATEAM Development Group:
**          -  Francisco Sarabia López, Antulio Morgado Valle(plantilla)
**
**   Versión        : Alpha
**   Revisión       : A
**   Release        : 0
**   Bugs & Fixes   :
**   Date           : 
**
** ###########################################################################*/
/*
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:  Includes
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
*/
#include "stm32f103c8t6.h"
#include "mbed.h"
#include "Serial.h"
//#include "LedRGB.h"
//#include "stdio.h"

/*
:...............................................................................
:  Definiciones
:...............................................................................
*/
#define  on             0           // Estado para boton presionado
#define off             1           // Estado para boton sin presionar
#define hold            2           // Estado para boton mantenido
#define release         3           // Estado para boton liberado
#define FALSE           0           // Estado FALSO
#define TRUE            1           // Estado VERDADERO
#define Ticker_Rate     1000        // Periodo de interrupción Ticker (us)
#define Baud_Rate       115200      // Velocidad de Transmisión de la Terminal
/*
+-------------------------------------------------------------------------------
|  Configuración de Puertos 
+-------------------------------------------------------------------------------
*/
Ticker      TimerInt;               // Inicializa la Interrupción por Timer
DigitalOut  led_monitor(LED1);      // Inicializa el LED Monitor
DigitalOut  led_testigo(PB_1);      // Inicializa el LED Testigo
PwmOut      led_pwm(PA_7);          // Inicializa el LED PWM
AnalogIn    sensor1(PB_0);          // Inicializa Canal Analógico para sensor 1
Serial      terminal(PA_2, PA_3);   // Inicializa la Comunicación Serial a la PC
/*
+-------------------------------------------------------------------------------
|  Variables Globales de Usuario 
+-------------------------------------------------------------------------------
*/
uint16_t Rate=Ticker_Rate/2;        // Velocidad de barrido (500us = 0.5ms)
uint16_t counter=250;               // Cuenta inicial de 250us
/* END variables */

/*
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|  Definición de Funciones Prototipo y Rutinas de los Vectores de Interrupción
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
*/
        // Las Definiciones de Funciones Prototipo 
        // y Apuntadores a Vectores de Interrupciones van aquí !
void TimerInt_OnInterrupt(void);  
void Blinking_Led(void);
void PideDatos(int *Dat, int *Ord,float Val[][10]);
float Potencia(int n, float Num);
void PreparaSistema(int Ord, int Dat, float Sist[][10], float Val[][10]);
void ResuelveGauss(int Dim, float Sist[][10]);
void ImprimeDatos(int Dim, float Sist[][10]);

/* END prototypes */

/* END definitions */  
/*
#===============================================================================
|
|               P R O G R A M A     P R I N C I P A L
|
#=============================================================================== 
*/
int main()          
{                           // Inicialización de variables, puertos e interrupciones
confSysClock();             // Inicialización del Sistema, Configure system clock (72MHz HSE clock, 48MHz USB clock)
TimerInt.attach_us(&TimerInt_OnInterrupt, Ticker_Rate);   // Le asigna el periodo de interrupción de 1ms (Ticker_Rate=1000)

terminal.baud(Baud_Rate);      // Se configura la velocidad de transmisión e inicia la comunicación serial.    
terminal.printf(" System is Wake Up!.\n\r"); 

    while (true)                // El Lazo del Programa principal está aquí !!!
    {
        Blinking_Led();             // Parapadeo del LED por Software
        led_pwm = sensor1.read();   // El Led se encenderá de acuerdo al valor del sensor
        terminal.printf("INSTITUTO POLITECNICO NACIONAL \r\n");
        terminal.printf("\n EEEEEEE       SSSS      IIIIIII     M      M    EEEEEEE \r\n");
        terminal.printf(  " E            S             I        M M  M M    E \r\n");
        terminal.printf(  " EEEEEEE       SSSS         I        M  MM  M    EEEEEEE \r\n");
        terminal.printf(  " E                 S        I        M      M    E \r\n"); 
        terminal.printf(  " EEEEEEE       SSSS      IIIIIII     M      M    EEEEEEE \r\n");
        terminal.printf(  "\n Francisco Sarabia Lopez\r\n"); 
        terminal.printf(  "\n Ingenieria en Comunicaciones y Electronica\r\n");  
        
        int Datos,Orden,i;
    float Valores[2][10];
    float Sistema[10][10];
    
    PideDatos(&Datos,&Orden,Valores);
    
    PreparaSistema(Orden,Datos,Sistema,Valores);
    printf("\n\n El sistema a resolver es el siguiente:");
    ImprimeDatos(Orden,Sistema);
    ResuelveGauss(Orden,Sistema);
    printf("\n\n El sistema resuelto:");
    ImprimeDatos(Orden,Sistema);
    printf("\n\n La Ecuacion del Polinomio ajustado por minimos Cuadrados\n\n:");
    for(i=1;i<=Orden;i++)
    {
        printf(" + \t(%.2f)X^%d",Sistema[i][Orden+1],i-1);
    }   
    return 0;                          
    }
}
/* END main */

/*
................................................................................
:  Rutinas de los Vectores de Interrupción
................................................................................
*/
                // Las Rutinas de Atención a Interrupciones van aquí !
void TimerInt_OnInterrupt()          // Rutina de Atención al Ticker
{
    
}
/* END Events */   
/*
________________________________________________________________________________
|
|  Funciones Prototipo
|_______________________________________________________________________________
*/
                // Las Funciones Prototipo van aquí !
void Blinking_Led()     // Software Blinking routine for LED 
{
        // The on-board LED is connected, via a resistor, to +3.3V (not to GND). 
        // So to turn the LED on or off we have to set it to 0 or 1 respectively
    led_testigo = 1;        // turn the LED on (using Positive Logic)
    wait_ms(200);           // 200 millisecond
    led_testigo = 0;        // turn the LED off (using Positive Logic)
    wait_ms(1000);          // 1000 millisecond
}

void PideDatos(int *Dat, int *Ord,float Val[][10])
{
    int i,o;
    printf("\n Introduce el numero de datos o puntos: ");
    scanf("%d",&*Dat);
    printf("\n\n Introce los valores de cada punto\n");
    for(i=0;i<*Dat;i++)
    {
        printf(" -Valores del Punto %d:\n",i+1);
        printf("   X%d: ",i+1); 
        scanf("%f",&Val[0][i+1]);
        printf("   Y%d: ",i+1); 
        scanf("%f",&Val[1][i+1]);
    }
    printf("\n\n Introduce el orden del polinomio: "); 
    scanf("%d",&o);
    *Ord=o+1;
}

float Potencia(int n, float Num)
{
    int i;
    float res;
   
    res=1;
    for(i=1;i<=n;i++) 
    {
        res=res*Num;
    }
    return res;
}

void PreparaSistema(int Ord, int Dat, float Sist[][10], float Val[][10])
{
    int i,j,k,Exp;
    float suma,termino;
   
    for(i=1;i<=Ord;i++)    
    {
        for(j=1;j<=Ord;j++)
        {
            suma=0;
            Exp=i+j-2;
      
            for(k=1;k<=Dat;k++)
            {
                termino=Val[0][k];
                suma=suma+Potencia(Exp,termino);
            }
            Sist[i][j]=suma;
        }
        
    }
    for(i=1;i<=Ord;i++)
    {
        suma=0;
        Exp=i-1;
      
        for(k=1;k<=Dat;k++)
        {
            termino=Val[0][k];
            suma=suma+Val[1][k]*Potencia(Exp,termino);
        }
        Sist[i][Ord+1]=suma;
    }
}

void ResuelveGauss(int Dim, float Sist[][10])
{
    int NoCero,Col,C1,C2,A;
    float Pivote,V1;
   
    for(Col=1;Col<=Dim;Col++)
    {
        NoCero=0;A=Col;
        while(NoCero==0)
        {
            if(Sist[A][Col]!=0)
            {
                NoCero=1;
            }
            else 
            {
                A++;
            }
            Pivote=Sist[A][Col];
            for(C1=1;C1<=(Dim+1);C1++)
            {
                V1=Sist[A][C1];
                Sist[A][C1]=Sist[Col][C1];
                Sist[Col][C1]=V1/Pivote;
            }
            for(C2=Col+1;C2<=Dim;C2++)
            {
                V1=Sist[C2][Col];
                for(C1=Col;C1<=(Dim+1);C1++)
                {
                    Sist[C2][C1]=Sist[C2][C1]-V1*Sist[Col][C1];
                }
            }
        }
    }
    for(Col=Dim;Col>=1;Col--) 
    {
        for(C1=(Col-1);C1>=1;C1--)
        {
            Sist[C1][Dim+1]=Sist[C1][Dim+1]-Sist[C1][Col]*Sist[Col][Dim+1];
            Sist[C1][Col]=0;
        }
        
    }
}

void ImprimeDatos(int Dim, float Sist[][10])
{
    int i,j;
    
    printf("\n\n");
    for(i=1;i<=Dim;i++)
    {
        for(j=1;j<=(Dim+1);j++)
        {
            printf("\t%.2f",Sist[i][j]);
            if(j==Dim) 
            {
                printf("   |");
            }
        }
        printf("\n");
    }
    printf("\n\n");
}

/* END functions */    
                
/* END program */

/*+-----------------------------------------------------------------------------       
*+ La documentación va aquí!:
*+-----------------------------------------------------------------------------       
*+
*+
*+----------------------------------------------------------------------------*
*+
*+   Powered by
*+
*+          T H E     A N T U L I U ' S   T E A M   R&D  Unltd 
*+
*+  Research, Development, Systems, Equipment, Support & Spare Parts.
*+  (C) Copyright 1989-2019, All Rights Reserved            
*+
*+  Welcome to The Beaners Proyect Community!                   
*+----------------------------------------------------------------------------*/

/* END documentation */ 

/* END Mbed */