Initial commit

Dependencies:   FastPWM Lamp_Intensity_Lock_withTempCo mbed

Fork of Lamp_Intensity_Lock_withTempCo by Medic

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?

UserRevisionLine numberNew 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,&reg2write,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,&reg2write,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