This is the device firmware for the imagingBoard on the DIY 3D Printable Raspberry Pi Raman Spectrometer. For more details please visit: http://hackaday.io/project/1279

Dependencies:   mbed

Committer:
flatcat
Date:
Thu Sep 18 10:43:20 2014 +0000
Revision:
11:1851a9c7ce9c
Parent:
10:f16d2d5bd04d
Added serial configuration for sensitivity.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
flatcat 0:984447b91a04 1 #include "mbed.h"
flatcat 0:984447b91a04 2
flatcat 0:984447b91a04 3 // *** BE SURE TO TEST BEFORE AND AFTER FOR 'IDLING'... CLEAR THE CCD EVERY OTHER FRAME TO TRY AND ELIMINATE NOISE BUILDUP
flatcat 0:984447b91a04 4 //From http://www.ing.iac.es/~docs/ins/das/ins-das-29/integration.html
flatcat 0:984447b91a04 5 //"Idling" vs. integrating
flatcat 0:984447b91a04 6 //Charge from light leaks and thermal noise builds up on the detector between observations. If this charge is integrated by the detector, it may not be completely
flatcat 0:984447b91a04 7 //cleared away by the clear cycle of the next observation. In that case, the observation will be contaminated by extra counts. (Often, this appears as a ramp in the
flatcat 0:984447b91a04 8 //background leading up to a saturated region in the low-numbered rows.)
flatcat 0:984447b91a04 9 //To avoid this problem, the detector is made to clear itself continuously between observations. This is called "idling", and is reported as such on the mimic.
flatcat 0:984447b91a04 10
flatcat 1:a220fd937508 11 PwmOut masterClock(PB_4);
flatcat 0:984447b91a04 12 PwmOut shiftGate(PB_8);
flatcat 1:a220fd937508 13 InterruptIn shiftGate_int(PC_6);
flatcat 1:a220fd937508 14 DigitalOut ICG(PB_3);
flatcat 0:984447b91a04 15 AnalogIn imageIn(A0);
flatcat 1:a220fd937508 16 DigitalOut LED(LED1);
flatcat 10:f16d2d5bd04d 17 DigitalOut illuminator(PA_8);
flatcat 10:f16d2d5bd04d 18 DigitalOut blueLED(PB_5);
flatcat 10:f16d2d5bd04d 19 DigitalOut redLED(PB_10);
flatcat 0:984447b91a04 20 Serial raspi(USBTX, USBRX);
flatcat 0:984447b91a04 21
flatcat 10:f16d2d5bd04d 22 /*
flatcat 10:f16d2d5bd04d 23 int masterFreq_period = 20; //microseconds
flatcat 10:f16d2d5bd04d 24 int masterFreq_width = 10; //microseconds
flatcat 8:5fcd8a2149f0 25 int shiftGate_period = 66; //microseconds
flatcat 8:5fcd8a2149f0 26 int shiftGate_width = 33; //microseconds
flatcat 10:f16d2d5bd04d 27 */
flatcat 10:f16d2d5bd04d 28
flatcat 11:1851a9c7ce9c 29 float firmwareVersion = 0.2;
flatcat 11:1851a9c7ce9c 30
flatcat 11:1851a9c7ce9c 31
flatcat 10:f16d2d5bd04d 32 int masterFreq_period = 2; //microseconds
flatcat 10:f16d2d5bd04d 33 int masterFreq_width = 1; //microseconds
flatcat 10:f16d2d5bd04d 34 int shiftGate_period = 8; //microseconds
flatcat 10:f16d2d5bd04d 35 int shiftGate_width = 4; //microseconds
flatcat 1:a220fd937508 36
flatcat 3:83cb6eb61adf 37 int none = 0;
flatcat 11:1851a9c7ce9c 38 int veryLow = 10;
flatcat 1:a220fd937508 39 int low = 100;
flatcat 9:841663cf312c 40 int mediumLow = 1000;
flatcat 1:a220fd937508 41 int medium = 100000;
flatcat 10:f16d2d5bd04d 42 int high = 5000000;
flatcat 1:a220fd937508 43 int veryHigh = 10000000;
flatcat 1:a220fd937508 44
flatcat 2:7751080fb267 45 double imageData;
flatcat 11:1851a9c7ce9c 46 int sensitivity;
flatcat 1:a220fd937508 47 int pixelTotal = 3694;
flatcat 1:a220fd937508 48 int leadingDummyElements = 16;
flatcat 1:a220fd937508 49 int leadShieldedElements = 13;
flatcat 1:a220fd937508 50 int headerElements = 3;
flatcat 5:cbf08f942178 51 const int signalElements = 3648;
flatcat 1:a220fd937508 52 int trailingDummyElements = 14;
flatcat 1:a220fd937508 53 int pixelCount;
flatcat 1:a220fd937508 54 int readOutTrigger;
flatcat 1:a220fd937508 55 int state;
flatcat 1:a220fd937508 56
flatcat 1:a220fd937508 57 #define readOut_Begin 1
flatcat 1:a220fd937508 58 #define readOut_ACTIVE 2
flatcat 1:a220fd937508 59 #define readOut_LeadingDummy 3
flatcat 1:a220fd937508 60 #define readOut_LeadingShielded 4
flatcat 1:a220fd937508 61 #define readOut_headerElements 5
flatcat 1:a220fd937508 62 #define readOut_signalElements 6
flatcat 1:a220fd937508 63 #define readOut_trailingDummy 7
flatcat 1:a220fd937508 64 #define readOut_integrationTime 8
flatcat 1:a220fd937508 65 #define readOut_IDLE 9
flatcat 1:a220fd937508 66 #define readOut_Finish 0
flatcat 0:984447b91a04 67
flatcat 0:984447b91a04 68 #define MV(x) ((0xFFF*x)/3300)
flatcat 0:984447b91a04 69
flatcat 6:fe473ca8b625 70 double pixelValue[signalElements] = { 0 };
flatcat 1:a220fd937508 71
flatcat 1:a220fd937508 72 void error()
flatcat 1:a220fd937508 73 {
flatcat 1:a220fd937508 74 while(1) {
flatcat 1:a220fd937508 75 LED = !LED;
flatcat 1:a220fd937508 76 wait(0.5);
flatcat 1:a220fd937508 77 }
flatcat 1:a220fd937508 78 }
flatcat 1:a220fd937508 79
flatcat 1:a220fd937508 80 void checkState()
flatcat 1:a220fd937508 81 {
flatcat 1:a220fd937508 82 if (readOutTrigger == 1) {
flatcat 1:a220fd937508 83 // state = readOut_LeadingDummy;
flatcat 1:a220fd937508 84 }
flatcat 1:a220fd937508 85 switch (state) {
flatcat 1:a220fd937508 86 case readOut_Begin:
flatcat 10:f16d2d5bd04d 87 redLED = 1;
flatcat 10:f16d2d5bd04d 88 blueLED = 0;
flatcat 1:a220fd937508 89 readOutTrigger = 1;
flatcat 1:a220fd937508 90 state = readOut_ACTIVE;
flatcat 6:fe473ca8b625 91 // raspi.printf("+++\r\n");
flatcat 1:a220fd937508 92 LED = 1;
flatcat 1:a220fd937508 93 break;
flatcat 1:a220fd937508 94 case readOut_ACTIVE:
flatcat 1:a220fd937508 95 ICG = 1;
flatcat 1:a220fd937508 96 state = readOut_LeadingDummy;
flatcat 1:a220fd937508 97 break;
flatcat 1:a220fd937508 98 case readOut_LeadingDummy:
flatcat 1:a220fd937508 99 pixelCount++;
flatcat 10:f16d2d5bd04d 100 if (pixelCount == leadingDummyElements - 1) {
flatcat 1:a220fd937508 101 pixelCount = 0;
flatcat 1:a220fd937508 102 state = readOut_LeadingShielded;
flatcat 1:a220fd937508 103 }
flatcat 1:a220fd937508 104 break;
flatcat 1:a220fd937508 105 case readOut_LeadingShielded:
flatcat 1:a220fd937508 106 pixelCount++;
flatcat 10:f16d2d5bd04d 107 if (pixelCount == leadShieldedElements - 1) {
flatcat 1:a220fd937508 108 pixelCount = 0;
flatcat 1:a220fd937508 109 state = readOut_headerElements;
flatcat 1:a220fd937508 110 }
flatcat 1:a220fd937508 111 break;
flatcat 1:a220fd937508 112 case readOut_headerElements:
flatcat 1:a220fd937508 113 pixelCount++;
flatcat 10:f16d2d5bd04d 114 if (pixelCount == headerElements - 1) {
flatcat 1:a220fd937508 115 pixelCount = 0;
flatcat 1:a220fd937508 116 state = readOut_signalElements;
flatcat 1:a220fd937508 117 }
flatcat 1:a220fd937508 118 break;
flatcat 1:a220fd937508 119 case readOut_signalElements:
flatcat 1:a220fd937508 120 pixelCount++;
flatcat 6:fe473ca8b625 121 pixelValue[pixelCount] = imageIn.read_u16();
flatcat 6:fe473ca8b625 122 // raspi.printf("%i\t%4.12f\r\n", pixelCount,(imageIn.read_u16() * 5.0) / 4096.0);
flatcat 10:f16d2d5bd04d 123 if (pixelCount == signalElements - 1) {
flatcat 1:a220fd937508 124 pixelCount = 0;
flatcat 1:a220fd937508 125 state = readOut_trailingDummy;
flatcat 1:a220fd937508 126 }
flatcat 1:a220fd937508 127 break;
flatcat 1:a220fd937508 128 case readOut_trailingDummy:
flatcat 1:a220fd937508 129 pixelCount++;
flatcat 10:f16d2d5bd04d 130 if (pixelCount == trailingDummyElements - 1) {
flatcat 1:a220fd937508 131 pixelCount = 0;
flatcat 1:a220fd937508 132 state = readOut_integrationTime;
flatcat 2:7751080fb267 133 ICG = 0;
flatcat 1:a220fd937508 134 }
flatcat 1:a220fd937508 135 break;
flatcat 1:a220fd937508 136 case readOut_integrationTime:
flatcat 1:a220fd937508 137 wait_us(sensitivity);
flatcat 2:7751080fb267 138 state = readOut_Finish;
flatcat 6:fe473ca8b625 139 for (int pixelNumber=0; pixelNumber<signalElements; pixelNumber++) {
flatcat 10:f16d2d5bd04d 140 raspi.printf("%i\t%4.12f\r\n", pixelNumber, 5 - ((pixelValue[pixelNumber - 1] * 5) / 4096.0));
flatcat 6:fe473ca8b625 141 }
flatcat 6:fe473ca8b625 142 // raspi.printf("---\r\n");
flatcat 1:a220fd937508 143 break;
flatcat 1:a220fd937508 144 case readOut_Finish:
flatcat 10:f16d2d5bd04d 145 redLED = 0;
flatcat 1:a220fd937508 146 state = readOut_IDLE;
flatcat 2:7751080fb267 147 wait_us(sensitivity);
flatcat 1:a220fd937508 148 LED = 0;
flatcat 10:f16d2d5bd04d 149 illuminator = 0;
flatcat 1:a220fd937508 150 ICG = 1;
flatcat 1:a220fd937508 151 break;
flatcat 1:a220fd937508 152 case readOut_IDLE:
flatcat 1:a220fd937508 153 if (ICG == 1) {
flatcat 4:4eedf8292719 154 // ICG = 0;
flatcat 4:4eedf8292719 155 // state = readOut_Begin;
flatcat 10:f16d2d5bd04d 156 blueLED = 1;
flatcat 1:a220fd937508 157 }
flatcat 1:a220fd937508 158 break;
flatcat 1:a220fd937508 159 default:
flatcat 1:a220fd937508 160 break;
flatcat 1:a220fd937508 161 }
flatcat 1:a220fd937508 162 }
flatcat 1:a220fd937508 163
flatcat 11:1851a9c7ce9c 164 void printInfo(){
flatcat 11:1851a9c7ce9c 165 raspi.printf("meridianScientific\r\n");
flatcat 11:1851a9c7ce9c 166 raspi.printf("ramanPi - The DIY 3D Printable RaspberryPi Raman Spectrometer\r\n");
flatcat 11:1851a9c7ce9c 167 raspi.printf("Spectrometer imagingBoard\r\n");
flatcat 11:1851a9c7ce9c 168 raspi.printf("-------------------------------------------------------------\r\n");
flatcat 11:1851a9c7ce9c 169 raspi.printf("Firmware Version: %f\r\n",firmwareVersion);
flatcat 11:1851a9c7ce9c 170 raspi.printf("Current Sensitivity: %d\r\n", sensitivity);
flatcat 11:1851a9c7ce9c 171 }
flatcat 11:1851a9c7ce9c 172
flatcat 0:984447b91a04 173 int main()
flatcat 0:984447b91a04 174 {
flatcat 1:a220fd937508 175 ICG = 1;
flatcat 1:a220fd937508 176 LED = 0;
flatcat 10:f16d2d5bd04d 177 blueLED = 0;
flatcat 10:f16d2d5bd04d 178 redLED = 0;
flatcat 1:a220fd937508 179 pixelCount = 0;
flatcat 1:a220fd937508 180 readOutTrigger = 0;
flatcat 1:a220fd937508 181 state = readOut_IDLE;
flatcat 1:a220fd937508 182
flatcat 0:984447b91a04 183 masterClock.period_us(masterFreq_period);
flatcat 0:984447b91a04 184 masterClock.pulsewidth_us(masterFreq_width);
flatcat 0:984447b91a04 185
flatcat 0:984447b91a04 186 shiftGate.period_us(shiftGate_period);
flatcat 0:984447b91a04 187 shiftGate.pulsewidth_us(shiftGate_width);
flatcat 0:984447b91a04 188
flatcat 2:7751080fb267 189 raspi.baud(921600);
flatcat 1:a220fd937508 190 wait(0.5);
flatcat 1:a220fd937508 191
flatcat 1:a220fd937508 192 shiftGate_int.rise(checkState);
flatcat 1:a220fd937508 193
flatcat 0:984447b91a04 194 raspi.baud(921600);
flatcat 10:f16d2d5bd04d 195 blueLED = 0;
flatcat 11:1851a9c7ce9c 196 sensitivity = low;
flatcat 0:984447b91a04 197 while(1) {
flatcat 10:f16d2d5bd04d 198 if (state != readOut_IDLE) //reading is top priority
flatcat 10:f16d2d5bd04d 199 {
flatcat 10:f16d2d5bd04d 200 continue;
flatcat 10:f16d2d5bd04d 201 }
flatcat 4:4eedf8292719 202 char c = raspi.getc();
flatcat 6:fe473ca8b625 203 switch (c) {
flatcat 4:4eedf8292719 204 case 'r':
flatcat 10:f16d2d5bd04d 205 illuminator = 1;
flatcat 10:f16d2d5bd04d 206 wait(1);
flatcat 4:4eedf8292719 207 ICG = 0;
flatcat 4:4eedf8292719 208 state = readOut_Begin;
flatcat 4:4eedf8292719 209 break;
flatcat 11:1851a9c7ce9c 210 case 'l':
flatcat 11:1851a9c7ce9c 211 sensitivity = low;
flatcat 11:1851a9c7ce9c 212 break;
flatcat 11:1851a9c7ce9c 213 case 'v':
flatcat 11:1851a9c7ce9c 214 sensitivity = veryLow;
flatcat 11:1851a9c7ce9c 215 break;
flatcat 11:1851a9c7ce9c 216 case 'n':
flatcat 11:1851a9c7ce9c 217 sensitivity = mediumLow;
flatcat 11:1851a9c7ce9c 218 break;
flatcat 11:1851a9c7ce9c 219 case 'm':
flatcat 11:1851a9c7ce9c 220 sensitivity = medium;
flatcat 11:1851a9c7ce9c 221 break;
flatcat 11:1851a9c7ce9c 222 case 'h':
flatcat 11:1851a9c7ce9c 223 sensitivity = high;
flatcat 11:1851a9c7ce9c 224 break;
flatcat 11:1851a9c7ce9c 225 case 'c':
flatcat 11:1851a9c7ce9c 226 sensitivity = veryHigh;
flatcat 11:1851a9c7ce9c 227 break;
flatcat 11:1851a9c7ce9c 228 case 'i':
flatcat 11:1851a9c7ce9c 229 printInfo();
flatcat 11:1851a9c7ce9c 230 break;
flatcat 4:4eedf8292719 231 default:
flatcat 4:4eedf8292719 232 break;
flatcat 4:4eedf8292719 233 }
flatcat 0:984447b91a04 234 }
flatcat 0:984447b91a04 235 }