Initial commit
Dependencies: FastPWM Lamp_Intensity_Lock_withTempCo mbed
Fork of Lamp_Intensity_Lock_withTempCo by
Diff: main.cpp
- Revision:
- 0:d4187a097285
- Child:
- 1:2d9d931c8484
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Wed Dec 28 13:29:12 2016 +0000 @@ -0,0 +1,135 @@ +#include "mbed.h" + +#define TMD2772_Addr 0x72 //this is the 8-bit address +const uint8_t ALSDataRegister = 0x14; +const uint8_t waitIntervals = 100; //number of 2.73 ms waits +const int measPeriod_ms = 699; + + +I2C i2c(I2C_SDA,I2C_SCL); +Serial pc(USBTX,USBRX); //open serial port (optionally add baud rate after specifying TX and RX pins) +Timer t; +PwmOut mypwm(PA_1); + +void writeRegister(uint8_t addr, uint8_t reg, uint8_t val) { + /*writes 1 byte to a single register*/ + char writeData[2]; + writeData[0] = reg | 0x80; + writeData[1] = val; + i2c.write(addr,writeData, 2); +} + +void writeBlock(uint8_t addr, uint8_t startReg, uint8_t *data, uint8_t numBytes) { +/*writes data from an array beginning at the startReg*/ + char writeData[numBytes+1]; + writeData[0]=startReg | 0x80; + for(int n=1;n<numBytes;n++) { + writeData[n]=data[n-1]; + } + i2c.write(addr,writeData,numBytes+1); +} + +void readBlock(uint8_t addr, uint8_t startReg, char *data, int numBytes) { + char writeData = startReg | 0x80; + i2c.write(addr,&writeData,1,true); + i2c.read(addr,data,numBytes); +} + +uint16_t LSB_MSB_2uint16(char *data) { +/*returns an unsinged 16 bit integer from a 2 data bytes, where the second byte is the MSB*/ + return ((uint16_t)data[1] << 8) + (uint16_t)data[0]; +} + +void regDump(uint8_t Addr, uint8_t startByte, uint8_t endByte) { +/*print the values of up to 20 registers*/ + char regData[20]; + int numBytes; + if (endByte>=startByte) { + numBytes = (endByte-startByte+1) < 20 ? (endByte-startByte+1) : 20; + } + else { + numBytes=1; + } + + regData[0] = startByte | 0x80; + i2c.write(TMD2772_Addr,regData,1,true); + i2c.read(TMD2772_Addr, regData, numBytes); + for(int n=0;n<numBytes;n++) { + pc.printf("%X \r\n", regData[n]); + } +} + + + +void initTMD2772(void) { + writeRegister(TMD2772_Addr,0x00,0x0B);// Set power on, ALS enabled, Wait enabled, Interrupts enabled (register 0) + writeRegister(TMD2772_Addr,0x01,0x00);//ALS time register - 0x00 is max integration time of 699ms (register 1) + writeRegister(TMD2772_Addr,0x03,0xFF-waitIntervals); // Wtime = 2.73 ms * delay peroids (subtract from 0xFF to enter into register) + writeRegister(TMD2772_Addr,0x0D,0x04); //optionally scale ALS gain by 0.16 by seleting 0x04; +// writeRegister(TMD2772_Addr,0x0D,0x00); //optionally scale ALS gain by 0.16 by seleting 0x04; + + writeRegister(TMD2772_Addr,0x0F,0x00); //ALS gain is 1x +} + +int main() { + float ratio; + char data[4]; + uint16_t ch0Data; + uint16_t ch1Data; + char reg2write; + float setpoint = 29500; + float step = 0.0001; //duty cycle change per sample + float dutyCycle=0.88; + float dutyCycleMin =0.8; + float dutyCycleMax =0.99; + float pGain = 0.25; + float err; + float tol=2.5; + + //setup everything + mypwm.period_ms(5); + mypwm.write(dutyCycle); + i2c.frequency(400000); //set I2C frequency to 400kHz + wait_ms(1000); + initTMD2772(); + regDump(TMD2772_Addr,0x00,0x0F); + pc.printf("Done initializing\r\n"); + wait_ms(700); + + //get initial filter value + reg2write=ALSDataRegister | 0x80; + i2c.write(TMD2772_Addr,®2write,1,true); //1 byte of data, repeated start for read + i2c.read(TMD2772_Addr,data,4); + ch0Data = LSB_MSB_2uint16(data); + ch1Data = LSB_MSB_2uint16(data+2); + ratio = (float)ch0Data/(float)ch1Data; + wait_ms(699); + + while(1) { + t.start(); + reg2write=ALSDataRegister | 0x80; +// pc.printf("%X\r\n",reg2write); + i2c.write(TMD2772_Addr,®2write,1,true); //1 byte of data, repeated start for read + i2c.read(TMD2772_Addr,data,4); + ch0Data = LSB_MSB_2uint16(data); + ch1Data = LSB_MSB_2uint16(data+2); + ratio = (float)ch0Data/(float)ch1Data; + err = ch0Data - setpoint; + pc.printf( "%U,%U, %f, %f, %f\r\n",ch0Data,ch1Data,ratio, dutyCycle, mypwm.read()); + if (abs(err)>tol) { + step = (ch0Data-setpoint)/setpoint * pGain; + dutyCycle -=step; + dutyCycle = (dutyCycle < dutyCycleMin) ? dutyCycleMin : dutyCycle; + dutyCycle = (dutyCycle > dutyCycleMax) ? dutyCycleMax : dutyCycle; + //update with new settings + mypwm.write(dutyCycle); + } + while(t.read_ms() < measPeriod_ms) { + //pc.printf("%U \r\n",t.read_ms()); + } + t.reset(); + } + + +} +