MCP3204をSTM303K8T6で同時に6個使ってみた
Dependencies: mbed 24LC1025 MCP3204
main.cpp
- Committer:
- sashida_h
- Date:
- 2020-09-17
- Revision:
- 4:56d1f3a81b30
- Parent:
- 3:99c659d89698
- Child:
- 5:7d768f3acdd8
File content as of revision 4:56d1f3a81b30:
#include "mbed.h" #include "MCP3204.h" #include "24LC1025.h" Serial pc(PA_2, PA_3, 115200); //pin19,20 TX,RX CAN can(PA_11, PA_12); //pin21,22 rd,td SPI spi(PA_7, PA_6, PA_5); MCP3204 mcp1(spi,PB_0); //下z- MCP3204 mcp2(spi,PB_1); //右x+ MCP3204 mcp3(spi,PB_3); //左x- MCP3204 mcp4(spi,PA_8); // 前y+ MCP3204 mcp5(spi,PA_10); //上z+ MCP3204 mcp6(spi,PF_0); //後y- LC1025 eeprom = LC1025(PB_7, PB_6); DigitalOut led(PB_5); CANMessage msg; #define T 0.03 float cal_x=0,cal_y=0,cal_z=0; int i,j,cnt=0,page_frg=0; float world_time; uint16_t eeprom_cnt = 0x0000; char serialData[4]; union Float2Byte{ float _float; char _byte[4]; }; typedef union Float2Byte Float2Byte; union Int2Byte{ unsigned short _int; char _byte[2]; }; typedef union Int2Byte Int2Byte; void send(float senddata,int id){ //pc.printf("Master send()\n\r"); Float2Byte sendFloat; sendFloat._float = senddata; //ここに送りたい値を入れる. char serialData[4]; for(int i=0;i<4;++i){ serialData[i] = sendFloat._byte[i]; //pc.printf("send_char: %d\n\r", serialData[i]); } //pc.printf("sendFloat: %f\n\r", sendFloat._float); if(can.write(CANMessage(id, serialData, 4))){ //pc.printf("Send.\n\r"); } } void send2(unsigned short senddata1,unsigned short senddata2,unsigned short senddata3,int id){ //pc.printf("Master send()\n\r"); /*ID: 0x01*/ Int2Byte sendInt; sendInt._int = senddata1; //ここに送りたい値を入れる. char serialData[6]; serialData[0] = sendInt._byte[0]; serialData[1] = sendInt._byte[1]; //pc.printf("send_char: %d\n\r", serialData[i]); sendInt._int = senddata2; serialData[2] = sendInt._byte[0]; serialData[3] = sendInt._byte[1]; sendInt._int = senddata3; serialData[4] = sendInt._byte[0]; serialData[5] = sendInt._byte[1]; //pc.printf("sendFloat: %f\n\r", sendFloat._float); if(can.write(CANMessage(id, serialData, 6))){ //pc.printf("Send.\n\r"); } } void receive(){ Float2Byte getFloat; Int2Byte getInt; led = 0; if(can.read(msg)){ //ID: 0x01 if(msg.id == 0x01){ //pc.printf("ID: 0x01\n\r"); for(int i=0;i<4;++i){ getFloat._byte[i] = msg.data[i]; //pc.printf("get_char: %d\n\r", getFloat._byte[i]); } world_time = getFloat._float; pc.printf("world_time:%.2f\r\n", world_time); } if(msg.id == 0x02){ //pc.printf("ID: 0x02\n\r"); getInt._byte[0] = msg.data[0]; getInt._byte[1] = msg.data[1]; cal_x=(float)getInt._int /10.0f; pc.printf("Mag:%.2f", cal_x); getInt._byte[0] = msg.data[2]; getInt._byte[1] = msg.data[3]; cal_y=(float)getInt._int /10.0f; pc.printf(",%.2f", cal_y); getInt._byte[0] = msg.data[4]; getInt._byte[1] = msg.data[5]; cal_z=(float)getInt._int /10.0f; pc.printf(",%.2f\r\n", cal_z); if(page_frg == 0){ pc.printf("s:%d,0x%x\r\n",page_frg,eeprom_cnt); *(float*)serialData=0.0f; eeprom.PageWrite(ADDRESS_24LC1025_BLOCK0,eeprom_cnt,serialData,4); eeprom_cnt = 0x04 + eeprom_cnt; wait(0.01); pc.printf("s:%d,0x%x\r\n",page_frg,eeprom_cnt); *(float*)serialData=cal_x; eeprom.PageWrite(ADDRESS_24LC1025_BLOCK0,eeprom_cnt,serialData,4); wait(0.01); eeprom_cnt = 0x04 + eeprom_cnt; pc.printf("s:%d,0x%x\r\n",page_frg,eeprom_cnt); *(float*)serialData=cal_y; eeprom.PageWrite(ADDRESS_24LC1025_BLOCK0,eeprom_cnt,serialData,4); wait(0.01); eeprom_cnt = 0x04 + eeprom_cnt; pc.printf("s:%d,0x%x\r\n",page_frg,eeprom_cnt); *(float*)serialData=cal_z; eeprom.PageWrite(ADDRESS_24LC1025_BLOCK0,eeprom_cnt,serialData,4); wait(0.01); eeprom_cnt = 0x04 + eeprom_cnt; pc.printf("s:%d,0x%x\r\n",page_frg,eeprom_cnt); *(float*)serialData=world_time; eeprom.PageWrite(ADDRESS_24LC1025_BLOCK0,eeprom_cnt,serialData,4); wait(0.01); eeprom_cnt = 0x04 + eeprom_cnt; pc.printf("s:%d,0x%x\r\n",page_frg,eeprom_cnt); *(float*)serialData=0.0f; eeprom.PageWrite(ADDRESS_24LC1025_BLOCK0,eeprom_cnt,serialData,4); wait(0.01); eeprom_cnt = 0x04 + eeprom_cnt; pc.printf("e:%d,0x%x\r\n",page_frg,eeprom_cnt); }else if(page_frg == 1){ *(float*)serialData=0.0f; pc.printf("%d,0x%x\r\n",page_frg,eeprom_cnt); eeprom.PageWrite(ADDRESS_24LC1025_BLOCK1,eeprom_cnt,serialData,4); wait(0.01); eeprom_cnt = 0x04 + eeprom_cnt; *(float*)serialData=cal_x; eeprom.PageWrite(ADDRESS_24LC1025_BLOCK1,eeprom_cnt,serialData,4); wait(0.01); eeprom_cnt = 0x04 + eeprom_cnt; *(float*)serialData=cal_y; eeprom.PageWrite(ADDRESS_24LC1025_BLOCK1,eeprom_cnt,serialData,4); wait(0.01); eeprom_cnt = 0x04 + eeprom_cnt; *(float*)serialData=cal_z; eeprom.PageWrite(ADDRESS_24LC1025_BLOCK1,eeprom_cnt,serialData,4); wait(0.01); eeprom_cnt = 0x04 + eeprom_cnt; *(float*)serialData=world_time; eeprom.PageWrite(ADDRESS_24LC1025_BLOCK1,eeprom_cnt,serialData,4); wait(0.01); eeprom_cnt = 0x04 + eeprom_cnt; *(float*)serialData=0.0f; eeprom.PageWrite(ADDRESS_24LC1025_BLOCK1,eeprom_cnt,serialData,4); eeprom_cnt = 0x04 + eeprom_cnt; wait(0.01); }else{ pc.printf("EEPROM_ERROR!! You should erase memory\r\n"); } } if(msg.id == 0x03){ //pc.printf("ID: 0x01\n\r"); for(int i=0;i<4;++i){ getFloat._byte[i] = msg.data[i]; //pc.printf("get_char: %d\n\r", getFloat._byte[i]); } pc.printf("ID0x03:%.2f\r\n", getFloat._float); } if(msg.id == 0x04){ //pc.printf("ID: 0x01\n\r"); for(int i=0;i<4;++i){ getFloat._byte[i] = msg.data[i]; //pc.printf("get_char: %d\n\r", getFloat._byte[i]); } pc.printf("ID0x04:%.2f\r\n", getFloat._float); } } led=1; } int main(){ int adc1[4],adc2[4],adc3[4],adc4[4],adc5[4],adc6[4]; float ave[6],buff; can.attach(receive, CAN::RxIrq); pc.printf("Hello world%d\r\n",sizeof(i)); led = 1; wait(1.0); *(float*)serialData=0.0f; for(i=0;i<6;i++){ eeprom.PageWrite(ADDRESS_24LC1025_BLOCK0,eeprom_cnt,serialData,4); eeprom_cnt = 0x04 + eeprom_cnt; wait(0.1); } while(1){ adc1[0] = mcp1.sgl( CH0 ); adc1[1] = mcp1.sgl( CH1 ); adc1[2] = mcp1.sgl( CH2 ); adc1[3] = mcp1.sgl( CH3 ); for(i=0;i<4-1;i++){ for(j=1;j<4-i;j++){ if(adc1[j-1] > adc1[j]){ buff = adc1[j-1]; adc1[j-1] = adc1[j]; adc1[j] = buff; } } } //pc.printf("%d,%d,%d,%d\r\n",adc1[0],adc1[1],adc1[2],adc1[3]); ave[0] = (adc1[1] + adc1[2])/2.0 + 120.0; adc2[0] = mcp2.sgl( CH0 ); adc2[1] = mcp2.sgl( CH1 ); adc2[2] = mcp2.sgl( CH2 ); adc2[3] = mcp2.sgl( CH3 ); for(i=0;i<4-1;i++){ for(j=1;j<4-i;j++){ if(adc2[j-1] > adc2[j]){ buff = adc2[j-1]; adc2[j-1] = adc2[j]; adc2[j] = buff; } } } //pc.printf("%d,%d,%d,%d\r\n",adc1[0],adc1[1],adc1[2],adc1[3]); ave[1] = (adc2[1] + adc2[2])/2.0; adc3[0] = mcp3.sgl( CH0 ); adc3[1] = mcp3.sgl( CH1 ); adc3[2] = mcp3.sgl( CH2 ); adc3[3] = mcp3.sgl( CH3 ); for(i=0;i<4-1;i++){ for(j=1;j<4-i;j++){ if(adc3[j-1] > adc3[j]){ buff = adc3[j-1]; adc3[j-1] = adc3[j]; adc3[j] = buff; } } } //pc.printf("%d,%d,%d,%d\r\n",adc1[0],adc1[1],adc1[2],adc1[3]); ave[2] = (adc3[1] + adc3[2])/2.0 + 70.0; adc4[0] = mcp4.sgl( CH0 ); adc4[1] = mcp4.sgl( CH1 ); adc4[2] = mcp4.sgl( CH2 ); adc4[3] = mcp4.sgl( CH3 ); for(i=0;i<4-1;i++){ for(j=1;j<4-i;j++){ if(adc4[j-1] > adc4[j]){ buff = adc4[j-1]; adc4[j-1] = adc4[j]; adc4[j] = buff; } } } //pc.printf("%d,%d,%d,%d\r\n",adc1[0],adc1[1],adc1[2],adc1[3]); ave[3] = (adc4[1] + adc4[2])/2.0 + 55.0; adc5[0] = mcp5.sgl( CH0 ); adc5[1] = mcp5.sgl( CH1 ); adc5[2] = mcp5.sgl( CH2 ); adc5[3] = mcp5.sgl( CH3 ); for(i=0;i<4-1;i++){ for(j=1;j<4-i;j++){ if(adc5[j-1] > adc5[j]){ buff = adc5[j-1]; adc5[j-1] = adc5[j]; adc5[j] = buff; } } } //pc.printf("%d,%d,%d,%d\r\n",adc1[0],adc1[1],adc1[2],adc1[3]); ave[4] = (adc5[1] + adc5[2])/2.0; adc6[0] = mcp6.sgl( CH0 ); adc6[1] = mcp6.sgl( CH1 ); adc6[2] = mcp6.sgl( CH2 ); adc6[3] = mcp6.sgl( CH3 ); for(i=0;i<4-1;i++){ for(j=1;j<4-i;j++){ if(adc6[j-1] > adc6[j]){ buff = adc6[j-1]; adc6[j-1] = adc6[j]; adc6[j] = buff; } } } //pc.printf("%d,%d,%d,%d\r\n",adc1[0],adc1[1],adc1[2],adc1[3]); ave[5] = (adc6[1] + adc6[2])/2.0 - 100.0; /* pc.printf("1"); for(i=0; i<4; i++){ //pc.printf("CH%d:%d\r\n",i,adc1[i]); pc.printf(",%d",adc1[i]); } pc.printf(",%.1f\r\n", ave1); pc.printf("2"); for(i=0; i<4; i++){ //pc.printf("CH%d:%d\r\n",i,adc1[i]); pc.printf(",%d",adc2[i]); } pc.printf(",%.1f\r\n", ave2); pc.printf("3"); for(i=0; i<4; i++){ //pc.printf("CH%d:%d\r\n",i,adc1[i]); pc.printf(",%d",adc3[i]); } pc.printf(",%.1f\r\n", ave3); pc.printf("4"); for(i=0; i<4; i++){ //pc.printf("CH%d:%d\r\n",i,adc1[i]); pc.printf(",%d",adc4[i]); } pc.printf(",%.1f\r\n", ave4); pc.printf("5"); for(i=0; i<4; i++){ //pc.printf("CH%d:%d\r\n",i,adc1[i]); pc.printf(",%d",adc5[i]); } pc.printf(",%.1f\r\n", ave5); pc.printf("6"); for(i=0; i<4; i++){ //pc.printf("CH%d:%d\r\n",i,adc1[i]); pc.printf(",%d",adc6[i]); } pc.printf(",%.1f\r\n", ave6); */ cnt = 0; if(ave[1] < ave[2] && ave[3] > ave[5] && ave[4] < ave[0]){ send2((unsigned short)(0.0f+cal_x),(unsigned short)(0.0f+cal_y),(unsigned short)(0.0f+cal_z),6); //else if(ave[1] < ave[2] && ave[3] < ave[5] && ave[4] < ave[0])pc.printf("x:90,y:0,z:0\r\n"); }else if(ave[1] < ave[2] && ave[3] < ave[5] && ave[4] > ave[0]){ send2((unsigned short)(180.0f+cal_x),(unsigned short)(0.0f+cal_y),(unsigned short)(0.0f+cal_z),6); //else if(ave[1] < ave[2] && ave[3] > ave[5] && ave[4] > ave[0])pc.printf("x:270,y:0,z:0\r\n"); }else if(ave[1] < ave[2] && ave[3] > ave[5] && ave[4] < ave[0]){ send2((unsigned short)(0.0f+cal_x),(unsigned short)(0.0f+cal_y),(unsigned short)(0.0f+cal_z),6); //else if(ave[1] < ave[2] && ave[3] < ave[5] && ave[4] < ave[0])pc.printf("x:0,y:0,z:90\r\n"); }else if(ave[1] > ave[2] && ave[3] < ave[5] && ave[4] < ave[0]){ send2((unsigned short)(0.0f+cal_x),(unsigned short)(0.0f+cal_y),(unsigned short)(180.0f+cal_z),6); //else if(ave[1] > ave[2] && ave[3] > ave[5] && ave[4] < ave[0])pc.printf("x:0,y:0,z:270\r\n"); }else if(ave[1] < ave[2] && ave[3] > ave[5] && ave[4] < ave[0]){ send2((unsigned short)(0.0f+cal_x),(unsigned short)(0.0f+cal_y),(unsigned short)(0.0f+cal_z),6); //else if(ave[1] < ave[2] && ave[3] > ave[5] && ave[4] > ave[0])pc.printf("x:0,y:90,z:0\r\n"); }else if(ave[1] > ave[2] && ave[3] > ave[5] && ave[4] > ave[0]){ send2((unsigned short)(0.0f+cal_x),(unsigned short)(180.0f+cal_y),(unsigned short)(0.0f+cal_z),6); //else if(ave[1] > ave[2] && ave[3] > ave[5] && ave[4] > ave[0])pc.printf("x:0,y:270,z:0\r\n"); }else{ pc.printf("none\r\n"); } //pc.printf("%d,%x,%.1f,%.1f,%.1f,%.1f,%.1f,%.1f\r\n",page_frg,eeprom_cnt,ave[1],ave[2],ave[3],ave[5],ave[4],ave[0]); for(i=0; i<6; i++){ *(float*)serialData = ave[i]; //pc.printf("%f,",ave[i]); if(eeprom_cnt > 0xFFF0){ page_frg++; eeprom_cnt = 0; } if(page_frg == 0){ eeprom.PageWrite(ADDRESS_24LC1025_BLOCK0,eeprom_cnt,serialData,4); pc.printf("%d,0x%x,%.1f\r\n",page_frg,eeprom_cnt,ave[i]); }else if(page_frg == 1){ eeprom.PageWrite(ADDRESS_24LC1025_BLOCK1,eeprom_cnt,serialData,4); //pc.printf("%d,0x%x\r\n",page_frg,eeprom_cnt); }else{ //pc.printf("EEPROM_ERROR!! You should erase memory\r\n"); } eeprom_cnt = 0x04 + eeprom_cnt; wait(0.01); } wait(0.1); } } /* int main(){ int adc[4]; int i; pc.printf("Hello world\r\n"); wait(1.0); while(1){ adc[0] = mcp.sgl( CH0 ); adc[1] = mcp.sgl( CH1 ); adc[2] = mcp.sgl( CH2 ); adc[3] = mcp.sgl( CH3 ); for(i=0; i<4; i++){ pc.printf("CH%d:%d\r\n",i,adc[i]); } wait(0.5); } } */