HT82V38应用笔记
1.数据手册-介绍
- 特性
- 通用描述
- SHA 是sample and hold amplifier 的缩写。
是最常用的AD转换方式之一。简单讲,就是采样后保持一段时间再采样,可以在保持的时间内做AD转换,防止数据被新的输入破坏,但这种方法并不能区分噪声和信号。 - CDS是correlated double sampling的缩写,是一种降噪AD转换方式。
每次采样都要把输入和参考电压做减法,相当于是两次采样一次输出。在图形这里主要用于降噪点。SLOAD应该是不接也可以用的,至少传个数据没问题。估计某个标准里规定了三线制的IIC,但是最常用的还是两线制的。
- 框图
HT82V26是一个完整的CCD成像应用的模拟信号处理器。它采用了3通道架构设计,来样和条件下,三线性彩色CCD阵列的输出。每个通道包括一个输入钳位,相关双采样(CDS)的失调DAC和可编程增益放大器(PGA),以及一个高性能的16位A / D转换器。对框图能进行,分块分析 - 引脚分配和说明
- 时序规范
- 内部寄存器
HT82V38共有8个8 bit的内部寄存器,各寄存器的每一位控制不同的内容。其中,配置寄存器控制芯片的工作模式和偏置电压。MUX寄存器控制采样通道的顺序。PGA寄存器和补偿寄存器各有3个,分别对红、绿、蓝3个通道做增益控制和信号补偿。设计中,由FPGA提供三线串行接口的时序及数据。
-
寄存器的设置
1.配置寄存器
配置寄存器控制HT82V38的工作模式和偏置电平。 -
D6位控制参考钳位电压。将该位置低时,OFFSET会变为高阻态Z,从而可以从外部电源驱动OFFSET。
-
D5将HT82V38配置为3通道(高)操作模式。
-
D4设置为高电平将启用CDS操作模式,而将此位设置为低电平将启用SHA操作模式。
-
D2控制掉电模式。将D2位设置为高电平可使HT82V38进入低功耗睡眠模式。HT82V38处于掉电状态时,所有寄存器的内容都将保留。
-
D1位控制满量程输入范围。D1 = 1,满量程输入范围为2V,D1 = 0满量程输入范围为1.6V。
-
D0位控制HT82V38的输出模式。 将D0位设置为高电平将启用单字节输出模式,该模式下仅输出16位ADC的8个MSB。 如果D0位设置为低电平,则16位ADC输出将多路复用为两个字节。
-
设定值为 0011 00010
2.多路复用寄存器设置
MUX寄存器控制HT82V38中的采样通道顺序。 -
在三通道模式下使用时,使用D7位。 将D7位设置为高电平将对MUX进行排序,以首先对红色通道进行采样,然后对绿色通道进行采样,然后对蓝色通道进行采样。在这种模式下,CDSCLK2的上升沿总是将MUX复位为首先对红色通道进行采样(请参见时序图)。 当位D7设置为低电平时,通道顺序颠倒为蓝色第一,绿色第二和红色第三。 CDSCLK2上升沿脉冲将始终使MUX复位,以首先对蓝色通道进行采样。
-
在1通道模式下工作时,使用D6,D5和D4位。
位D6设置为高电平以对红色通道进行采样;位D5设置为高电平以对绿色通道进行采样。 D4位设置为高电平以对蓝色通道进行采样。 -
在1通道模式下,MUX将保持静止。 位D3至位D0控制0.45V至2.7V的4位DAC钳位电压。
-
设定值 01000 xxxx
3.可编程增益放大器的配置寄存器 -
三个PGA寄存器,分别对红色,绿色和蓝色通道中的增益进行编程。
每个寄存器中的D8,D7和D6位必须设置为低电平,而D5至D0位控制64个增益范围。 -
PGA寄存器的编码是直接二进制的,全零字对应于最小增益设置(1x),全字对应于最大增益设置(5.85x)。
-
PGA的增益范围为1x(0dB)至5.85x(15.3dB),可调64级。 该图显示了PGA增益与PGA寄存器代码的关系。尽管增益曲线的dB近似呈线性,但V / V的增益与寄存器代码成非线性比例变化,根据以下方程式:
4.三个通道的偏置寄存器
有三个偏置寄存器,用于分别对红色,绿色和蓝色通道中的偏移进行编程。 D8至D0位以512为增量控制250mV至+ 250mV的偏移范围。偏移寄存器的编码为符号幅度,其中D8为符号位。 表格显示了偏移范围与位D8至D0的关系。
-
Timing Diagrams 时序图
- 寄存器通过串行接口进行配置
串行接口时序说明
串行接口时序图
首先将SLOAD拉低,内部寄存器设置就和IIC很类似了,注意时序中的最小时间
- 时序特性
您前面接的是什么传感器?是CCD的还是CIS的?传感器输出的模拟波形是什么样子的?您截得这个图是CCD信号,需要用CDS mode,而CIS是需要SHA mode。不同mode的timing是不一样的。先核对一下传感器的输出类型。
三通道SHA模式时序图
单通道SHA模式时序图
- 寄存器通过串行接口进行配置
2. 驱动程序
- HT82V38.c
#include "ht82v38.h"
#include "user_config.h"
#include "cis.h"
//////////////////////////////////////////////////////////////////////////////////
u16 Config,MUX,PGAR,PGAG,PGAB,OffsetR,OffsetG,OffsetB;
//////////////////////////////////////////////////////////////////////////////////
//HT82V38的初始化
void HT82V38_Init(void)
{
/*
* PG12 HT82V38 SDATA
* PG13 HT82V38 SCLK
* PG14 HT82V38 SLOAD
*/
RCC->AHB1ENR|=1<<6; //使能PORTG时钟
GPIO_Set(GPIOG,7<<12,GPIO_MODE_OUT,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU); //PG12-14推挽输出
SCLK=0;
SLOAD=1;
}
void SetSDATAin(void)
{
GPIO_Set(GPIOG,(1<<12),GPIO_MODE_IN,0,0,GPIO_PUPD_PU); //PG12设置上拉输入SDATA
}
void SetSDATAout(void)
{
GPIO_Set(GPIOG,(1<<12),GPIO_MODE_OUT,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU); //PG12设置输出SDATA
}
void WriteADC(u16 addr,u16 data)
{
u16 i;
addr=addr<<12;
data=data+addr;
SLOAD=0;
for(i=0;i<16;i++)
{
if(data&0x8000)
SDATA=1;
else
SDATA=0;
data=data<<1;
delayus(4);
SCLK=1;
delayus(4);
SCLK=0;
}
SLOAD=1;
}
u16 ReadADC(u16 addr)
{
u16 i,data;
addr=addr<<12;
addr=addr+0x8000;
data=0;
SLOAD=0;
for(i=0;i<7;i++)
{
if(addr&0x8000)
SDATA=1;
else
SDATA=0;
addr=addr<<1;
delayus(2);
SCLK=1;
delayus(2);
SCLK=0;
}
SetSDATAin();
for(i=7;i<16;i++)
{
data=data<<1;
delayus(2);
if(SDATAin)
data=data+1;
SCLK=1;
delayus(2);
SCLK=0;
}
SetSDATAout();
SLOAD=1;
return data;
}
void SetHT82v38(void)
{
WriteADC(ConfigAddr,Config);
WriteADC(MUXAddr,MUX);
WriteADC(RedPGAAddr,PGAR);
WriteADC(GreenPGAAddr,PGAG);
WriteADC(BluePGAAddr,PGAB);
WriteADC(RedOffsetAddr,OffsetR);
WriteADC(GreenOffsetAddr,OffsetG);
WriteADC(BlueOffsetAddr,OffsetB);
}
- HT82V38.h
#ifndef __HT82V38_H
#define __NT82V38_H
#include "user_config.h"
//////////////////////////////////////////////////////////////////////////////////
//ADC addr
#define ConfigAddr 0
#define MUXAddr 1
#define RedPGAAddr 2
#define GreenPGAAddr 3
#define BluePGAAddr 4
#define RedOffsetAddr 5
#define GreenOffsetAddr 6
#define BlueOffsetAddr 7
//端口定义
#define SDATAin PGin(12) // HT82V38 SDATA
#define SDATA PGout(12) // HT82V38 SDATA
#define SCLK PGout(13) // HT82V38 SCLK
#define SLOAD PGout(14) // HT82V38 SLOAD
extern u16 Config,MUX,PGAR,PGAG,PGAB,OffsetR,OffsetG,OffsetB;
void HT82V38_Init(void); //初始化HT82V38
void SetSDATAin(void);
void SetSDATAout(void);
void WriteADC(u16 addr,u16 data);
u16 ReadADC(u16 addr);
void SetHT82v38(void);
#endif