Keiju Nakano
/
mbed1114_BladeAmp_v0-2_2CH
センサ側
main.cpp@0:d8edf98c4892, 2015-05-09 (annotated)
- Committer:
- maxonK
- Date:
- Sat May 09 14:51:15 2015 +0000
- Revision:
- 0:d8edf98c4892
????
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
maxonK | 0:d8edf98c4892 | 1 | #include "mbed.h" |
maxonK | 0:d8edf98c4892 | 2 | |
maxonK | 0:d8edf98c4892 | 3 | DigitalOut myled(LED1); |
maxonK | 0:d8edf98c4892 | 4 | Serial uP(dp16, dp15); |
maxonK | 0:d8edf98c4892 | 5 | AnalogIn ainCH1(dp4); |
maxonK | 0:d8edf98c4892 | 6 | AnalogIn ainCH2(dp9); |
maxonK | 0:d8edf98c4892 | 7 | |
maxonK | 0:d8edf98c4892 | 8 | //cramp関数arduinoのconstrain相当プロトタイプ宣言 |
maxonK | 0:d8edf98c4892 | 9 | int cramp(int , int , int); |
maxonK | 0:d8edf98c4892 | 10 | //ADCサンプリング関数のプロトタイプ宣言 |
maxonK | 0:d8edf98c4892 | 11 | int adcSampling(int,int); |
maxonK | 0:d8edf98c4892 | 12 | //バブルソート関数宣言 |
maxonK | 0:d8edf98c4892 | 13 | void bubbleSort(int *, int); |
maxonK | 0:d8edf98c4892 | 14 | //ADCサンプリング数 |
maxonK | 0:d8edf98c4892 | 15 | const int numData = 5; |
maxonK | 0:d8edf98c4892 | 16 | //抜重センサ出力値(オフセット補正用) |
maxonK | 0:d8edf98c4892 | 17 | const int offsetValCH1 = 511;//(誤差なければ511) |
maxonK | 0:d8edf98c4892 | 18 | const int offsetValCH2 = 510;//(誤差なければ511) |
maxonK | 0:d8edf98c4892 | 19 | |
maxonK | 0:d8edf98c4892 | 20 | int main() { |
maxonK | 0:d8edf98c4892 | 21 | //setup |
maxonK | 0:d8edf98c4892 | 22 | //uP.baud(460800);//マイコン間通信時はコメント復帰 |
maxonK | 0:d8edf98c4892 | 23 | uP.baud(9600);//USBテスト時はコメント復帰(linuxは高速通信できない) |
maxonK | 0:d8edf98c4892 | 24 | myled = 1; |
maxonK | 0:d8edf98c4892 | 25 | int val = 0; |
maxonK | 0:d8edf98c4892 | 26 | //mainloop |
maxonK | 0:d8edf98c4892 | 27 | while(1) { |
maxonK | 0:d8edf98c4892 | 28 | //ADC値取得(抜重センサ出力値) |
maxonK | 0:d8edf98c4892 | 29 | val = adcSampling(offsetValCH1,offsetValCH2); |
maxonK | 0:d8edf98c4892 | 30 | |
maxonK | 0:d8edf98c4892 | 31 | //シリアルバッファが読み込み可能になるまでwhileまわす可能ならifはいる |
maxonK | 0:d8edf98c4892 | 32 | if(uP.readable()>0){ |
maxonK | 0:d8edf98c4892 | 33 | //もし自分宛てだったら返信する |
maxonK | 0:d8edf98c4892 | 34 | if(uP.getc() == 'C'){ |
maxonK | 0:d8edf98c4892 | 35 | val = cramp(val , 0 , 1023);//0~1023に制限 |
maxonK | 0:d8edf98c4892 | 36 | uP.printf("*%04d#",val);//返信 (*0#~*1023#) |
maxonK | 0:d8edf98c4892 | 37 | } |
maxonK | 0:d8edf98c4892 | 38 | |
maxonK | 0:d8edf98c4892 | 39 | } |
maxonK | 0:d8edf98c4892 | 40 | } |
maxonK | 0:d8edf98c4892 | 41 | } |
maxonK | 0:d8edf98c4892 | 42 | |
maxonK | 0:d8edf98c4892 | 43 | //ADCサンプリング平均値関数 |
maxonK | 0:d8edf98c4892 | 44 | //グローバルでnumDataが宣言してある必要あり(静的配列の宣言にnumData使うから) |
maxonK | 0:d8edf98c4892 | 45 | int adcSampling(int offsetValCH1,int offsetValCH2){ |
maxonK | 0:d8edf98c4892 | 46 | static int sampleArrayCH1 [numData] = {0};//時系列の生データ |
maxonK | 0:d8edf98c4892 | 47 | static int sampleArrayCH2 [numData] = {0};//時系列の生データ |
maxonK | 0:d8edf98c4892 | 48 | int sortArrayCH1 [numData] = {0};//ソート済みデータ |
maxonK | 0:d8edf98c4892 | 49 | int sortArrayCH2 [numData] = {0};//ソート済みデータ |
maxonK | 0:d8edf98c4892 | 50 | int centerVal = 511; //理想抜重時出力値 |
maxonK | 0:d8edf98c4892 | 51 | |
maxonK | 0:d8edf98c4892 | 52 | //時系列配列を前から、一つ後ろのに書き換えて送る |
maxonK | 0:d8edf98c4892 | 53 | //CH1 |
maxonK | 0:d8edf98c4892 | 54 | for(int i = 0;i <= numData - 1;i++){ |
maxonK | 0:d8edf98c4892 | 55 | //もし最後最後尾を変更する回ならADC値入れる |
maxonK | 0:d8edf98c4892 | 56 | if(i == numData -1){ |
maxonK | 0:d8edf98c4892 | 57 | sampleArrayCH1[i] = cramp (((ainCH1.read_u16()>>6)+(centerVal - offsetValCH1)),0,1023);//右へ6ビットシフト(16bitから10bitへ) |
maxonK | 0:d8edf98c4892 | 58 | break ; |
maxonK | 0:d8edf98c4892 | 59 | } |
maxonK | 0:d8edf98c4892 | 60 | //配列要素を前に一つ送る |
maxonK | 0:d8edf98c4892 | 61 | sampleArrayCH1[i] = sampleArrayCH1[i + 1]; |
maxonK | 0:d8edf98c4892 | 62 | } |
maxonK | 0:d8edf98c4892 | 63 | //CH2 |
maxonK | 0:d8edf98c4892 | 64 | for(int i = 0;i <= numData - 1;i++){ |
maxonK | 0:d8edf98c4892 | 65 | //もし最後最後尾を変更する回ならADC値入れる |
maxonK | 0:d8edf98c4892 | 66 | if(i == numData -1){ |
maxonK | 0:d8edf98c4892 | 67 | sampleArrayCH2[i] = cramp (((ainCH2.read_u16()>>6)+(centerVal - offsetValCH2)),0,1023);//右へ6ビットシフト(16bitから10bitへ) |
maxonK | 0:d8edf98c4892 | 68 | break ; |
maxonK | 0:d8edf98c4892 | 69 | } |
maxonK | 0:d8edf98c4892 | 70 | //配列要素を前に一つ送る |
maxonK | 0:d8edf98c4892 | 71 | sampleArrayCH2[i] = sampleArrayCH2[i + 1]; |
maxonK | 0:d8edf98c4892 | 72 | } |
maxonK | 0:d8edf98c4892 | 73 | |
maxonK | 0:d8edf98c4892 | 74 | //バブルソート |
maxonK | 0:d8edf98c4892 | 75 | //時系列配列をソート用配列にコピー |
maxonK | 0:d8edf98c4892 | 76 | //CH1 |
maxonK | 0:d8edf98c4892 | 77 | for(int i = 0; i < numData - 1; i++){ |
maxonK | 0:d8edf98c4892 | 78 | sortArrayCH1[i] = sampleArrayCH1[i]; |
maxonK | 0:d8edf98c4892 | 79 | } |
maxonK | 0:d8edf98c4892 | 80 | //CH2 |
maxonK | 0:d8edf98c4892 | 81 | for(int i = 0; i < numData - 1; i++){ |
maxonK | 0:d8edf98c4892 | 82 | sortArrayCH2[i] = sampleArrayCH2[i]; |
maxonK | 0:d8edf98c4892 | 83 | } |
maxonK | 0:d8edf98c4892 | 84 | |
maxonK | 0:d8edf98c4892 | 85 | //バブルソート関数呼び出し |
maxonK | 0:d8edf98c4892 | 86 | bubbleSort(sortArrayCH1,numData); |
maxonK | 0:d8edf98c4892 | 87 | bubbleSort(sortArrayCH2,numData); |
maxonK | 0:d8edf98c4892 | 88 | |
maxonK | 0:d8edf98c4892 | 89 | //上と下一つづつを省いたサンプルを平均して,CH1とCH2の差分を返す |
maxonK | 0:d8edf98c4892 | 90 | int sumVal = 0; |
maxonK | 0:d8edf98c4892 | 91 | int aveValCH1 = 0; |
maxonK | 0:d8edf98c4892 | 92 | int aveValCH2 = 0; |
maxonK | 0:d8edf98c4892 | 93 | //CH1 |
maxonK | 0:d8edf98c4892 | 94 | //合計 |
maxonK | 0:d8edf98c4892 | 95 | for(int i = 1;i <= numData - 2;i++){ |
maxonK | 0:d8edf98c4892 | 96 | sumVal = sumVal+sortArrayCH1[i]; |
maxonK | 0:d8edf98c4892 | 97 | } |
maxonK | 0:d8edf98c4892 | 98 | //平均 |
maxonK | 0:d8edf98c4892 | 99 | aveValCH1 = sumVal / (numData - 2); |
maxonK | 0:d8edf98c4892 | 100 | |
maxonK | 0:d8edf98c4892 | 101 | //CH2 |
maxonK | 0:d8edf98c4892 | 102 | //合計 |
maxonK | 0:d8edf98c4892 | 103 | sumVal = 0; |
maxonK | 0:d8edf98c4892 | 104 | for(int i = 1;i <= numData - 2;i++){ |
maxonK | 0:d8edf98c4892 | 105 | sumVal = sumVal+sortArrayCH2[i]; |
maxonK | 0:d8edf98c4892 | 106 | } |
maxonK | 0:d8edf98c4892 | 107 | //平均 |
maxonK | 0:d8edf98c4892 | 108 | aveValCH2 = sumVal / (numData - 2); |
maxonK | 0:d8edf98c4892 | 109 | |
maxonK | 0:d8edf98c4892 | 110 | //値返す |
maxonK | 0:d8edf98c4892 | 111 | return (cramp((((aveValCH1-aveValCH2)/2)+511),0,1023)) ; |
maxonK | 0:d8edf98c4892 | 112 | |
maxonK | 0:d8edf98c4892 | 113 | } |
maxonK | 0:d8edf98c4892 | 114 | |
maxonK | 0:d8edf98c4892 | 115 | |
maxonK | 0:d8edf98c4892 | 116 | |
maxonK | 0:d8edf98c4892 | 117 | //バブルソート(配列の名前(ポインタ),配列要素数) |
maxonK | 0:d8edf98c4892 | 118 | void bubbleSort(int *sortArray,int numData){ |
maxonK | 0:d8edf98c4892 | 119 | int temp = 0; |
maxonK | 0:d8edf98c4892 | 120 | //バブルソート本体 |
maxonK | 0:d8edf98c4892 | 121 | for (int i = 0; i < numData - 1; i++) { |
maxonK | 0:d8edf98c4892 | 122 | for (int j = numData - 1; j > i; j--) { |
maxonK | 0:d8edf98c4892 | 123 | if (sortArray[j - 1] > sortArray[j]) { //前の要素の方が大きかったら |
maxonK | 0:d8edf98c4892 | 124 | temp = sortArray[j]; // 交換する |
maxonK | 0:d8edf98c4892 | 125 | sortArray[j] = sortArray[j - 1]; |
maxonK | 0:d8edf98c4892 | 126 | sortArray[j - 1]= temp; |
maxonK | 0:d8edf98c4892 | 127 | } |
maxonK | 0:d8edf98c4892 | 128 | } |
maxonK | 0:d8edf98c4892 | 129 | } |
maxonK | 0:d8edf98c4892 | 130 | |
maxonK | 0:d8edf98c4892 | 131 | } |
maxonK | 0:d8edf98c4892 | 132 | |
maxonK | 0:d8edf98c4892 | 133 | |
maxonK | 0:d8edf98c4892 | 134 | //cramp関数 |
maxonK | 0:d8edf98c4892 | 135 | int cramp(int val , int min , int max){ |
maxonK | 0:d8edf98c4892 | 136 | if(val < min){ |
maxonK | 0:d8edf98c4892 | 137 | return min; |
maxonK | 0:d8edf98c4892 | 138 | } |
maxonK | 0:d8edf98c4892 | 139 | if(val > max){ |
maxonK | 0:d8edf98c4892 | 140 | return max; |
maxonK | 0:d8edf98c4892 | 141 | } |
maxonK | 0:d8edf98c4892 | 142 | |
maxonK | 0:d8edf98c4892 | 143 | return val; |
maxonK | 0:d8edf98c4892 | 144 | } |
maxonK | 0:d8edf98c4892 | 145 |