a
Embed:
(wiki syntax)
Show/hide line numbers
main.cpp
00001 //reference 00002 //https://docs.google.com/document/d/197dgqlNFhn72JrBeSYGtR4Y7DJQRUKC61oHVD9dvLNY/edit 00003 #include "mbed.h" 00004 SPI ADC(p11,p12,p13); 00005 DigitalOut cs[2] = {p14, p26}; 00006 Serial pc(USBTX, USBRX, 9600); 00007 #define START_BIT 0x04 00008 #define MODE_SINGLE 0x02 // Single-ended mode 00009 #define MODE_DIFF 0x00 // Differential mode 00010 uint16_t MCP3208_get(int channel, int adc_num); 00011 uint16_t HK_data[40]; 00012 int rcmd = 0,cmdflag = 0, hk_num = 0; 00013 uint16_t d; 00014 void commandget(); 00015 void initialize(); 00016 // for temp 00017 float R3 = 110; 00018 float R4 = 1000; 00019 float R5 = 68000; 00020 float Pt = 100; 00021 float R_1 = 3; 00022 float R_2 = 2; 00023 float I = 0.001; 00024 float Vreft = 2.5; 00025 float ce = 0.003851; 00026 float Rth, temp, volt; 00027 float Rse=0.02; 00028 float Gain=50; 00029 00030 float gal; 00031 00032 int main(void) 00033 { 00034 int bit = 8; 00035 float Vref = 5; 00036 ADC.format(bit,0); 00037 ADC.frequency(2000000); //VDD=5Vの場合は2MHz. 00038 pc.printf("\r\n"); 00039 pc.printf("Hello, eps. This is MCP3208 test code.\r\n"); 00040 pc.printf("if you wanna start, press *a*. \r\n"); 00041 // for temp calucuration 00042 float gain = -R5*I/R4; 00043 float off = Vreft+I*R3; 00044 00045 00046 while(1){ 00047 commandget(); 00048 if(cmdflag == 1){ 00049 if(rcmd == 'a'){ 00050 for(int adc_num = 0; adc_num < 2; adc_num++){ 00051 for(int i = 0; i < 3; i++){ 00052 HK_data[hk_num] = MCP3208_get(i, adc_num); 00053 pc.printf("ADC_num: %d, return = %d\n\r",adc_num, HK_data[hk_num]); 00054 hk_num++; 00055 } 00056 } 00057 //3.3V 00058 pc.printf("CH[0]: Volt = %.5f[V]\n\r", Vref * (float)HK_data[0] / 4096); 00059 //Temperature 00060 volt = Vref*(float)HK_data[1] / 4096*(R_1 + R_2)/R_1; 00061 Rth = (volt-off)/gain+R3; 00062 temp = (Rth-Pt)/(ce*Pt); 00063 pc.printf("CH[1]: Temp = %.5f[degree]\n\r", temp); 00064 //Galvanometer 00065 gal = Vref * (float)HK_data[2] / 4096/Gain/Rse; 00066 pc.printf("CH[2]: Galvanometer = %.5f[A]\n\r", gal); 00067 } 00068 } 00069 for(int j=0; j<hk_num; j++){ 00070 pc.printf("HK[%d]: %d\n\r", j, HK_data[j]); 00071 } 00072 initialize(); 00073 } 00074 00075 /* 00076 00077 for(int i = 0; i < 10; i++){ 00078 uint16_t d = MCP3208_get(1); 00079 HK_data[i] = d; 00080 pc.printf("return=%d volt=%.5f\n\r", d, Vref * (float)d / 4096); 00081 wait(1.0); 00082 } 00083 pc.printf("Sencing Finish\n\r"); 00084 pc.printf("Print HK_data\n\r"); 00085 00086 for(int i = 0; i < 10; i++){ 00087 pc.printf("HK_data[%d] = %d\n\r", i, HK_data[i]); 00088 } 00089 */ 00090 } 00091 00092 00093 uint16_t MCP3208_get(int channel, int adc_num){ 00094 cs[adc_num] = 0; 00095 pc.printf("Channel: %d, ", channel); 00096 int command_high = START_BIT | MODE_SINGLE | ((channel & 0x04) >> 2); 00097 int command_low = (channel & 0x03) << 6; 00098 ADC.write(command_high); 00099 int high_byte = ADC.write(command_low) & 0x0F; 00100 int low_byte = ADC.write(0x00); 00101 int conv_result = (high_byte << 8) | low_byte; 00102 cs[adc_num] = 1; 00103 return conv_result; 00104 } 00105 00106 00107 void commandget() 00108 { 00109 rcmd = pc.getc(); 00110 cmdflag = 1; 00111 pc.printf("get command: %d,%d\r\n",rcmd,cmdflag); 00112 } 00113 void initialize() 00114 { 00115 rcmd = 0; 00116 cmdflag = 0; 00117 hk_num = 0; 00118 }
Generated on Tue Nov 1 2022 05:06:55 by
1.7.2