IHS1.1-STM32F303K8

Dependents:   Nucleo_IHS11a

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?

UserRevisionLine numberNew 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 }