Initial commit

Dependencies:   FastPWM Lamp_Intensity_Lock_withTempCo mbed

Fork of Lamp_Intensity_Lock_withTempCo by Medic

Files at this revision

API Documentation at this revision

Comitter:
laserdad
Date:
Wed Dec 28 13:29:12 2016 +0000
Child:
1:2d9d931c8484
Commit message:
Initial commit. Using built-in PWM library.

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
--- /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,&reg2write,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,&reg2write,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();
+    }
+    
+    
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Wed Dec 28 13:29:12 2016 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/9baf128c2fab
\ No newline at end of file