Denis Brousse
/
AX12-VoiceTronics_DB03-IRQ
Avec mesure de pression
Fork of Serial_HelloWorld_Mbed by
main.cpp
- Committer:
- dbrousse
- Date:
- 2015-05-27
- Revision:
- 4:0cab1f60b700
- Parent:
- 1:b9cade20e07e
File content as of revision 4:0cab1f60b700:
/************************************ * DB le 25/03/2015 modif le 27/05/2015 * Pilotage AX-12A avec liaison série : Trame VoiceTronics2015 * Piloter les positions * Débit = 1Mbit/s * commande 0/10volt Ok * mesure pression avec filtrage par moyenne *************************************/ #include "mbed.h" #include "MX-28_DefConstantes.h" #define NBRE_ACK 256 // nombre d'acquisition pour la moyenne sur mesure pression DigitalOut led01(LED1); DigitalOut led02(LED2); DigitalOut led03(LED3); DigitalOut led04(LED4); DigitalOut LedRouge(p23); DigitalOut dir(p8); AnalogOut servoVanne(p18); AnalogIn mesPression(p20); unsigned char numeroOctetRecu=0; char octetRecu; //premier octet reçu char bufferRec[5]; // buffer de réception serialPc int valeurPressionPascal; //Serial serialPc(p28, p27); // tx, rx (c'est l'uart2 du LPC1768)compatible LabVIEW Serial serialPc(USBTX, USBRX); // tx, rx, 9600baud par défaut, pas compatible LabVIEW Serial uart3(p9, p10); // tx, rx pour servomoteurs numériques // Envoi de la trame de pilotage a un servomoteur AX-12A void write (char id, char longueurTrame, char instruction, char param1 = NULL, char param2 = NULL, char param3 = NULL, char param4 = NULL) { char Cks; Cks = ~( id + longueurTrame + instruction + param1 + param2 + param3 + param4); //calcul du checkSum //serialPc.printf("Cks : %d\n", Cks); dir = 1; uart3.putc(0xFF); uart3.putc(0xFF); uart3.putc(id); uart3.putc(longueurTrame); uart3.putc(instruction); if (longueurTrame >= 3) { uart3.putc(param1); } if (longueurTrame >= 4) { uart3.putc(param2); } if (longueurTrame >= 5) { uart3.putc(param3); } if (longueurTrame >= 6) { uart3.putc(param4); } uart3.putc(Cks); wait_us(MX28_WAIT_AFTER_WRITE); dir = 0; } // Set goal position of engine void setPosition(char id, int goal) { char goal_h = goal >> 8; char goal_l = goal; //serialPc.printf("Goal set : %d %d %d\n", goal, goal_h, goal_l); write(id, 5, MX28_WRITE_DATA, MX28_GOAL_POSITION_L, goal_l, goal_h); } // Mesure de la pression avec moyenne sur NBRE_ACK int mesureDePression() { float sommePression=0; int valP; for(int i=0; i<NBRE_ACK;i++) { sommePression += mesPression; } valP = ((sommePression*3.3*1.7979)/0.000805/NBRE_ACK); return valP; } // Reception d'un octet void receptionPc() { // fonction appelée par interruption si réception sur serialPc led04 =1; octetRecu = serialPc.getc(); if(octetRecu == '$') { numeroOctetRecu = 0; memset(&bufferRec[0], 0, sizeof(bufferRec)); } else { bufferRec[numeroOctetRecu-1] = octetRecu; } if(numeroOctetRecu == 5) { if (bufferRec[0] == '0') // si c'est une commande de position AX12 { int idServo = bufferRec[1] - 0x30; int a1 = bufferRec[2] - 0x30; int a2 = bufferRec[3] - 0x30; int a3 = bufferRec[4] - 0x30; int anglePosition = (a1 * 100) + (a2 * 10) + a3; int valeurPosition = anglePosition * 1023 / 300; setPosition(idServo, valeurPosition); //Pour Debug //serialPc.printf("idServ = %d \tvaleurPosition = %d\n",idServo, valeurPosition); } if (bufferRec[0] == '1') // si c'est une commande pour servovanne { int a1 = bufferRec[2] - 0x30; int a2 = bufferRec[3] - 0x30; int a3 = bufferRec[4] - 0x30; float commandeVanne = ((a1 * 100) + (a2 * 10) + a3)*3/3.3/100; // à étalonner !!! servoVanne = commandeVanne; //Pour Debug //serialPc.printf("Commande servovanne %d %%\n",int (commandeVanne*100*3.3/3)); } if (bufferRec[0] == '2') // si c'est une demande de pression { //Pour Debug, valeur fixe retournée //serialPc.printf("$203625"); // pour test envoie de la mesure=3625Pa serialPc.printf("$2%0#5d",valeurPressionPascal); //voir cours Garreta page 85 } numeroOctetRecu = 0; } else { numeroOctetRecu++; } led04 =0; } int main() { uart3.baud(1000000); serialPc.baud(115200); serialPc.attach(&receptionPc); // defini la fonction interruption wait(1); //serialPc.printf("Entrer une commande\n"); led01 = 1; LedRouge=1; // Clear buffer memset(&bufferRec[0], 0, sizeof(bufferRec)); while(1) { led01 = 0; wait(0.1); led01 = 1; wait(0.1); valeurPressionPascal = mesureDePression(); //mesure cyclique de pression } }