Example controlling galvanomirrors (X and Y) using the spi DAC MCP4922 and the new platform FRDM_K64F

Dependencies:   mbed

Committer:
mbedalvaro
Date:
Wed Dec 10 07:22:41 2014 +0000
Revision:
4:1428775752f7
Parent:
3:89f592efbe84
Child:
5:cea6da0fe2f0
added circle with timer

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbedalvaro 0:26b228dde70c 1 #include "laserProjectorHardware.h"
mbedalvaro 0:26b228dde70c 2
mbedalvaro 0:26b228dde70c 3 HardwareIO IO; // preintantiation of cross-file global object IO
mbedalvaro 0:26b228dde70c 4
mbedalvaro 0:26b228dde70c 5 // -------------------------------------- (0) SETUP ALL IO (call this in the setup() function in main program)
mbedalvaro 0:26b228dde70c 6
mbedalvaro 0:26b228dde70c 7 Serial pc(USBTX, USBRX); // tx, rx
mbedalvaro 0:26b228dde70c 8
mbedalvaro 0:26b228dde70c 9 SPI spiDAC(MOSI_PIN, MISO_PIN, SCK_PIN); // mosi, miso, sclk
mbedalvaro 0:26b228dde70c 10 DigitalOut csDAC(CS_DAC_MIRRORS);
mbedalvaro 3:89f592efbe84 11
mbedalvaro 3:89f592efbe84 12 PwmOut Laser_Lockin(LASER_LOCKIN_PIN);
mbedalvaro 3:89f592efbe84 13 DigitalOut Laser_Red(LASER_RED_PIN);
mbedalvaro 0:26b228dde70c 14 DigitalOut Laser_Green(LASER_GREEN_PIN);
mbedalvaro 0:26b228dde70c 15 DigitalOut Laser_Blue(LASER_BLUE_PIN);
mbedalvaro 0:26b228dde70c 16
mbedalvaro 0:26b228dde70c 17 void HardwareIO::init(void) {
mbedalvaro 3:89f592efbe84 18
mbedalvaro 3:89f592efbe84 19 setLockinFreq(LOCKIN_FREQUENCY);
mbedalvaro 3:89f592efbe84 20 setLockinPower(1);
mbedalvaro 3:89f592efbe84 21
mbedalvaro 3:89f592efbe84 22 setRedPower(0);
mbedalvaro 3:89f592efbe84 23 setGreenPower(0);
mbedalvaro 3:89f592efbe84 24 setBluePower(0);
mbedalvaro 0:26b228dde70c 25
mbedalvaro 0:26b228dde70c 26 //Serial Communication setup:
mbedalvaro 0:26b228dde70c 27 pc.baud(115200);//
mbedalvaro 0:26b228dde70c 28 // pc.baud(921600);//115200);//
mbedalvaro 0:26b228dde70c 29
mbedalvaro 0:26b228dde70c 30 // Setup the spi for 8 bit data, high steady state clock,
mbedalvaro 1:4be6abc4ed43 31 // second edge capture, with a 20MHz clock rate (max for the MCP4922)
mbedalvaro 0:26b228dde70c 32 csDAC = 1;
mbedalvaro 0:26b228dde70c 33 spiDAC.format(16,0);
mbedalvaro 1:4be6abc4ed43 34 spiDAC.frequency(20000000);
mbedalvaro 0:26b228dde70c 35
mbedalvaro 0:26b228dde70c 36 // default initial mirror position:
mbedalvaro 0:26b228dde70c 37 writeOutX(CENTER_AD_MIRROR_X);
mbedalvaro 0:26b228dde70c 38 writeOutY(CENTER_AD_MIRROR_Y);
mbedalvaro 0:26b228dde70c 39
mbedalvaro 0:26b228dde70c 40 }
mbedalvaro 0:26b228dde70c 41
mbedalvaro 0:26b228dde70c 42 //write on the first DAC, output A (mirror X)
mbedalvaro 0:26b228dde70c 43 void HardwareIO::writeOutX(unsigned short value){
mbedalvaro 0:26b228dde70c 44 if(value > MAX_AD_MIRRORS) value = MAX_AD_MIRRORS;
mbedalvaro 0:26b228dde70c 45 if(value < MIN_AD_MIRRORS) value = MIN_AD_MIRRORS;
mbedalvaro 0:26b228dde70c 46
mbedalvaro 0:26b228dde70c 47 value |= 0xF000;
mbedalvaro 0:26b228dde70c 48 value &= 0xFFFF;
mbedalvaro 0:26b228dde70c 49
mbedalvaro 0:26b228dde70c 50 csDAC = 0;
mbedalvaro 0:26b228dde70c 51 spiDAC.write(value);
mbedalvaro 0:26b228dde70c 52 csDAC = 1;
mbedalvaro 0:26b228dde70c 53 }
mbedalvaro 0:26b228dde70c 54
mbedalvaro 0:26b228dde70c 55 //write on the first DAC, output B (mirror Y)
mbedalvaro 0:26b228dde70c 56 void HardwareIO::writeOutY(unsigned short value){
mbedalvaro 0:26b228dde70c 57 if(value > MAX_AD_MIRRORS) value = MAX_AD_MIRRORS;
mbedalvaro 0:26b228dde70c 58 if(value < MIN_AD_MIRRORS) value = MIN_AD_MIRRORS;
mbedalvaro 0:26b228dde70c 59
mbedalvaro 0:26b228dde70c 60 value |= 0x7000;
mbedalvaro 0:26b228dde70c 61 value &= 0x7FFF;
mbedalvaro 0:26b228dde70c 62
mbedalvaro 0:26b228dde70c 63 csDAC = 0;
mbedalvaro 0:26b228dde70c 64 spiDAC.write(value);
mbedalvaro 0:26b228dde70c 65 csDAC = 1;
mbedalvaro 0:26b228dde70c 66 }
mbedalvaro 0:26b228dde70c 67
mbedalvaro 3:89f592efbe84 68 void HardwareIO::setLockinFreq(int valueHz) {
mbedalvaro 3:89f592efbe84 69 Laser_Lockin.period_ms(int(1000.0/valueHz));
mbedalvaro 3:89f592efbe84 70 }
mbedalvaro 3:89f592efbe84 71
mbedalvaro 3:89f592efbe84 72 void HardwareIO::setLockinPower(int value) { //note: 0 means off, and 1 or >0 means 50%
mbedalvaro 3:89f592efbe84 73 if (value>0) Laser_Lockin.write(0.5);
mbedalvaro 3:89f592efbe84 74 else Laser_Lockin.write(0);
mbedalvaro 3:89f592efbe84 75 }
mbedalvaro 3:89f592efbe84 76
mbedalvaro 0:26b228dde70c 77 void HardwareIO::setRedPower(int powerValue){
mbedalvaro 0:26b228dde70c 78 if(powerValue > 0){
mbedalvaro 3:89f592efbe84 79 Laser_Red = 1;
mbedalvaro 0:26b228dde70c 80 }
mbedalvaro 0:26b228dde70c 81 else{
mbedalvaro 3:89f592efbe84 82 Laser_Red = 0;
mbedalvaro 0:26b228dde70c 83 }
mbedalvaro 0:26b228dde70c 84 }
mbedalvaro 0:26b228dde70c 85 void HardwareIO::setGreenPower(int powerValue){
mbedalvaro 0:26b228dde70c 86 if(powerValue > 0){
mbedalvaro 0:26b228dde70c 87 Laser_Green = 1;
mbedalvaro 0:26b228dde70c 88 }
mbedalvaro 0:26b228dde70c 89 else{
mbedalvaro 0:26b228dde70c 90 Laser_Green = 0;
mbedalvaro 0:26b228dde70c 91 }
mbedalvaro 0:26b228dde70c 92 }
mbedalvaro 0:26b228dde70c 93 void HardwareIO::setBluePower(int powerValue){
mbedalvaro 0:26b228dde70c 94 if(powerValue > 0){
mbedalvaro 0:26b228dde70c 95 Laser_Blue = 1;
mbedalvaro 0:26b228dde70c 96 }
mbedalvaro 0:26b228dde70c 97 else{
mbedalvaro 0:26b228dde70c 98 Laser_Blue = 0;
mbedalvaro 0:26b228dde70c 99 }
mbedalvaro 0:26b228dde70c 100 }
mbedalvaro 0:26b228dde70c 101 void HardwareIO::setRGBPower(unsigned char color) {
mbedalvaro 0:26b228dde70c 102 //lockin.setLaserPower(color&0x04>0? false : true);
mbedalvaro 3:89f592efbe84 103 Laser_Red=(color&0x04)>>2;
mbedalvaro 0:26b228dde70c 104 Laser_Green=(color&0x02)>>1;
mbedalvaro 0:26b228dde70c 105 Laser_Blue =color&0x01;
mbedalvaro 0:26b228dde70c 106 }
mbedalvaro 0:26b228dde70c 107
mbedalvaro 4:1428775752f7 108 void HardwareIO::drawCircle(int X, int Y, int R, int numPoints, int seconds) {
mbedalvaro 4:1428775752f7 109 Timer t;
mbedalvaro 4:1428775752f7 110 t.start();
mbedalvaro 4:1428775752f7 111 while(t.read_ms()<seconds*1000) drawCircle( X, Y, R, numPoints);
mbedalvaro 4:1428775752f7 112 t.stop();
mbedalvaro 4:1428775752f7 113 }
mbedalvaro 2:383b2acec6e4 114 void HardwareIO::drawCircle(int X, int Y, int R, int numPoints) {
mbedalvaro 4:1428775752f7 115
mbedalvaro 2:383b2acec6e4 116 float alpha=2*3.141592/numPoints;
mbedalvaro 2:383b2acec6e4 117 float theta=0;
mbedalvaro 2:383b2acec6e4 118 for (int i=0; i<numPoints; i++) {
mbedalvaro 2:383b2acec6e4 119 writeOutX(X+1.0*R*cos(theta));
mbedalvaro 2:383b2acec6e4 120 writeOutY(Y+1.0*R*sin(theta));
mbedalvaro 2:383b2acec6e4 121 theta+=alpha;
mbedalvaro 2:383b2acec6e4 122 }
mbedalvaro 2:383b2acec6e4 123 }
mbedalvaro 2:383b2acec6e4 124
mbedalvaro 2:383b2acec6e4 125 void HardwareIO::showLimitsMirrors(int seconds) {
mbedalvaro 0:26b228dde70c 126 unsigned short pointsPerLine=150;
mbedalvaro 0:26b228dde70c 127 int shiftX = (MAX_AD_MIRRORS - MIN_AD_MIRRORS) / pointsPerLine;
mbedalvaro 0:26b228dde70c 128 int shiftY = (MAX_AD_MIRRORS - MIN_AD_MIRRORS) / pointsPerLine;
mbedalvaro 0:26b228dde70c 129
mbedalvaro 0:26b228dde70c 130 Laser_Green=1;
mbedalvaro 2:383b2acec6e4 131 Laser_Red=1;
mbedalvaro 0:26b228dde70c 132
mbedalvaro 0:26b228dde70c 133 //for (int repeat=0; repeat<times; repeat++) {
mbedalvaro 0:26b228dde70c 134
mbedalvaro 0:26b228dde70c 135 Timer t;
mbedalvaro 0:26b228dde70c 136 t.start();
mbedalvaro 2:383b2acec6e4 137 while(t.read_ms()<seconds*1000) {
mbedalvaro 0:26b228dde70c 138
mbedalvaro 0:26b228dde70c 139 writeOutX(MIN_AD_MIRRORS);writeOutY(MIN_AD_MIRRORS);
mbedalvaro 0:26b228dde70c 140
mbedalvaro 0:26b228dde70c 141 for(int j=0; j<pointsPerLine; j++){
mbedalvaro 2:383b2acec6e4 142 wait_us(50);//delay between each points
mbedalvaro 0:26b228dde70c 143 writeOutY(j*shiftY + MIN_AD_MIRRORS);
mbedalvaro 0:26b228dde70c 144 }
mbedalvaro 0:26b228dde70c 145
mbedalvaro 0:26b228dde70c 146 writeOutX(MIN_AD_MIRRORS);writeOutY(MAX_AD_MIRRORS);
mbedalvaro 0:26b228dde70c 147 for(int j=0; j<pointsPerLine; j++) {
mbedalvaro 2:383b2acec6e4 148 wait_us(50);//delay between each points
mbedalvaro 0:26b228dde70c 149 writeOutX(j*shiftX + MIN_AD_MIRRORS);
mbedalvaro 0:26b228dde70c 150 }
mbedalvaro 0:26b228dde70c 151
mbedalvaro 0:26b228dde70c 152 writeOutX(MAX_AD_MIRRORS);writeOutY(MAX_AD_MIRRORS);
mbedalvaro 0:26b228dde70c 153 for(int j=0; j<pointsPerLine; j++) {
mbedalvaro 2:383b2acec6e4 154 wait_us(50);//delay between each points
mbedalvaro 0:26b228dde70c 155 writeOutY(-j*shiftX + MAX_AD_MIRRORS);
mbedalvaro 0:26b228dde70c 156 }
mbedalvaro 0:26b228dde70c 157
mbedalvaro 0:26b228dde70c 158 writeOutX(MAX_AD_MIRRORS);writeOutY(MIN_AD_MIRRORS);
mbedalvaro 0:26b228dde70c 159 for(int j=0; j<pointsPerLine; j++) {
mbedalvaro 2:383b2acec6e4 160 wait_us(50);//delay between each points
mbedalvaro 0:26b228dde70c 161 writeOutX(-j*shiftX + MAX_AD_MIRRORS);
mbedalvaro 0:26b228dde70c 162 }
mbedalvaro 0:26b228dde70c 163
mbedalvaro 0:26b228dde70c 164 }
mbedalvaro 0:26b228dde70c 165 t.stop();
mbedalvaro 0:26b228dde70c 166 Laser_Green=0;
mbedalvaro 0:26b228dde70c 167 }