Advertisement
Guest User

Untitled

a guest
May 29th, 2015
255
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.36 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <p32xxxx.h>
  4. #define _SUPPRESS_PLIB_WARNING 1
  5. #include <plib.h>
  6. #include <math.h>
  7.  
  8. #define SYSCLK 80000000L // System clock frequency, in Hz
  9. #define PBUSCLK 40000000L // Peripheral bus clock
  10.  
  11. void delay(unsigned int);
  12. int ADC(int channel);
  13. float calc_massa(int channel,int nConversions);
  14. void initADC (void);
  15. int timerPWM(void);
  16. float calc_temp(int channel,int nConversions);
  17. float calc_altura (int temperatura);
  18. float media (float* array, int medidas, int ordem);
  19.  
  20. int main(int argc, char** argv) {
  21.  
  22.     TRISEbits.TRISE7 = 1;
  23.     int i;
  24.     float altura, temperatura, massa, imc;
  25.     int channel_massa = 0, channel_temp = 1;
  26.     int nConversions = 10;
  27.    
  28.  
  29.     SYSTEMConfigPerformance(SYSCLK);
  30.     mOSCSetPBDIV(OSC_PB_DIV_2);
  31.  
  32.     initADC();
  33.  
  34.    /* float array [8] = {5.1,5.2,6.0,5.3,6.2,1.0,20.4,4.5};
  35.     printf("Media %4.1f \n",media(&array,num_medidas,ordem));
  36.  
  37.     while(1);*/
  38.  
  39.  
  40.     while(1) {
  41.     temperatura= calc_temp(channel_temp, nConversions);
  42.     printf("Temperatura %4.1f (K) \n",temperatura);
  43.     altura=calc_altura(temperatura);
  44.     printf("Altura %4.2f (m) \n", altura);
  45.     massa=calc_massa (channel_massa, nConversions);
  46.     printf("Peso %4.1f (Kg) \n",massa);
  47.     imc = massa/(altura*altura);
  48.     printf("IMC %4.1f f\n",imc);
  49.  
  50.     if (imc < 16) printf("Magreza grave\r");
  51.     else if (imc >= 16 && imc <17) printf("Magreza moderada\r");
  52.     else if (imc >= 17 && imc <18.5) printf("Magreza leve\r");
  53.     else if (imc >= 18.5 && imc <25) printf("Saudavel\r");
  54.     else if (imc >= 25 && imc <30) printf("Sobrepeso\r");
  55.     else if (imc >= 30 && imc <35) printf("Obsidade Grau I\r");
  56.     else if (imc >= 35 && imc <40) printf("Obsidade Grau II (Severa)\r");
  57.     else if (imc >= 40) printf("Obsidade Grau III (Morbida)\r");
  58.  
  59.     printf("\n");
  60.     Delay_ms(300);
  61.     }
  62. }
  63.  
  64. float calc_massa(int channel,int nConversions){
  65.     int i;
  66.     float s = 0;
  67.     float res[nConversions];
  68.     int medidas=20, ordem=2;
  69.  
  70.     for (i=0 ; i < nConversions; i++){
  71.         res[i] = (float) ADC(channel);
  72.     }
  73.  
  74.     for(i=0;i<nConversions;i++) {
  75.         s=s+res[i];
  76.     }
  77.  
  78.     s=media(&res,medidas,ordem);
  79.     int valor_ADC = s / nConversions;
  80.     float valor_ADC_float=0.0+valor_ADC;
  81.     valor_ADC_float = ((valor_ADC_float*3.3)/1023);
  82.     float massa = ((valor_ADC_float-0.4942)/0.0109);
  83.     return massa+1.0;
  84. }
  85.  
  86. float calc_temp(int channel,int nConversions){
  87.     int res[nConversions];
  88.     int i;
  89.     float s = 0;
  90.     for(i=0 ; i < nConversions ; i++){
  91.         res[i] = ADC(channel);
  92.      }
  93.     for(i=0 ; i < nConversions ; i++){
  94.        s = s + res[i];
  95.     }
  96.     float resultado = s/nConversions;
  97.  
  98.     float temperatura_K = ((resultado*3.3/1024)/0.01);
  99.     return temperatura_K;
  100. }
  101.  
  102. float calc_altura (int temperatura){
  103.     int i,j;
  104.     float dist, soma=0, altura = 2.10, media2=0;
  105.     int tempo;
  106.     int tempo_max=0;
  107.     int inicio;
  108.     float array_tempo [20];
  109.     float Vsom;
  110.     int medidas=20, ordem=2;
  111.  
  112.  
  113.     for (i=0; i<20; i++) {
  114.         WriteCoreTimer(0);
  115.         timerPWM();
  116.         array_tempo[i] = (float) ReadCoreTimer();
  117.         Delay_ms(100);
  118.     }
  119.  
  120.     /*media2=media (&array_tempo,medidas,ordem);
  121.     printf(" media %4.1f",media2);
  122.      * */
  123.     for (i=0; i<20; i++) {
  124.         media2=media2+array_tempo[i];
  125.     }
  126.     media2=media2/medidas;
  127.  
  128.     Vsom=20*sqrt(temperatura);
  129.     dist=Vsom*(media2/40000);
  130.     dist=(dist*3)/80;
  131.     return altura=altura-(dist*0.01);
  132.     }
  133.  
  134.  
  135. void Delay_ms(unsigned int dms)
  136. {
  137.     unsigned int t;
  138.     t=ReadCoreTimer()+40000*dms;
  139.     while(ReadCoreTimer() < t);
  140. }
  141.  
  142. void _mon_putc(char c) {
  143.     while (U1STAbits.UTXBF); // Wait till buffer available (TX Buffer Full)
  144.     U1TXREG = c; // Put char in Tx buffer
  145.     return;
  146. }
  147.  
  148. int _mon_getc(int canblock) {
  149.  
  150.     // Reset Overrun Eror Flag - if set UART does not receive any chars
  151.     if (U1STAbits.OERR)
  152.         U1STAbits.OERR;
  153.  
  154.     if (canblock == 0) {
  155.         if (U1STAbits.URXDA)
  156.             return (int) U1RXREG;
  157.     }
  158.     else {
  159.         while (!U1STAbits.URXDA);
  160.         return (int) U1RXREG;
  161.     }
  162.     return -1;
  163. }
  164.  
  165. /*float media (float *array_dist, int medidas) {
  166.     float min=100000000; ////rever isto
  167.     float max=0;
  168.     float soma=0, media;
  169.     int i,j;
  170.     int minPos, maxPos;
  171.  
  172.     for(i=0;i<medidas-1;i++) {
  173.         if(array_dist[i]<min){
  174.             min=array_dist[i];
  175.             minPos=i;
  176.         }
  177.         else if(array_dist[i]>max){
  178.             max=array_dist[i];
  179.             maxPos=i;
  180.         }
  181.     }
  182.     array_dist[minPos]=0;
  183.     array_dist[maxPos]=0;
  184.     for(j=0;j<medidas-1;j++) {
  185.        soma=soma+array_dist[j];
  186.     }
  187.     return media=soma/(medidas-2); ////-2 porque assim desconta os zeros
  188. }*/
  189.  
  190. float media (float* array, int medidas, int ordem) {
  191.     int i;
  192.     float soma, media, aux, tmpsum;
  193.     while(ordem>0) {
  194.         soma=0;
  195.         media=0;
  196.         float afast=0;
  197.         int posAfast=0;
  198.  
  199.         for(i=0;i<medidas;i++) {
  200.             soma=soma+array[i];
  201.         }
  202.  
  203.         media=soma/medidas;
  204.  
  205.         for(i=0;i<medidas;i++) {
  206.             aux=fabsf(media-array[i]);
  207.             if(aux>afast) {
  208.                 afast=aux;
  209.                 posAfast=i;
  210.             }
  211.         }
  212.         tmpsum = soma - array[posAfast] + media;
  213.         array[posAfast]=media;
  214.         ordem--;
  215.     }
  216.  
  217.     return tmpsum/medidas;
  218. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement