视频放大后不清晰,可将鼠标放在视频上,右上角出现“去bilibili观看”进行点击,转到B站观看清晰版本
一、实物图
二、原理图
编号 | 名称 | 功能 |
1 | CS | 片选使能,低电平芯片使能。 |
2 | CH0 | 模拟输入通道0,或作为IN+/-使用。 |
3 | CH1 | 模拟输入通道1,或作为IN+/-使用。 |
4 | GND | 电源地 |
5 | DI | 数据信号输入,选择通道控制。 |
6 | DO | 数据信号输出,转换数据输出。 |
7 | CLK | 芯片时钟输入。 |
8 | VCC/REF | 电源输入及参考电压输入(复用)。 |
为什么DO和DI引脚连在一个引脚上?
由于ADC0832在通信时并不是会同时使用DO和DI端口,并且DO和DI端口与单片机的接口是双向的,所以在设计电路中可以用一根线将DO端和DI端连接到一起。
三、简介(ADC:Analog Digital Converter)
ADC是用于将模拟形式的连续信号转换为数字形式的离散信号的一类设备。ADC0832 为8位分辨率A/D转换芯片,其最高分辨可达256级,可以适应一般的模拟量转换要求。其内部电源输入与参考电压的复用,使得芯片的模拟电压输入在0~5V之间。芯片转换时间仅为32μS,具有双数据输出可作为数据校验,以减少数据误差,转换速度快且稳定性能强。独立的芯片使能输入,使多器件挂接和处理器控制变的更加方便。通过DI 数据输入端,可以轻易的实现通道功能的选择。
计算公式:
电器参数:
- 8位分辨率;
- 双通道 A/D 转换;
- 输入输出电平与 TTL/CMOS 相兼容;
- 5V电源供电时输入电压在 0~5V 之间;
- 工作频率为 250KHZ,转换时间为 32μS;
- 一般功耗仅为15mW;
- 8P、14P—DIP(双列直插)、SOP多种封装;
- 商用级芯片温宽为0°C to +70°C,工业级芯片温宽为−40°C to +85°C;
四、内部框图
五、通信协议
ADC0832的外部连接采用SPI总线结构,这样便把它的连接方式与其他设备统一起来了。
ADC0832采用同步串行传输,同步是通过时钟线进行数据同步;串行传输通过DO 数据口一位一位传输数据。
六、通道配置
当配置位2位数据为1、0时,只对CH0 进行单通道转换。当配置2位数据为1、1时,只对CH1进行单通道转换。当配置2位数据为0、0时,将CH0作为正输入端IN+,CH1作为负输入端IN-进行输入,输出为两端的压差。当配置2位数据为0、1时,将CH0作为负输入端IN-,CH1 作为正输入端IN+进行输入,输出为两端的压差。
七、时序解析
由工作时序图可知:当芯片不进行模数转换时,片选端CS需要置1。在当芯片需要模数转换时,片选端CS需要置0,并且需要持续到模数转换完成。芯片使能选通后,在第1个CLK下降沿到来之前,DI需要置1,这意味着开始转换。之后在下两个CLK下降沿到来之前,DI需输入两位选择A/D转换器4个工作通道模式的数据。到这一步,本次模数转换中DI端工作部分已完成,不再输入数据,而是由DO端进行工作。在随后的CLK下降沿到来之前开始输出转换后的数字信号,先输出8位数据的最高位,之后在每一个CLK下降沿到来之前依次输出数据的一位,直到输出8位数据的最低位;随后的每一个CLK下降沿到来之前依次输出相反字节的数据次低位到最高位,这就完成了一次A/D转换。在编程时会比较两次输出的8位数据是否一致,若一致说明A/D转换数据没有错误,就会将其数据保存下来。
代码如下:
/****
*******获取adc值函数
*******参量定义:CH:通道数 0:通道0 1:通道1
*******返回值:adc值
*****/
uint Adc0832_Get_Value(uchar CH)
{
uchar i, data1=0, data2=0;
ADC_CS = 0; //使能ADC0832
//初始化
ADC_CLK = 0;
ADC_DATI = 1;
_nop_();
ADC_CLK = 1;
_nop_();
//通道选择
if(CH == 0) //通道0
{
ADC_CLK = 0;
ADC_DATI = 1; //通道0的第一位
_nop_();
ADC_CLK = 1;
_nop_();
ADC_CLK = 0;
ADC_DATI = 0; //通道0的第二位
_nop_();
ADC_CLK = 1;
_nop_();
}
else //通道1
{
ADC_CLK = 0;
ADC_DATI = 1; //通道1的第一位
_nop_();
ADC_CLK = 1;
_nop_();
ADC_CLK = 0;
ADC_DATI = 1; //通道1的第二位
_nop_();
ADC_CLK = 1;
_nop_();
}
ADC_CLK = 0;
ADC_DATI = 1;
_nop_();
for(i=0; i<8; i++) //读取前8位的值
{
ADC_CLK = 1;
_nop_();
ADC_CLK = 0;
_nop_();
data1 = (data1 << 1) | (uchar)ADC_DATO;
}
for (i=0; i<8; i++) //读取后8位的值
{
data2 = data2 | (uchar)ADC_DATO << i;
ADC_CLK = 1;
_nop_();
ADC_CLK = 0;
_nop_();
}
ADC_CS = 1; //释放ADC0832
return (data1 == data2) ? data1 : 0; //两次数据是否一致,一致则输出数据,否则输出0
}
八、流程设计
首先初始化引脚,然后CS拉低使能ADC,接着DI拉高开始转换,先配置通道,如果是通道0,则通道选择第一位和第二位分别置1和0;如果是通道1,则通道选择第一位和第二位分别置1和1。配置好通道后,开始读取前8位数据,然后读取后8位数据,数据读取完后CS拉高释放ADC。最后判断前8位数据是否等于后8位数据,如果相等,则返回数据,如果不等,则返回0。