⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lpld_tsl1401.c

📁 [拉普兰德]TSL1401线性CCD模块资料包
💻 C
字号:
/*
 * --------------"拉普兰德K60底层库"示例工程-----------------
 *
 * 测试硬件平台:  LPLD_K60 Card
 * 版权所有:      北京拉普兰德电子技术有限公司
 * 网络销售:      http://laplenden.taobao.com
 * 公司门户:      http://www.lpld.cn
 *
 * 说明:    本工程基于"拉普兰德K60底层库"开发,
 *          所有开源驱动代码均在"LPLD"文件夹下,调用说明见文档[#LPLD-003-N]
 *
 * 文件名:		LPLD_TSL1401.c
 * 用途:		拉普兰德TSL1401线性CCD模块使用例程(单次曝光采集)
 *                      
 * 引脚连接:
 *                      PTA10       --SI
 *                      PTA11       --CLK
 *                      PTB1        --AO 
 *                      PTB0        --Vout(感光传感器输出) 
 *
 * 串口连接:
 *                      PTE8        --TXD
 *                      PTE9        --RXD
 *
 * 参数设置:
 *                      PRINT_AD    --设置串口打印数据的类型,二值量或模拟量   
 *                      THRESHOLD   --设置模拟量转二值量的阈值   
 *                      WINDOW_WIDTH--设置串口打印采集数据的宽度   
 *
 * 模块连接 http://item.taobao.com/item.htm?id=20885700189
 */

#include "common.h"
#include "uart.h"
#include "HAL_GPIO.h"
#include "HAL_ADC.h"
#include "HAL_LPTMR.h"
#include "HAL_PDB.h"

#define TSL1401_SI(x)   LPLD_GPIO_Set_b(PTA, 10, x)
#define TSL1401_CLK(x)  LPLD_GPIO_Set_b(PTA, 11, x)

#define THRESHOLD       100     //设置二值化阈值
#define WINDOW_WIDTH    128     //设置串口打印的像素个数,最大128,最小0


//函数声明
void init_gpio(void);   //GPIO初始化
void delay(void);       //CLK延时
void Integration_Delay(uint16);   //曝光延时
void TSL1401_GetLine_Oneshot(uint8*);   //单次采集
uint8 Normalized_U8(uint16);    //采集数据归一化处理,12位到8为转换,便于串口显示

//全局变量声明
uint8 gPixel[128] = {0};
uint16 gLight = 0;
int16 gIntegrationTime = 0;

//如果使用非拉普兰德线性CCD,需要定义为0
#define LPLD_LinearCCD  1


/********************************************************************/

void main (void)
{
  char i;
  init_gpio();
  
  /*
    初始化ADC0, 
    12位精度,单端
  */
  LPLD_ADC_Init(ADC1, MODE_12, CONV_SING);

  
  while(1)
  {
   
    //获取感光传感器亮度值
    gLight = LPLD_ADC_SE_Get(ADC1, 8);
    //根据环境亮度调整曝光时间,基于简单的线性函数,用户可做其他算法
    //例如:曝光时间=k*环境亮度+b
    
    TSL1401_GetLine_Oneshot(gPixel);
    for(i=(64-WINDOW_WIDTH/2); i<(64+WINDOW_WIDTH/2); i++)
    {
      //串口发送AD值,可用于线性CCD调试助手
      if(gPixel[i]==0xFF) 
        gPixel[i] = 0xFE; //遇到FF用FE替换即可
      uart_putchar (UART5_BASE_PTR, gPixel[i]);    
    }
    
#if (LPLD_LinearCCD==1) //LPLD线性CCD带感光传感器,因此可以输出环境亮度
    uart_putchar (UART5_BASE_PTR, Normalized_U8(gLight));//串口发送传感器亮度值
#endif
    uart_putchar (UART5_BASE_PTR, 0xFF);                //此字节用于线性CCD调试助手识别换行
    
    LPLD_LPTMR_DelayMs(20);
    
  }
}


/*
 * 初始化LPLD_K60 Card上的GPIO
 */
void init_gpio()
{
  LPLD_GPIO_Init(PTA, 10, DIR_OUTPUT, OUTPUT_L, IRQC_DIS);
  LPLD_GPIO_Init(PTA, 11, DIR_OUTPUT, OUTPUT_L, IRQC_DIS);
}

/*
 * 略做延时
 */
void delay()
{
  asm("nop");
}

/*
 * 曝光延时
 */
void Integration_Delay(uint16 t)
{
  LPLD_LPTMR_DelayMs(t);
}

/*
 * 单次采集
 */
void TSL1401_GetLine_Oneshot(uint8 *pixel)
{
  uint8 i;
  
  //单次采集曝光处理
  TSL1401_SI(1);
  delay();
  TSL1401_CLK(1);
  //delay();
  TSL1401_SI(0);
  //发送第1个CLK
  delay();
  TSL1401_CLK(0);
  
  //发送第2~129个CLK
  for(i=1; i<129; i++)
  {
    delay();
    TSL1401_CLK(1);
    delay(); 
    TSL1401_CLK(0);
  }
  //曝光延时
  Integration_Delay(20);
   
  //采集上次曝光得到的图像
  //开始SI
  TSL1401_SI(1);
  delay();
  TSL1401_CLK(1);
  //delay();
  TSL1401_SI(0);
  //delay();
  //采集第1个点
  pixel[0] = Normalized_U8(LPLD_ADC_SE_Get(ADC1, 9));
  TSL1401_CLK(0);
  
  //采集第2~128个点
  for(i=1; i<128; i++)
  {
    delay();
    TSL1401_CLK(1);
    //delay(); 
    pixel[i] = Normalized_U8(LPLD_ADC_SE_Get(ADC1, 9));
    TSL1401_CLK(0);
  }
  
  //发送第129个clk
  delay();
  TSL1401_CLK(1);
  delay(); 
  TSL1401_CLK(0);
  delay();
  
}

/*
 * 数据归一化
 */
uint8 Normalized_U8(uint16 data)
{
  return (uint8)((uint32)data*255/4095);
}

/********************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -