IHS1.1-STM32F303K8
Sensor.cpp@1:ace656587248, 2020-10-23 (annotated)
- Committer:
- maro
- Date:
- Fri Oct 23 06:36:45 2020 +0000
- Revision:
- 1:ace656587248
- Parent:
- 0:cf6cdf2e5565
Blinking indicator added
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
maro | 0:cf6cdf2e5565 | 1 | #include "Sensor.h" |
maro | 0:cf6cdf2e5565 | 2 | #include "CLED.h" |
maro | 0:cf6cdf2e5565 | 3 | #include "mbed.h" |
maro | 0:cf6cdf2e5565 | 4 | // ************************* Object ******************************** |
maro | 0:cf6cdf2e5565 | 5 | Timer t; |
maro | 0:cf6cdf2e5565 | 6 | extern CLED cled; |
maro | 0:cf6cdf2e5565 | 7 | // *************************** SPI ******************************** |
maro | 0:cf6cdf2e5565 | 8 | SPI spi(D11, D12, D13); // mosi, miso, sclk |
maro | 0:cf6cdf2e5565 | 9 | Serial uart(USBTX, USBRX); |
maro | 0:cf6cdf2e5565 | 10 | // *************************** GPIO ******************************** |
maro | 0:cf6cdf2e5565 | 11 | #ifdef EVERY |
maro | 0:cf6cdf2e5565 | 12 | DigitalOut ss(D8); // *** D8 *** |
maro | 0:cf6cdf2e5565 | 13 | DigitalOut oe_cled(D10); // 13:OE_CLED *** D10 *** |
maro | 0:cf6cdf2e5565 | 14 | DigitalIn oe_cled_in(D10); // 13:OE_CLED *** D10 *** |
maro | 0:cf6cdf2e5565 | 15 | #else |
maro | 0:cf6cdf2e5565 | 16 | DigitalOut ss(D10); // *** D8 *** |
maro | 0:cf6cdf2e5565 | 17 | DigitalOut oe_cled(D8); // 13:OE_CLED *** D10 *** |
maro | 0:cf6cdf2e5565 | 18 | DigitalIn oe_cled_in(D8); // 13:OE_CLED *** D10 *** |
maro | 0:cf6cdf2e5565 | 19 | #endif |
maro | 0:cf6cdf2e5565 | 20 | |
maro | 0:cf6cdf2e5565 | 21 | DigitalOut abc[3] = {DigitalOut(D2),DigitalOut(D3),DigitalOut(D4)};// column |
maro | 0:cf6cdf2e5565 | 22 | DigitalOut xyz[4] = {DigitalOut(A0),DigitalOut(A1),DigitalOut(A3),DigitalOut(A6)};// row |
maro | 0:cf6cdf2e5565 | 23 | /*ss: pin 10 6:SS |
maro | 0:cf6cdf2e5565 | 24 | MOSI: pin 13 7:MOSI |
maro | 0:cf6cdf2e5565 | 25 | MISO: pin 12 8:MISO |
maro | 0:cf6cdf2e5565 | 26 | SCK: pin 11 9:CLK */ |
maro | 0:cf6cdf2e5565 | 27 | DigitalOut sel_sen(D5); // 10:power off while LED on |
maro | 0:cf6cdf2e5565 | 28 | DigitalOut oe_iled(D6); // 11:OE_ILED |
maro | 0:cf6cdf2e5565 | 29 | DigitalOut fix_cled(D7); // 12:FIX_CLED |
maro | 0:cf6cdf2e5565 | 30 | PwmOut pwm_cled(D9); // 14:PWM_CLED |
maro | 0:cf6cdf2e5565 | 31 | // ********************** global function ******************************* |
maro | 0:cf6cdf2e5565 | 32 | void out3bit(DigitalOut ary[], int val) { |
maro | 0:cf6cdf2e5565 | 33 | int size = 3; |
maro | 0:cf6cdf2e5565 | 34 | if ((ROW_LEN == 16) && (ary == xyz)) size = 4;//(ROW_LEN == 16) && |
maro | 0:cf6cdf2e5565 | 35 | for (int i=0; i < size; i++) |
maro | 0:cf6cdf2e5565 | 36 | ary[i] = (val >> i) & 0x01; |
maro | 0:cf6cdf2e5565 | 37 | } |
maro | 0:cf6cdf2e5565 | 38 | |
maro | 0:cf6cdf2e5565 | 39 | int noMinus(int n) { |
maro | 0:cf6cdf2e5565 | 40 | if (n < 0) return 0; |
maro | 0:cf6cdf2e5565 | 41 | return n; |
maro | 0:cf6cdf2e5565 | 42 | } |
maro | 0:cf6cdf2e5565 | 43 | |
maro | 0:cf6cdf2e5565 | 44 | // ********************************************************************** |
maro | 0:cf6cdf2e5565 | 45 | int Sensor::cri[CRI_LEN] = {90,135,195,275,390,535,720,990,1300,1750,2200,2800}; |
maro | 0:cf6cdf2e5565 | 46 | int Sensor::adAryInit[ROW_LEN][COL_LEN]; |
maro | 0:cf6cdf2e5565 | 47 | Sensor::Sensor(int correction) { |
maro | 0:cf6cdf2e5565 | 48 | for (int i = 0; i < CRI_LEN; i++) { |
maro | 0:cf6cdf2e5565 | 49 | cri[i] += correction; |
maro | 0:cf6cdf2e5565 | 50 | } |
maro | 0:cf6cdf2e5565 | 51 | spi.format(8,0); |
maro | 0:cf6cdf2e5565 | 52 | spi.frequency(2000000); |
maro | 0:cf6cdf2e5565 | 53 | uart.baud(9600); |
maro | 0:cf6cdf2e5565 | 54 | } |
maro | 0:cf6cdf2e5565 | 55 | |
maro | 0:cf6cdf2e5565 | 56 | void Sensor::setAd(bool bAdd) { // bAdd:add val to adAryInit[][] |
maro | 0:cf6cdf2e5565 | 57 | for (int row = 0; row < ROW_LEN; row++) { |
maro | 0:cf6cdf2e5565 | 58 | out3bit(xyz, row); |
maro | 0:cf6cdf2e5565 | 59 | for (int col = 0; col < COL_LEN; col++) { |
maro | 0:cf6cdf2e5565 | 60 | setCol(row, col, bAdd); |
maro | 0:cf6cdf2e5565 | 61 | } |
maro | 0:cf6cdf2e5565 | 62 | if (!bAdd) // set CLED |
maro | 1:ace656587248 | 63 | cled.set(val12, row == ROW_LEN - 1);// sensor-data, indicator |
maro | 0:cf6cdf2e5565 | 64 | } |
maro | 0:cf6cdf2e5565 | 65 | } |
maro | 0:cf6cdf2e5565 | 66 | |
maro | 0:cf6cdf2e5565 | 67 | int Sensor::getColVal(int c) { |
maro | 0:cf6cdf2e5565 | 68 | return val12[c]; |
maro | 0:cf6cdf2e5565 | 69 | } |
maro | 0:cf6cdf2e5565 | 70 | int Sensor::getColAd(int c) { |
maro | 0:cf6cdf2e5565 | 71 | return adAry[c]; |
maro | 0:cf6cdf2e5565 | 72 | } |
maro | 0:cf6cdf2e5565 | 73 | |
maro | 0:cf6cdf2e5565 | 74 | void Sensor::pCri() { // print criteria |
maro | 0:cf6cdf2e5565 | 75 | char tStr[32]; // temporary string |
maro | 0:cf6cdf2e5565 | 76 | for (int i = 0; i < CRI_LEN; i++) { |
maro | 0:cf6cdf2e5565 | 77 | sprintf(tStr, "\rcri:%d, val:%d:b", i, cri[i]); |
maro | 0:cf6cdf2e5565 | 78 | uart.printf("%s",tStr); |
maro | 0:cf6cdf2e5565 | 79 | } |
maro | 0:cf6cdf2e5565 | 80 | uart.printf("\r"); // CRLF |
maro | 0:cf6cdf2e5565 | 81 | } |
maro | 0:cf6cdf2e5565 | 82 | |
maro | 0:cf6cdf2e5565 | 83 | void Sensor::set_adAryInit() { |
maro | 0:cf6cdf2e5565 | 84 | const int INIT_MS = 1200; |
maro | 0:cf6cdf2e5565 | 85 | pwm_cled.period(4e-3); // PWM-period:4mS |
maro | 0:cf6cdf2e5565 | 86 | pwm_cled.write(0.1); // duty 25% (measured value) |
maro | 0:cf6cdf2e5565 | 87 | int cnt = 0; |
maro | 0:cf6cdf2e5565 | 88 | // ***************** set adAryInit[][] value ****************** |
maro | 0:cf6cdf2e5565 | 89 | t.start(); |
maro | 0:cf6cdf2e5565 | 90 | while (t.read_ms() < INIT_MS) { |
maro | 0:cf6cdf2e5565 | 91 | setAd(true); |
maro | 0:cf6cdf2e5565 | 92 | cnt++; |
maro | 0:cf6cdf2e5565 | 93 | } |
maro | 0:cf6cdf2e5565 | 94 | t.stop(); |
maro | 0:cf6cdf2e5565 | 95 | t.reset(); |
maro | 0:cf6cdf2e5565 | 96 | for (int row = 0; row < ROW_LEN; row++) { |
maro | 0:cf6cdf2e5565 | 97 | for (int col = 0; col < COL_LEN; col++) { |
maro | 0:cf6cdf2e5565 | 98 | adAryInit[row][col] = adAryInit[row][col] / cnt; |
maro | 0:cf6cdf2e5565 | 99 | } |
maro | 0:cf6cdf2e5565 | 100 | } |
maro | 0:cf6cdf2e5565 | 101 | if (ROW_LEN == 1) t.start(); // for ILED interval > 150uS : 1.2mS / 8 |
maro | 0:cf6cdf2e5565 | 102 | } |
maro | 0:cf6cdf2e5565 | 103 | |
maro | 0:cf6cdf2e5565 | 104 | unsigned int Sensor::getAdc(int col) { |
maro | 0:cf6cdf2e5565 | 105 | ss = 0; //digitalWrite(ss, LOW); |
maro | 0:cf6cdf2e5565 | 106 | spi.write(6 | (col >> 2));// |
maro | 0:cf6cdf2e5565 | 107 | unsigned char r1 = spi.write(col << 6); |
maro | 0:cf6cdf2e5565 | 108 | unsigned char r2 = spi.write(0); |
maro | 0:cf6cdf2e5565 | 109 | ss = 1; //digitalWrite(ss, HIGH); |
maro | 0:cf6cdf2e5565 | 110 | return ((r1 & 0x0f) << 8) + r2; |
maro | 0:cf6cdf2e5565 | 111 | } |
maro | 0:cf6cdf2e5565 | 112 | |
maro | 0:cf6cdf2e5565 | 113 | void Sensor::setCol(int row, int col, bool bAdd) { |
maro | 0:cf6cdf2e5565 | 114 | if ((ROW_LEN == 1) && !bAdd) set_ILED_cycle_1200uS(t, 119); // 119:actual survay 150uS |
maro | 0:cf6cdf2e5565 | 115 | bool ledSta = oe_cled_in; |
maro | 0:cf6cdf2e5565 | 116 | oe_cled = 0; //digitalWrite(oe_cled, LOW); |
maro | 0:cf6cdf2e5565 | 117 | wait_us(50); |
maro | 0:cf6cdf2e5565 | 118 | out3bit(abc, col); |
maro | 0:cf6cdf2e5565 | 119 | sel_sen = 1; //digitalWrite(sel_sen, HIGH); |
maro | 0:cf6cdf2e5565 | 120 | oe_iled = 0; //digitalWrite(oe_iled, LOW); // ILED-OFF |
maro | 0:cf6cdf2e5565 | 121 | int vOff = getAdc(col); |
maro | 0:cf6cdf2e5565 | 122 | oe_iled = 1; //digitalWrite(oe_iled, HIGH); // ILED-ON |
maro | 0:cf6cdf2e5565 | 123 | int vOn = getAdc(col); |
maro | 0:cf6cdf2e5565 | 124 | sel_sen = 0; //digitalWrite(sel_sen, LOW); |
maro | 0:cf6cdf2e5565 | 125 | oe_iled = 0; //digitalWrite(oe_iled, LOW); // ILED-OFF |
maro | 0:cf6cdf2e5565 | 126 | oe_cled = ledSta; //digitalWrite(oe_cled, ledSta); |
maro | 0:cf6cdf2e5565 | 127 | if (bAdd) |
maro | 0:cf6cdf2e5565 | 128 | adAryInit[row][col] += vOn - vOff - (vOff >> 2) + (vOn >> 4); |
maro | 0:cf6cdf2e5565 | 129 | else |
maro | 0:cf6cdf2e5565 | 130 | adAry[col] = noMinus(vOn - vOff - (vOff >> 2) + (vOn >> 4) - adAryInit[row][col]); |
maro | 0:cf6cdf2e5565 | 131 | val12[col] = ad2val(adAry[col]); |
maro | 0:cf6cdf2e5565 | 132 | } |
maro | 0:cf6cdf2e5565 | 133 | |
maro | 0:cf6cdf2e5565 | 134 | void Sensor::set_ILED_cycle_1200uS(Timer& t0, const int COL_US) { // COL_US:col interval:150us, cycle:1.2mS |
maro | 0:cf6cdf2e5565 | 135 | int us = t.read_us(); |
maro | 0:cf6cdf2e5565 | 136 | while (us < COL_US) { |
maro | 0:cf6cdf2e5565 | 137 | us = t.read_us(); |
maro | 0:cf6cdf2e5565 | 138 | } |
maro | 0:cf6cdf2e5565 | 139 | t.stop(); |
maro | 0:cf6cdf2e5565 | 140 | t.reset(); |
maro | 0:cf6cdf2e5565 | 141 | t.start(); |
maro | 0:cf6cdf2e5565 | 142 | } |
maro | 0:cf6cdf2e5565 | 143 | |
maro | 0:cf6cdf2e5565 | 144 | int Sensor::ad2val(int ad) { // div6 true:1~6 false:1~12 |
maro | 0:cf6cdf2e5565 | 145 | for (int i = 0; i < CRI_LEN; i++) |
maro | 0:cf6cdf2e5565 | 146 | if (ad < cri[i]) return i; |
maro | 0:cf6cdf2e5565 | 147 | return CRI_LEN; |
maro | 0:cf6cdf2e5565 | 148 | } |