📄 lpld_tsl1401.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 + -