Initial commit
Dependencies: FastPWM Lamp_Intensity_Lock_withTempCo mbed
Fork of Lamp_Intensity_Lock_withTempCo by
main.cpp@0:d4187a097285, 2016-12-28 (annotated)
- Committer:
- laserdad
- Date:
- Wed Dec 28 13:29:12 2016 +0000
- Revision:
- 0:d4187a097285
- Child:
- 1:2d9d931c8484
Initial commit. Using built-in PWM library.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
laserdad | 0:d4187a097285 | 1 | #include "mbed.h" |
laserdad | 0:d4187a097285 | 2 | |
laserdad | 0:d4187a097285 | 3 | #define TMD2772_Addr 0x72 //this is the 8-bit address |
laserdad | 0:d4187a097285 | 4 | const uint8_t ALSDataRegister = 0x14; |
laserdad | 0:d4187a097285 | 5 | const uint8_t waitIntervals = 100; //number of 2.73 ms waits |
laserdad | 0:d4187a097285 | 6 | const int measPeriod_ms = 699; |
laserdad | 0:d4187a097285 | 7 | |
laserdad | 0:d4187a097285 | 8 | |
laserdad | 0:d4187a097285 | 9 | I2C i2c(I2C_SDA,I2C_SCL); |
laserdad | 0:d4187a097285 | 10 | Serial pc(USBTX,USBRX); //open serial port (optionally add baud rate after specifying TX and RX pins) |
laserdad | 0:d4187a097285 | 11 | Timer t; |
laserdad | 0:d4187a097285 | 12 | PwmOut mypwm(PA_1); |
laserdad | 0:d4187a097285 | 13 | |
laserdad | 0:d4187a097285 | 14 | void writeRegister(uint8_t addr, uint8_t reg, uint8_t val) { |
laserdad | 0:d4187a097285 | 15 | /*writes 1 byte to a single register*/ |
laserdad | 0:d4187a097285 | 16 | char writeData[2]; |
laserdad | 0:d4187a097285 | 17 | writeData[0] = reg | 0x80; |
laserdad | 0:d4187a097285 | 18 | writeData[1] = val; |
laserdad | 0:d4187a097285 | 19 | i2c.write(addr,writeData, 2); |
laserdad | 0:d4187a097285 | 20 | } |
laserdad | 0:d4187a097285 | 21 | |
laserdad | 0:d4187a097285 | 22 | void writeBlock(uint8_t addr, uint8_t startReg, uint8_t *data, uint8_t numBytes) { |
laserdad | 0:d4187a097285 | 23 | /*writes data from an array beginning at the startReg*/ |
laserdad | 0:d4187a097285 | 24 | char writeData[numBytes+1]; |
laserdad | 0:d4187a097285 | 25 | writeData[0]=startReg | 0x80; |
laserdad | 0:d4187a097285 | 26 | for(int n=1;n<numBytes;n++) { |
laserdad | 0:d4187a097285 | 27 | writeData[n]=data[n-1]; |
laserdad | 0:d4187a097285 | 28 | } |
laserdad | 0:d4187a097285 | 29 | i2c.write(addr,writeData,numBytes+1); |
laserdad | 0:d4187a097285 | 30 | } |
laserdad | 0:d4187a097285 | 31 | |
laserdad | 0:d4187a097285 | 32 | void readBlock(uint8_t addr, uint8_t startReg, char *data, int numBytes) { |
laserdad | 0:d4187a097285 | 33 | char writeData = startReg | 0x80; |
laserdad | 0:d4187a097285 | 34 | i2c.write(addr,&writeData,1,true); |
laserdad | 0:d4187a097285 | 35 | i2c.read(addr,data,numBytes); |
laserdad | 0:d4187a097285 | 36 | } |
laserdad | 0:d4187a097285 | 37 | |
laserdad | 0:d4187a097285 | 38 | uint16_t LSB_MSB_2uint16(char *data) { |
laserdad | 0:d4187a097285 | 39 | /*returns an unsinged 16 bit integer from a 2 data bytes, where the second byte is the MSB*/ |
laserdad | 0:d4187a097285 | 40 | return ((uint16_t)data[1] << 8) + (uint16_t)data[0]; |
laserdad | 0:d4187a097285 | 41 | } |
laserdad | 0:d4187a097285 | 42 | |
laserdad | 0:d4187a097285 | 43 | void regDump(uint8_t Addr, uint8_t startByte, uint8_t endByte) { |
laserdad | 0:d4187a097285 | 44 | /*print the values of up to 20 registers*/ |
laserdad | 0:d4187a097285 | 45 | char regData[20]; |
laserdad | 0:d4187a097285 | 46 | int numBytes; |
laserdad | 0:d4187a097285 | 47 | if (endByte>=startByte) { |
laserdad | 0:d4187a097285 | 48 | numBytes = (endByte-startByte+1) < 20 ? (endByte-startByte+1) : 20; |
laserdad | 0:d4187a097285 | 49 | } |
laserdad | 0:d4187a097285 | 50 | else { |
laserdad | 0:d4187a097285 | 51 | numBytes=1; |
laserdad | 0:d4187a097285 | 52 | } |
laserdad | 0:d4187a097285 | 53 | |
laserdad | 0:d4187a097285 | 54 | regData[0] = startByte | 0x80; |
laserdad | 0:d4187a097285 | 55 | i2c.write(TMD2772_Addr,regData,1,true); |
laserdad | 0:d4187a097285 | 56 | i2c.read(TMD2772_Addr, regData, numBytes); |
laserdad | 0:d4187a097285 | 57 | for(int n=0;n<numBytes;n++) { |
laserdad | 0:d4187a097285 | 58 | pc.printf("%X \r\n", regData[n]); |
laserdad | 0:d4187a097285 | 59 | } |
laserdad | 0:d4187a097285 | 60 | } |
laserdad | 0:d4187a097285 | 61 | |
laserdad | 0:d4187a097285 | 62 | |
laserdad | 0:d4187a097285 | 63 | |
laserdad | 0:d4187a097285 | 64 | void initTMD2772(void) { |
laserdad | 0:d4187a097285 | 65 | writeRegister(TMD2772_Addr,0x00,0x0B);// Set power on, ALS enabled, Wait enabled, Interrupts enabled (register 0) |
laserdad | 0:d4187a097285 | 66 | writeRegister(TMD2772_Addr,0x01,0x00);//ALS time register - 0x00 is max integration time of 699ms (register 1) |
laserdad | 0:d4187a097285 | 67 | writeRegister(TMD2772_Addr,0x03,0xFF-waitIntervals); // Wtime = 2.73 ms * delay peroids (subtract from 0xFF to enter into register) |
laserdad | 0:d4187a097285 | 68 | writeRegister(TMD2772_Addr,0x0D,0x04); //optionally scale ALS gain by 0.16 by seleting 0x04; |
laserdad | 0:d4187a097285 | 69 | // writeRegister(TMD2772_Addr,0x0D,0x00); //optionally scale ALS gain by 0.16 by seleting 0x04; |
laserdad | 0:d4187a097285 | 70 | |
laserdad | 0:d4187a097285 | 71 | writeRegister(TMD2772_Addr,0x0F,0x00); //ALS gain is 1x |
laserdad | 0:d4187a097285 | 72 | } |
laserdad | 0:d4187a097285 | 73 | |
laserdad | 0:d4187a097285 | 74 | int main() { |
laserdad | 0:d4187a097285 | 75 | float ratio; |
laserdad | 0:d4187a097285 | 76 | char data[4]; |
laserdad | 0:d4187a097285 | 77 | uint16_t ch0Data; |
laserdad | 0:d4187a097285 | 78 | uint16_t ch1Data; |
laserdad | 0:d4187a097285 | 79 | char reg2write; |
laserdad | 0:d4187a097285 | 80 | float setpoint = 29500; |
laserdad | 0:d4187a097285 | 81 | float step = 0.0001; //duty cycle change per sample |
laserdad | 0:d4187a097285 | 82 | float dutyCycle=0.88; |
laserdad | 0:d4187a097285 | 83 | float dutyCycleMin =0.8; |
laserdad | 0:d4187a097285 | 84 | float dutyCycleMax =0.99; |
laserdad | 0:d4187a097285 | 85 | float pGain = 0.25; |
laserdad | 0:d4187a097285 | 86 | float err; |
laserdad | 0:d4187a097285 | 87 | float tol=2.5; |
laserdad | 0:d4187a097285 | 88 | |
laserdad | 0:d4187a097285 | 89 | //setup everything |
laserdad | 0:d4187a097285 | 90 | mypwm.period_ms(5); |
laserdad | 0:d4187a097285 | 91 | mypwm.write(dutyCycle); |
laserdad | 0:d4187a097285 | 92 | i2c.frequency(400000); //set I2C frequency to 400kHz |
laserdad | 0:d4187a097285 | 93 | wait_ms(1000); |
laserdad | 0:d4187a097285 | 94 | initTMD2772(); |
laserdad | 0:d4187a097285 | 95 | regDump(TMD2772_Addr,0x00,0x0F); |
laserdad | 0:d4187a097285 | 96 | pc.printf("Done initializing\r\n"); |
laserdad | 0:d4187a097285 | 97 | wait_ms(700); |
laserdad | 0:d4187a097285 | 98 | |
laserdad | 0:d4187a097285 | 99 | //get initial filter value |
laserdad | 0:d4187a097285 | 100 | reg2write=ALSDataRegister | 0x80; |
laserdad | 0:d4187a097285 | 101 | i2c.write(TMD2772_Addr,®2write,1,true); //1 byte of data, repeated start for read |
laserdad | 0:d4187a097285 | 102 | i2c.read(TMD2772_Addr,data,4); |
laserdad | 0:d4187a097285 | 103 | ch0Data = LSB_MSB_2uint16(data); |
laserdad | 0:d4187a097285 | 104 | ch1Data = LSB_MSB_2uint16(data+2); |
laserdad | 0:d4187a097285 | 105 | ratio = (float)ch0Data/(float)ch1Data; |
laserdad | 0:d4187a097285 | 106 | wait_ms(699); |
laserdad | 0:d4187a097285 | 107 | |
laserdad | 0:d4187a097285 | 108 | while(1) { |
laserdad | 0:d4187a097285 | 109 | t.start(); |
laserdad | 0:d4187a097285 | 110 | reg2write=ALSDataRegister | 0x80; |
laserdad | 0:d4187a097285 | 111 | // pc.printf("%X\r\n",reg2write); |
laserdad | 0:d4187a097285 | 112 | i2c.write(TMD2772_Addr,®2write,1,true); //1 byte of data, repeated start for read |
laserdad | 0:d4187a097285 | 113 | i2c.read(TMD2772_Addr,data,4); |
laserdad | 0:d4187a097285 | 114 | ch0Data = LSB_MSB_2uint16(data); |
laserdad | 0:d4187a097285 | 115 | ch1Data = LSB_MSB_2uint16(data+2); |
laserdad | 0:d4187a097285 | 116 | ratio = (float)ch0Data/(float)ch1Data; |
laserdad | 0:d4187a097285 | 117 | err = ch0Data - setpoint; |
laserdad | 0:d4187a097285 | 118 | pc.printf( "%U,%U, %f, %f, %f\r\n",ch0Data,ch1Data,ratio, dutyCycle, mypwm.read()); |
laserdad | 0:d4187a097285 | 119 | if (abs(err)>tol) { |
laserdad | 0:d4187a097285 | 120 | step = (ch0Data-setpoint)/setpoint * pGain; |
laserdad | 0:d4187a097285 | 121 | dutyCycle -=step; |
laserdad | 0:d4187a097285 | 122 | dutyCycle = (dutyCycle < dutyCycleMin) ? dutyCycleMin : dutyCycle; |
laserdad | 0:d4187a097285 | 123 | dutyCycle = (dutyCycle > dutyCycleMax) ? dutyCycleMax : dutyCycle; |
laserdad | 0:d4187a097285 | 124 | //update with new settings |
laserdad | 0:d4187a097285 | 125 | mypwm.write(dutyCycle); |
laserdad | 0:d4187a097285 | 126 | } |
laserdad | 0:d4187a097285 | 127 | while(t.read_ms() < measPeriod_ms) { |
laserdad | 0:d4187a097285 | 128 | //pc.printf("%U \r\n",t.read_ms()); |
laserdad | 0:d4187a097285 | 129 | } |
laserdad | 0:d4187a097285 | 130 | t.reset(); |
laserdad | 0:d4187a097285 | 131 | } |
laserdad | 0:d4187a097285 | 132 | |
laserdad | 0:d4187a097285 | 133 | |
laserdad | 0:d4187a097285 | 134 | } |
laserdad | 0:d4187a097285 | 135 |