Hardware control: mirrors

Committer:
mbedalvaro
Date:
Wed Aug 01 03:01:45 2012 +0000
Revision:
0:3fe2fe307968
Child:
1:b1f5ed22087a
[mbed] converted /scoreLight_Advanced/hardwareIO

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbedalvaro 0:3fe2fe307968 1
mbedalvaro 0:3fe2fe307968 2 #ifndef hardwareIO_h
mbedalvaro 0:3fe2fe307968 3 #define hardwareIO_h
mbedalvaro 0:3fe2fe307968 4
mbedalvaro 0:3fe2fe307968 5 #include "mbed.h"
mbedalvaro 0:3fe2fe307968 6 #include "lockin.h"
mbedalvaro 0:3fe2fe307968 7
mbedalvaro 0:3fe2fe307968 8
mbedalvaro 0:3fe2fe307968 9 // potentiometer to change sensitivity by hand, or other things.
mbedalvaro 0:3fe2fe307968 10 #define POT_ANALOG_INPUT p15 // note: analog inputs in the mbed are from 15 to 20
mbedalvaro 0:3fe2fe307968 11
mbedalvaro 0:3fe2fe307968 12 // NOTE: the SPI library uses the following pins, but we don't have to set them and inputs or outputs (this is done when the library is initialized, which is done by pre-instantiation.
mbedalvaro 0:3fe2fe307968 13 #define SCK_PIN p7 //SPI Clock
mbedalvaro 0:3fe2fe307968 14 #define MISO_PIN p6 //SPI input (data comming from DAC, here not connected)
mbedalvaro 0:3fe2fe307968 15 #define MOSI_PIN p5 //SPI output (data going to DAC)
mbedalvaro 0:3fe2fe307968 16
mbedalvaro 0:3fe2fe307968 17 //**** CHIP SELECT pins for MP4922 DAC (mirrors and red laser)
mbedalvaro 0:3fe2fe307968 18 // VERY IMPORTANT: the chip select for the DACs should be different from the default SPI "SS" pin (Slave Select), which is 53 by default (and will be used by the Ethernet Shield).
mbedalvaro 0:3fe2fe307968 19 #define CS_DAC_MIRRORS p8 //Chip Select of the first DAC (mirrors)
mbedalvaro 0:3fe2fe307968 20
mbedalvaro 0:3fe2fe307968 21 //**** LASERS pins:
mbedalvaro 0:3fe2fe307968 22 #define LASER_RED_PIN p28 // NOT YET USED!! (NOTE: this is NOT the locking sensing laser (also called red, but could be infrared...)
mbedalvaro 0:3fe2fe307968 23 #define LASER_GREEN_PIN p29 // USED (TTL control)
mbedalvaro 0:3fe2fe307968 24 #define LASER_BLUE_PIN p30 // USED (TTL control)
mbedalvaro 0:3fe2fe307968 25
mbedalvaro 0:3fe2fe307968 26 //**** MIRRORS:
mbedalvaro 0:3fe2fe307968 27 //The DAC is 12 bytes capable (Max=4096), but we will limit this a little.
mbedalvaro 0:3fe2fe307968 28 #define MAX_AD_MIRRORS 3845 // note: 4095 is the absolute maximum for the SPI voltage (5V). This is for checking hardware compliance, but max and min angles can be defined for X and Y in each LivingSpot instance.
mbedalvaro 0:3fe2fe307968 29 #define MIN_AD_MIRRORS 250 // note: 0 is 0 volts for the SPI voltage.
mbedalvaro 0:3fe2fe307968 30 // We assume that the center of the mirror is at MAX_AD_MIRRORS/2 = 2000:
mbedalvaro 0:3fe2fe307968 31 #define CENTER_AD_MIRROR_X 2047 // This MUST BE the direction of the photodetector.
mbedalvaro 0:3fe2fe307968 32 #define CENTER_AD_MIRROR_Y 2047 // This MUST BE the direction of the photodetector.
mbedalvaro 0:3fe2fe307968 33
mbedalvaro 0:3fe2fe307968 34
mbedalvaro 0:3fe2fe307968 35 //**** Look-Up Table:
mbedalvaro 0:3fe2fe307968 36 #define uint16 unsigned short
mbedalvaro 0:3fe2fe307968 37 #define LUT_RESOLUTION 33 // resolution of the Look-Up Table (power of 2 +1)
mbedalvaro 0:3fe2fe307968 38 #define LUT_BITS_SHIFT 7 // bits shift from mirror DAC (12 bits) to LUT ( root_square(LUT_RESOLUTION - 1) )
mbedalvaro 0:3fe2fe307968 39 #define LUT_BITS_MASK 127 // bits mask to obtain the position remainder ( 2^LUT_BITS_SHIFT - 1 )
mbedalvaro 0:3fe2fe307968 40 // possible configurations:
mbedalvaro 0:3fe2fe307968 41 // LUT_RESOLUTION LUT_BITS_SHIFT LUT_BITS_MASK
mbedalvaro 0:3fe2fe307968 42 // 9 9 511
mbedalvaro 0:3fe2fe307968 43 // 17 8 255
mbedalvaro 0:3fe2fe307968 44 // 33 7 127
mbedalvaro 0:3fe2fe307968 45 // 65 6 63
mbedalvaro 0:3fe2fe307968 46 // ...
mbedalvaro 0:3fe2fe307968 47 #define NB_SCANS 8 // number of scans performed to generate the LUT table (actually, each site CUMULATES NB_SCANS values)
mbedalvaro 0:3fe2fe307968 48 // IMPORTANT: NB_SCANS*4095 should not exceed the capacity of uint16, this is 2^16-1=65535.
mbedalvaro 0:3fe2fe307968 49 // In other terms, NB_SCANS should be < 65535/4095=16
mbedalvaro 0:3fe2fe307968 50
mbedalvaro 0:3fe2fe307968 51 #define LUT_FILENAME "/local/LUT.txt"
mbedalvaro 0:3fe2fe307968 52
mbedalvaro 0:3fe2fe307968 53 // For checking (define if human readable file is required - note: it is not used by the program, just as output for human reading)
mbedalvaro 0:3fe2fe307968 54 #define LUT_H_FILENAME "/local/LUT_pos.txt"
mbedalvaro 0:3fe2fe307968 55
mbedalvaro 0:3fe2fe307968 56 // Current Look-up table approximation (only one at a time!):
mbedalvaro 0:3fe2fe307968 57 //#define LUT_BILINEAR
mbedalvaro 0:3fe2fe307968 58 //#define LUT_DIRECT
mbedalvaro 0:3fe2fe307968 59 //#define LUT_LINEAR
mbedalvaro 0:3fe2fe307968 60 #define NO_LUT
mbedalvaro 0:3fe2fe307968 61
mbedalvaro 0:3fe2fe307968 62 //Current method for lockin data acquisition and correction
mbedalvaro 0:3fe2fe307968 63 #define lockin_read() lockin.getMedianValue() // lockin.getSmoothValue(); //return the average of the value stored on the buffer
mbedalvaro 0:3fe2fe307968 64 // lockin.getLastValue(); //return the last conversion of the ADC
mbedalvaro 0:3fe2fe307968 65 // lockin.getMedianValue(); //return the median value of the buffer
mbedalvaro 0:3fe2fe307968 66
mbedalvaro 0:3fe2fe307968 67
mbedalvaro 0:3fe2fe307968 68 extern DigitalOut Laser_Red, Laser_Green, Laser_Blue;
mbedalvaro 0:3fe2fe307968 69
mbedalvaro 0:3fe2fe307968 70 // **** REFERENCE SIGNAL:
mbedalvaro 0:3fe2fe307968 71 /*
mbedalvaro 0:3fe2fe307968 72 #define testPin_OC1A 11 // this is, output compare pin OC1A //connected to CK2 = lockIn clock
mbedalvaro 0:3fe2fe307968 73 #define testPin_OC1B 12 // this is, output compare pin OC1B //connected to CK1 = laser clock
mbedalvaro 0:3fe2fe307968 74 #define testPin_OC1C 13
mbedalvaro 0:3fe2fe307968 75 */
mbedalvaro 0:3fe2fe307968 76
mbedalvaro 0:3fe2fe307968 77 // ==================================================================================================================================================================
mbedalvaro 0:3fe2fe307968 78
mbedalvaro 0:3fe2fe307968 79 class HardwareIO {
mbedalvaro 0:3fe2fe307968 80 public:
mbedalvaro 0:3fe2fe307968 81
mbedalvaro 0:3fe2fe307968 82
mbedalvaro 0:3fe2fe307968 83 void init(void);
mbedalvaro 0:3fe2fe307968 84
mbedalvaro 0:3fe2fe307968 85 //Lock-in acquisition methods:
mbedalvaro 0:3fe2fe307968 86 // float LockInRead_Volts();
mbedalvaro 0:3fe2fe307968 87 // int LockInRead_AD();
mbedalvaro 0:3fe2fe307968 88 // float LockInAD_to_Volts(int);
mbedalvaro 0:3fe2fe307968 89
mbedalvaro 0:3fe2fe307968 90 //Look-Up Table:
mbedalvaro 0:3fe2fe307968 91 unsigned short lut[LUT_RESOLUTION][LUT_RESOLUTION]; //Look-Up Table (uint16 is "unsigned short")
mbedalvaro 0:3fe2fe307968 92 void scanLUT(); //create and save the Look-Up Table
mbedalvaro 0:3fe2fe307968 93 void setLUT(); //set the Look-Up Table: either from scanning, or from the file LUT.TXT (if it is present)
mbedalvaro 0:3fe2fe307968 94 float lockInCorrectedValue(unsigned short x, unsigned short y); //return the lockin value corrected with the Look-UpTable (this is, a RATIO of reflectivities, and <1)
mbedalvaro 0:3fe2fe307968 95
mbedalvaro 0:3fe2fe307968 96 void scan_serial(unsigned short pointsPerLine = 400);
mbedalvaro 0:3fe2fe307968 97
mbedalvaro 0:3fe2fe307968 98 void showLimitsMirrors( int times );
mbedalvaro 0:3fe2fe307968 99
mbedalvaro 0:3fe2fe307968 100 // SPI control for DAC for mirrors and red laser power (low level):
mbedalvaro 0:3fe2fe307968 101 void writeOutX(unsigned short value);
mbedalvaro 0:3fe2fe307968 102 void writeOutY(unsigned short value);
mbedalvaro 0:3fe2fe307968 103
mbedalvaro 0:3fe2fe307968 104 // mirror degree-to-AD units conversion factors:
mbedalvaro 0:3fe2fe307968 105 //float AD_to_Deg_MIRROR_X;//=1.0*(MAX_DEG_MIRROR_X-MIN_DEG_MIRROR_X)/(MAX_AD_MIRRORS-MIN_AD_MIRRORS);
mbedalvaro 0:3fe2fe307968 106 //float AD_to_Deg_MIRROR_Y;//=1.0*(MAX_DEG_MIRROR_Y-MIN_DEG_MIRROR_Y)/(MAX_AD_MIRRORS-MIN_AD_MIRRORS);
mbedalvaro 0:3fe2fe307968 107
mbedalvaro 0:3fe2fe307968 108 /*
mbedalvaro 0:3fe2fe307968 109 // Mirror position:
mbedalvaro 0:3fe2fe307968 110 void setMirrorX_Deg(float _Az);
mbedalvaro 0:3fe2fe307968 111 void setMirrorY_Deg(float _El);
mbedalvaro 0:3fe2fe307968 112 void setMirrorX_AD(int _AzAD);
mbedalvaro 0:3fe2fe307968 113 void setMirrorY_AD(int _ElAD);
mbedalvaro 0:3fe2fe307968 114 void setMirrorsXY_AD(int _xAD, int _yAD);
mbedalvaro 0:3fe2fe307968 115 void setMirrorsCenter();
mbedalvaro 0:3fe2fe307968 116 void getAnglesFromAD(float &Az, float &El, int _xAD, int _yAD);
mbedalvaro 0:3fe2fe307968 117 //void setZoneDelimiters(...) // this could be here, instead on the LivingSpot class
mbedalvaro 0:3fe2fe307968 118 */
mbedalvaro 0:3fe2fe307968 119
mbedalvaro 0:3fe2fe307968 120
mbedalvaro 0:3fe2fe307968 121 //Laser Power, for the moment laser are TTL but we can use int:
mbedalvaro 0:3fe2fe307968 122 //if powerValue > 0 ==> 'true'; else 'false'
mbedalvaro 0:3fe2fe307968 123 // Red laser:
mbedalvaro 0:3fe2fe307968 124 void setRedPower(int powerRed);
mbedalvaro 0:3fe2fe307968 125 // Green laser:
mbedalvaro 0:3fe2fe307968 126 void setGreenPower(int powerGreen);
mbedalvaro 0:3fe2fe307968 127 // Blue laser:
mbedalvaro 0:3fe2fe307968 128 void setBluePower(int powerBlue);
mbedalvaro 0:3fe2fe307968 129
mbedalvaro 0:3fe2fe307968 130 void setRGBPower(unsigned char color); // we will use the 3 LSB bits to set each color
mbedalvaro 0:3fe2fe307968 131
mbedalvaro 0:3fe2fe307968 132 //void setupPWM();
mbedalvaro 0:3fe2fe307968 133 /* IN ADVANCED HARDWARE:
mbedalvaro 0:3fe2fe307968 134 // init PWM for reference generation:
mbedalvaro 0:3fe2fe307968 135 void initPWM();
mbedalvaro 0:3fe2fe307968 136 // reference signal:
mbedalvaro 0:3fe2fe307968 137 void setRefFreq(int);
mbedalvaro 0:3fe2fe307968 138 void incRefFreq(int inc=1);
mbedalvaro 0:3fe2fe307968 139 void decRefFreq(int dec=1);
mbedalvaro 0:3fe2fe307968 140 */
mbedalvaro 0:3fe2fe307968 141
mbedalvaro 0:3fe2fe307968 142 //float refFreq; // could be private
mbedalvaro 0:3fe2fe307968 143
mbedalvaro 0:3fe2fe307968 144
mbedalvaro 0:3fe2fe307968 145 private:
mbedalvaro 0:3fe2fe307968 146
mbedalvaro 0:3fe2fe307968 147 };
mbedalvaro 0:3fe2fe307968 148
mbedalvaro 0:3fe2fe307968 149
mbedalvaro 0:3fe2fe307968 150 extern HardwareIO IO; // allows the object IO to be used in other .cpp files (IO is pre-instantiated in hardwareIO.cpp)
mbedalvaro 0:3fe2fe307968 151 // NOTE: IO encapsulates many IO functions, but perhaps it is better not to have an IO object - just use each IO function separatedly (as with pc object for instance)
mbedalvaro 0:3fe2fe307968 152 extern Serial pc; // allows pc to be manipulated by other .cpp files, even if pc is defined in the hardwareIO.cpp
mbedalvaro 0:3fe2fe307968 153
mbedalvaro 0:3fe2fe307968 154
mbedalvaro 0:3fe2fe307968 155 #endif