Hardware control: mirrors

Committer:
mbedalvaro
Date:
Fri Sep 07 06:41:01 2012 +0000
Revision:
2:b8673fcb3800
Parent:
hardwareIO.cpp@1:b1f5ed22087a
this is a simple library to control a simple laser projector: control three lasers (TTL) and two galvano mirrors, through a pair of DAC

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbedalvaro 0:3fe2fe307968 1 #include "hardwareIO.h"
mbedalvaro 0:3fe2fe307968 2
mbedalvaro 0:3fe2fe307968 3 HardwareIO IO; // preintantiation of cross-file global object IO
mbedalvaro 0:3fe2fe307968 4
mbedalvaro 0:3fe2fe307968 5 // -------------------------------------- (0) SETUP ALL IO (call this in the setup() function in main program)
mbedalvaro 0:3fe2fe307968 6
mbedalvaro 0:3fe2fe307968 7 Serial pc(USBTX, USBRX); // tx, rx
mbedalvaro 0:3fe2fe307968 8
mbedalvaro 0:3fe2fe307968 9 SPI spiDAC(MOSI_PIN, MISO_PIN, SCK_PIN); // mosi, miso, sclk
mbedalvaro 0:3fe2fe307968 10 DigitalOut csDAC(CS_DAC_MIRRORS);
mbedalvaro 1:b1f5ed22087a 11
mbedalvaro 0:3fe2fe307968 12 DigitalOut Laser_Red(LASER_RED_PIN); // NOTE: this is NOT the lock in sensing laser (actually, not used yet)
mbedalvaro 0:3fe2fe307968 13 DigitalOut Laser_Green(LASER_GREEN_PIN);
mbedalvaro 0:3fe2fe307968 14 DigitalOut Laser_Blue(LASER_BLUE_PIN);
mbedalvaro 0:3fe2fe307968 15
mbedalvaro 0:3fe2fe307968 16 void HardwareIO::init(void) {
mbedalvaro 0:3fe2fe307968 17 Laser_Red = 0; // note: this is not the lockin-laser!
mbedalvaro 0:3fe2fe307968 18 Laser_Green = 0;
mbedalvaro 0:3fe2fe307968 19 Laser_Blue = 0;
mbedalvaro 0:3fe2fe307968 20
mbedalvaro 0:3fe2fe307968 21 //Serial Communication setup:
mbedalvaro 0:3fe2fe307968 22 pc.baud(115200);//
mbedalvaro 0:3fe2fe307968 23 // pc.baud(921600);//115200);//
mbedalvaro 0:3fe2fe307968 24
mbedalvaro 0:3fe2fe307968 25 // Setup the spi for 8 bit data, high steady state clock,
mbedalvaro 0:3fe2fe307968 26 // second edge capture, with a 10MHz clock rate
mbedalvaro 0:3fe2fe307968 27 csDAC = 1;
mbedalvaro 0:3fe2fe307968 28 spiDAC.format(16,0);
mbedalvaro 0:3fe2fe307968 29 spiDAC.frequency(16000000);
mbedalvaro 0:3fe2fe307968 30
mbedalvaro 0:3fe2fe307968 31 // default initial mirror position:
mbedalvaro 0:3fe2fe307968 32 writeOutX(CENTER_AD_MIRROR_X);
mbedalvaro 0:3fe2fe307968 33 writeOutY(CENTER_AD_MIRROR_Y);
mbedalvaro 0:3fe2fe307968 34
mbedalvaro 0:3fe2fe307968 35 }
mbedalvaro 0:3fe2fe307968 36
mbedalvaro 0:3fe2fe307968 37 //write on the first DAC, output A (mirror X)
mbedalvaro 0:3fe2fe307968 38 void HardwareIO::writeOutX(unsigned short value){
mbedalvaro 0:3fe2fe307968 39 if(value > MAX_AD_MIRRORS) value = MAX_AD_MIRRORS;
mbedalvaro 0:3fe2fe307968 40 if(value < MIN_AD_MIRRORS) value = MIN_AD_MIRRORS;
mbedalvaro 0:3fe2fe307968 41
mbedalvaro 0:3fe2fe307968 42 value |= 0x7000;
mbedalvaro 0:3fe2fe307968 43 value &= 0x7FFF;
mbedalvaro 0:3fe2fe307968 44
mbedalvaro 0:3fe2fe307968 45 csDAC = 0;
mbedalvaro 0:3fe2fe307968 46 spiDAC.write(value);
mbedalvaro 0:3fe2fe307968 47 csDAC = 1;
mbedalvaro 0:3fe2fe307968 48 }
mbedalvaro 0:3fe2fe307968 49
mbedalvaro 0:3fe2fe307968 50 //write on the first DAC, output B (mirror Y)
mbedalvaro 0:3fe2fe307968 51 void HardwareIO::writeOutY(unsigned short value){
mbedalvaro 0:3fe2fe307968 52 if(value > MAX_AD_MIRRORS) value = MAX_AD_MIRRORS;
mbedalvaro 0:3fe2fe307968 53 if(value < MIN_AD_MIRRORS) value = MIN_AD_MIRRORS;
mbedalvaro 0:3fe2fe307968 54
mbedalvaro 0:3fe2fe307968 55 value |= 0xF000;
mbedalvaro 0:3fe2fe307968 56 value &= 0xFFFF;
mbedalvaro 0:3fe2fe307968 57
mbedalvaro 0:3fe2fe307968 58 csDAC = 0;
mbedalvaro 0:3fe2fe307968 59 spiDAC.write(value);
mbedalvaro 0:3fe2fe307968 60 csDAC = 1;
mbedalvaro 0:3fe2fe307968 61 }
mbedalvaro 0:3fe2fe307968 62
mbedalvaro 0:3fe2fe307968 63 void HardwareIO::setRedPower(int powerValue){
mbedalvaro 0:3fe2fe307968 64 if(powerValue > 0){
mbedalvaro 1:b1f5ed22087a 65 Laser_Red = 1;
mbedalvaro 0:3fe2fe307968 66 }
mbedalvaro 0:3fe2fe307968 67 else{
mbedalvaro 1:b1f5ed22087a 68 Laser_Red = 0;
mbedalvaro 0:3fe2fe307968 69 }
mbedalvaro 0:3fe2fe307968 70 }
mbedalvaro 0:3fe2fe307968 71 void HardwareIO::setGreenPower(int powerValue){
mbedalvaro 0:3fe2fe307968 72 if(powerValue > 0){
mbedalvaro 0:3fe2fe307968 73 Laser_Green = 1;
mbedalvaro 0:3fe2fe307968 74 }
mbedalvaro 0:3fe2fe307968 75 else{
mbedalvaro 0:3fe2fe307968 76 Laser_Green = 0;
mbedalvaro 0:3fe2fe307968 77 }
mbedalvaro 0:3fe2fe307968 78 }
mbedalvaro 0:3fe2fe307968 79 void HardwareIO::setBluePower(int powerValue){
mbedalvaro 0:3fe2fe307968 80 if(powerValue > 0){
mbedalvaro 0:3fe2fe307968 81 Laser_Blue = 1;
mbedalvaro 0:3fe2fe307968 82 }
mbedalvaro 0:3fe2fe307968 83 else{
mbedalvaro 0:3fe2fe307968 84 Laser_Blue = 0;
mbedalvaro 0:3fe2fe307968 85 }
mbedalvaro 0:3fe2fe307968 86 }
mbedalvaro 0:3fe2fe307968 87 void HardwareIO::setRGBPower(unsigned char color) {
mbedalvaro 1:b1f5ed22087a 88 //lockin.setLaserPower(color&0x04>0? false : true);
mbedalvaro 1:b1f5ed22087a 89 Laser_Red=color&0x04>>2;
mbedalvaro 0:3fe2fe307968 90 Laser_Green=(color&0x02)>>1;
mbedalvaro 0:3fe2fe307968 91 Laser_Blue =color&0x01;
mbedalvaro 0:3fe2fe307968 92 }
mbedalvaro 0:3fe2fe307968 93
mbedalvaro 0:3fe2fe307968 94 void HardwareIO::showLimitsMirrors(int times) {
mbedalvaro 0:3fe2fe307968 95 unsigned short pointsPerLine=150;
mbedalvaro 0:3fe2fe307968 96 int shiftX = (MAX_AD_MIRRORS - MIN_AD_MIRRORS) / pointsPerLine;
mbedalvaro 0:3fe2fe307968 97 int shiftY = (MAX_AD_MIRRORS - MIN_AD_MIRRORS) / pointsPerLine;
mbedalvaro 0:3fe2fe307968 98
mbedalvaro 0:3fe2fe307968 99 Laser_Green=1;
mbedalvaro 0:3fe2fe307968 100
mbedalvaro 0:3fe2fe307968 101 //for (int repeat=0; repeat<times; repeat++) {
mbedalvaro 0:3fe2fe307968 102
mbedalvaro 0:3fe2fe307968 103 Timer t;
mbedalvaro 0:3fe2fe307968 104 t.start();
mbedalvaro 0:3fe2fe307968 105 while(t.read_ms()<times*1000) {
mbedalvaro 0:3fe2fe307968 106
mbedalvaro 0:3fe2fe307968 107 writeOutX(MIN_AD_MIRRORS);writeOutY(MIN_AD_MIRRORS);
mbedalvaro 0:3fe2fe307968 108
mbedalvaro 0:3fe2fe307968 109 for(int j=0; j<pointsPerLine; j++){
mbedalvaro 0:3fe2fe307968 110 wait_us(200);//delay between each points
mbedalvaro 0:3fe2fe307968 111 writeOutY(j*shiftY + MIN_AD_MIRRORS);
mbedalvaro 0:3fe2fe307968 112 }
mbedalvaro 0:3fe2fe307968 113
mbedalvaro 0:3fe2fe307968 114 writeOutX(MIN_AD_MIRRORS);writeOutY(MAX_AD_MIRRORS);
mbedalvaro 0:3fe2fe307968 115 for(int j=0; j<pointsPerLine; j++) {
mbedalvaro 0:3fe2fe307968 116 wait_us(200);//delay between each points
mbedalvaro 0:3fe2fe307968 117 writeOutX(j*shiftX + MIN_AD_MIRRORS);
mbedalvaro 0:3fe2fe307968 118 }
mbedalvaro 0:3fe2fe307968 119
mbedalvaro 0:3fe2fe307968 120 writeOutX(MAX_AD_MIRRORS);writeOutY(MAX_AD_MIRRORS);
mbedalvaro 0:3fe2fe307968 121 for(int j=0; j<pointsPerLine; j++) {
mbedalvaro 0:3fe2fe307968 122 wait_us(200);//delay between each points
mbedalvaro 0:3fe2fe307968 123 writeOutY(-j*shiftX + MAX_AD_MIRRORS);
mbedalvaro 0:3fe2fe307968 124 }
mbedalvaro 0:3fe2fe307968 125
mbedalvaro 0:3fe2fe307968 126 writeOutX(MAX_AD_MIRRORS);writeOutY(MIN_AD_MIRRORS);
mbedalvaro 0:3fe2fe307968 127 for(int j=0; j<pointsPerLine; j++) {
mbedalvaro 0:3fe2fe307968 128 wait_us(200);//delay between each points
mbedalvaro 0:3fe2fe307968 129 writeOutX(-j*shiftX + MAX_AD_MIRRORS);
mbedalvaro 0:3fe2fe307968 130 }
mbedalvaro 0:3fe2fe307968 131
mbedalvaro 0:3fe2fe307968 132 }
mbedalvaro 0:3fe2fe307968 133 t.stop();
mbedalvaro 0:3fe2fe307968 134 Laser_Green=0;
mbedalvaro 0:3fe2fe307968 135 }