关闭

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

1050人阅读 评论(0) 收藏 举报

完成单板代码

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

步骤:

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

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

由光敏电阻的电路资料可知,光敏电阻的 SDASCL分别连接到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 == I2CSLAVE )

  {

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、编译烧录验证可以实现实时读取感光值

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:46175次
    • 积分:692
    • 等级:
    • 排名:千里之外
    • 原创:25篇
    • 转载:0篇
    • 译文:0篇
    • 评论:3条
    文章分类
    文章存档
    最新评论