Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed
main.cpp
00001 #include "mbed.h" 00002 00003 AnalogIn s1(p16); //Entrada analógica do sensor 00004 00005 Ticker flipper; // Endereço da função a executarperiodicamente 00006 00007 DigitalOut led1(LED1); // LED1 Indica que programa está a correr 00008 DigitalOut led2(LED2); // LED2 Indica que estão a ser enviadas amostras 00009 DigitalOut led3(LED3); 00010 DigitalOut a(p19); //Controlar entrada A do multiplexer 00011 DigitalOut b(p18); //Controlar entrada B do multiplexer 00012 AnalogOut vref(p18); 00013 DigitalOut c(p17); //Controlar entrada C do multiplexer 00014 DigitalOut pot1(p6); //Chip select para potenciometro 1 R1 do divisor de tensão 00015 DigitalOut pot2(p8); //Chip select para potenciometro 2 R1 da ponte 00016 DigitalOut pot3(p29); //Chip select para potenciometro 1 R2 da ponte 00017 DigitalOut pot4(p9); //Chip select para potenciometro 4 Ganho do AmpOp 00018 00019 Serial pc(USBTX,USBRX); //Comunicação Serial 00020 00021 SPI pot(p5,NC,p7); //Comunicação SPI para potenciometros digitais 00022 00023 int state = 0; //Utilizado na leitura das mensagens 00024 bool start = false; //Dá ordem para iniciar ou não as medições 00025 char incoming; 00026 int saida = 0; //Define que sensores irão ser lidos 00027 float resDiv = 0.0; 00028 00029 //************************************************* 00030 //Coloca todos os sensores ativos uma vez por ciclo 00031 //************************************************* 00032 bool varrerSensores(){ 00033 00034 a = saida && 0b001; 00035 //b = saida && 0b010; 00036 c = saida && 0b100; 00037 00038 if(saida < 0b111) 00039 { 00040 return true; 00041 } 00042 else 00043 { 00044 saida = 0; 00045 return false; 00046 } 00047 } 00048 00049 //************************************* 00050 //Calibração de ponte/divisor de tensão 00051 //************************************* 00052 void calib(int res){ 00053 00054 pot1 = 1; 00055 pot2 = 1; 00056 pot3 = 1; 00057 pot4 = 1; 00058 int msg = res/2; 00059 pot.lock(); 00060 pot1 = 0; 00061 00062 pot.write(msg); 00063 00064 pot1 = 1; 00065 pot.unlock(); 00066 } 00067 00068 void mensagem(float amostra){ 00069 int msg[] = {0xFF, saida++, 0, 0}; 00070 msg[2] = (int) (amostra/256); //Define byte mais significativo 00071 msg[3] = amostra-msg[2]*256; //Define byte enos significativo 00072 00073 for(int i = 0; i < 4; i++){ //Envia mensagem completa 00074 pc.putc(msg[i]); 00075 } 00076 } 00077 00078 //************************************************************************************* 00079 // Aquisição de dados 00080 //************************************************************************************* 00081 void flip() 00082 { 00083 if(start){ //Se o botao start foi pressionado 00084 float amostra; 00085 while(varrerSensores()){ 00086 led2 = 1; //Acende LED para dar sinal de inicio de amostragem 00087 00088 amostra = 0; //Onde são guardados os valores amostrados 00089 00090 int msg[] = {0xFF, saida++, 0, 0}; //Mensagem a enviar saida++ aqui para o zero entrar também 00091 int n_amostras = 50; //N de amostras a fazer em cada medição para limpar o ruido 00092 int fatorMult = 1000; //Multiplicador para que se possa enviar apenas valores inteiros 00093 00094 for(int i = 0; i < n_amostras; i++) //Faz n_amostras medições para cada amostra enviada 00095 { 00096 amostra += s1.read(); 00097 } 00098 00099 amostra = amostra*3.300*fatorMult/n_amostras; //Calcula o valor a enviar na mensagem 3.3 é a tensão máxima 00100 00101 msg[2] = (int) (amostra/256); //Define byte mais significativo 00102 msg[3] = amostra-msg[2]*256; //Define byte enos significativo 00103 00104 for(int i = 0; i < 4; i++){ //Envia mensagem completa 00105 pc.putc(msg[i]); 00106 } 00107 00108 led2 = 0; //Acabou uma amostra desliga o led 00109 } 00110 } 00111 } 00112 00113 00114 00115 //********************************************* 00116 //Leitura de mensagens recebidas 00117 //********************************************* 00118 void pc2mbed() { 00119 00120 if (pc.readable()) { 00121 incoming = pc.getc(); 00122 switch(state) 00123 { 00124 case(0): 00125 if(incoming == 0xFF) //Nova mensagem 00126 { 00127 state = 1; 00128 } 00129 break; 00130 00131 case(1): 00132 if(incoming == 0x01) //Mensagem de ordem de start/stop 00133 { 00134 state = 2; 00135 } 00136 else if(incoming == 0x02)//Mensagem de setup 00137 { 00138 state = 3; 00139 } 00140 break; 00141 00142 case(2): 00143 if(incoming == 0x00){ 00144 start = true; 00145 } 00146 else if(incoming == 0x01){ 00147 start = false; 00148 } 00149 state = 0; 00150 break; 00151 00152 case(3): 00153 //resDiv = 0; 00154 resDiv = incoming; 00155 vref = resDiv/100; 00156 //state = 4; 00157 state = 0; 00158 break; 00159 00160 case(4): 00161 resDiv = resDiv || incoming; 00162 calib(resDiv); 00163 state = 0; 00164 break; 00165 00166 default: 00167 break; 00168 } 00169 } 00170 } 00171 00172 //************************************************************************************* 00173 // Rotina Principal 00174 //************************************************************************************* 00175 int main() 00176 { 00177 // Inicialização dos LED 00178 led1 = 0; // LED off 00179 led2 = 0; 00180 calib(20); 00181 vref = 0.5; 00182 // Rotina de aquisição de dados executada a cada 5x/segundo 00183 flipper.attach(&flip, 0.1); 00184 00185 // Rotina de leitura de dados na porta serial 00186 pc.attach(&pc2mbed, Serial::RxIrq); 00187 00188 // Entra em espera com LED1 a piscar 00189 while(1) 00190 { 00191 led1 = 1; 00192 wait(1); 00193 led1 = 0; 00194 wait(1); 00195 } 00196 } 00197 00198 //FILE *fp = fopen("/local/out.txt", "a"); // Abreficheiro em modo "append"
Generated on Tue Jul 12 2022 23:55:08 by
1.7.2