您的位置:首页 > 运维架构 > Linux

[Linux项目实践] 物联网单板测试之任务四:光敏电阻

2012-03-31 15:15 465 查看
完成单板代码

/*任务4:通过光敏电阻读取光强数值*/

步骤:

4.1、查找电路图(FS_11C14 V3.0.pdf)找到光敏电阻的接口



4.2、这个IC没有使用过,查找这个光敏电阻的IC资料ISL29003.pdf



由光敏电阻的电路资料可知,光敏电阻的 SDA、SCL分别连接到MCU中的I2C总线控制器



4.3、首先初始化I2C总线:

uint32_t I2CInit( uint32_t I2cMode, uint32_t slaveAddr )

{

/* It seems to be bit0 is for I2C, different from

UM. To be retested along with SSP reset. SSP and I2C

reset are overlapped, a known bug, for now, both SSP

and I2C use bit 0 for reset enable. Once the problem

is fixed, change to "#if 1". */

#if 1

LPC_SYSCON->PRESETCTRL |= (0x1<<1);

#else

LPC_SYSCON->PRESETCTRL |= (0x1<<0);

#endif

LPC_SYSCON->SYSAHBCLKCTRL |= (1<<5);

LPC_IOCON->PIO0_4 &= ~0x3F; /* I2C I/O config */

LPC_IOCON->PIO0_4 |= 0x01; /* I2C SCL */

LPC_IOCON->PIO0_5 &= ~0x3F;

LPC_IOCON->PIO0_5 |= 0x01; /* I2C SDA */

/*--- Clear flags ---*/

LPC_I2C->CONCLR = I2CONCLR_AAC | I2CONCLR_SIC | I2CONCLR_STAC | I2CONCLR_I2ENC;

/*--- Reset registers ---*/

#if FAST_MODE_PLUS

LPC_IOCON->PIO0_4 |= (0x1<<9);

LPC_IOCON->PIO0_5 |= (0x1<<9);

LPC_I2C->SCLL = I2SCLL_HS_SCLL;

LPC_I2C->SCLH = I2SCLH_HS_SCLH;

#else

LPC_I2C->SCLL = I2SCLL_SCLL;

LPC_I2C->SCLH = I2SCLH_SCLH;

#endif

if ( I2cMode == I2CSL***E )

{

LPC_I2C->ADR0 = slaveAddr;

}

/* Enable the I2C Interrupt */

NVIC_EnableIRQ(I2C_IRQn);

LPC_I2C->CONSET = I2CONSET_I2EN;

return( TRUE );

}

4.4、光敏电阻的初始化管脚



4.5、对管脚进行初始化

void light_init (void)

{

/* nothing to initialize. light_enable enables the sensor */

//add by terry

GPIOSetDir(PORT0, 7, 1); //set the light pio0_7 output

GPIOSetValue(PORT0, 7, 0); //set the light pio0_7 high

}

4.6、设置光敏电阻的敏感度

void light_setRange(light_range_t newRange)

{

uint8_t ctrl = readControlReg();

/* clear range */

ctrl &= ~(3 << 2);

ctrl |= CTRL_GAIN(newRange);

I2CMasterBuffer[0] = ADDR_CTRL;

I2CMasterBuffer[1] = ctrl;

I2CWrite(LIGHT_I2C_ADDR, I2CMasterBuffer, 2);

switch(newRange) {

case LIGHT_RANGE_1000:

range = RANGE_K1;

break;

case LIGHT_RANGE_4000:

range = RANGE_K2;

break;

case LIGHT_RANGE_16000:

range = RANGE_K3;

break;

case LIGHT_RANGE_64000:

range = RANGE_K4;

break;

}

}

4.7、读取光敏电阻的感光值

uint32_t light_read(void)

{

uint32_t data = 0;

uint8_t buf[1];

buf[0] = ADDR_LSB_SENSOR;

I2CWrite(LIGHT_I2C_ADDR, buf, 1);

I2CRead(LIGHT_I2C_ADDR, buf, 1);

data = buf[0];

buf[0] = ADDR_MSB_SENSOR;

I2CWrite(LIGHT_I2C_ADDR, buf, 1);

I2CRead(LIGHT_I2C_ADDR, buf, 1);

data = (buf[0] << 8 | data);

/* Rext = 100k */

/* E = (range(k) * DATA) / 2^n */

//return (range*data / width);

data *= range;

data /= width;

return data;

}

4.8、测试方法

void Light_Test(void)

{

char buf[24];

uint32_t lux;

//set a title

OLED_ClearScreen();

OLED_DisStrLine(0, 0, "Light");

printf("\r\nLight\r\n");



I2CInit(I2CMASTER, 0);

light_init();



light_enable() //add here

light_setRange(LIGHT_RANGE_4000);

while(1)

{

lux = light_read();

snprintf(buf, 20, "%d ", lux);

OLED_DisStrLine(2, 0, (uint8_t *)buf);

printf("%d ", lux);

delay_ms(300);

if(KEY_Read() == KEY_ESC)

break;

}

}

4.9、编译烧录验证可以实现实时读取感光值
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: