ADC128S102模数转换芯片接口的实验


基于SPI接口的ADC芯片功能

对ADC128S102模数转换芯片接口的实验进行了仿真验证,和上板测试。

一、ADC芯片及参数介绍

ADC:Analog-to-Digital Converter,模数转换器。通常是指将一个模拟信号转变为数字信号的电子元件。像我们生活中常见的温度,湿度,电压,电流这些能够用连续变化的物理量所表示的信息,都属于模拟信号;而数字信号则是在模拟信号的基础上进过采样,量化和编码而形成的,也就是由许多的0和1组成的信号。

在这里插入图片描述
code的就是对应出来的采样值。U=code*5/2^8

在这里插入图片描述
在这里插入图片描述
板载ADC的位置,主要看三个参数,分辨率、采样范围,采样速率。
在这里插入图片描述
ADC128S102对应的引脚接口示意图。
在这里插入图片描述
数字量每增加1,电压值也增加1LSB。1LSB=VA/4096,VA就是3.3V,
在这里插入图片描述
模拟电压的计算公式。以上就是ADC128S102的结构和对应的模数转换原理。
U=(code-0.5)*3/4096
对于做FPGA的驱动,主要就是去驱动

DOUT信号由谁发出,或者说由谁驱动?DOUT信号由谁接收,或者说由谁读取?
由ADC模数转换芯片产生信号,由FPGA芯片的读取并处理这些信号。
是在SCLK时钟的下降沿去读取DOUT的值,且DOUT值是在时钟周期的一半发生变化这个时候是信号最稳定的时候。
DIN穿行数据输入脚,Data输入,是FPGA提供给ADC芯片的。
在这里插入图片描述
单次采样时序逻辑图。

USER_CTRL用户控制逻辑
Conv, 对应convert转换。

(1)模块示意图

在这里插入图片描述
对应的模块示意图。
在这里插入图片描述
多次发送对应的时序图。
对于线性序列机,一旦你确定好他的时序,在一个时间段之内,它做什么事情都是完全确定的。
这个和状态机不一样,在按键消抖的时候,什么时候按下按键是不确定的,对应产生的高电平时间也是不确定的。

二、模块构建

在这里插入图片描述
一轮传输从CS降为低电平开始,到CS上升为高电平结束。连续转换的时序图是没有拉高的,一次转换是存在拉高的。
在这里插入图片描述
通过查询芯片手册,了解到CS和SCLK的时间间隔大约是10ns。
按照不同的时刻列出信号对应的变化值,汇总成为一个表,方便通过代码构建信号的输入输出关系。
在这里插入图片描述
对应的时刻转换表。

(1)设计思路

1.计数单元,定义两个计数器,用以表示时刻0~34.
2.对照时刻表,在0~34时刻,驱动信号进行相应变化。

(2)线性序列机结构

1.计数单元,本质是一个不停计数的计数器,用以计时得到最小时间单位。
2.序列计数器,用来标记每一个时间点
3.驱动部分,负责根据时刻表中各个信号的值,在对应时间点驱动信号变化。

1.模块构建

要让ADC开始工作,要配置其的采样通道,SCLK的工作频率其实是比较高的,并不会太低,太低会使得一轮转换的时间延长,从而使得ADC内部的采样保持电路带电压在转换过程中改变
LSM_CNT就是线性序列机的意思。

代码如下(示例):

module adc128s102(
    Clk,
    Reset_n,
    
    Addr,
    Conv_Go,
    
    
    
    Conv_Done,
    Data,
    
    ADC_SCLK,
    ADC_CS_N,
    ADC_DIN,
    ADC_DOUT
    );
    input Clk;
    input Reset_n;
    
    input [2:0]Addr;
    input Conv_Go;
    
    output reg Conv_Done;	//转换完成信号,完成转换后产生一个时钟周期的高脉冲
    output reg [11:0]Data;	//ADC转换结果  
    
    
    output reg ADC_SCLK; 
    output reg ADC_CS_N;
    output reg ADC_DIN;
    input ADC_DOUT;
    

    
    parameter CLOCK_FREQ = 50_000_000;
    parameter SCLK_FREQ = 12_500_000;
    parameter MCNT_DIV_CNT = CLOCK_FREQ/(SCLK_FREQ * 2)-1;
    
    reg [7:0]DIV_CNT;
    
    reg [5:0]LSM_CNT;
    
    reg [11:0]Data_r;
    
    reg [2:0]r_Addr;
    
    reg Conv_En;   //转换使能
    always@(posedge Clk or negedge Reset_n)
    if(!Reset_n)
        Conv_En <= 1'd0;
    else if(Conv_Go)
        Conv_En <= 1'd1;
    else if((LSM_CNT == 6'd34) && (DIV_CNT == MCNT_DIV_CNT))
        Conv_En <= 1'd0;
    else
        Conv_En <= Conv_En;
        
    always@(posedge Clk or negedge Reset_n)
    if(!Reset_n)
        DIV_CNT <= 0;
    else if(Conv_En)begin
        if(DIV_CNT == MCNT_DIV_CNT)
            DIV_CNT <= 0;
        else
            DIV_CNT 
STM32F103是一款基于ARM Cortex-M3内核的微控制器,而ADC128S102是一个12位模拟到数字转换器,它通常需要与微控制器配合工作,通过GPIO控制其输入通道的选择,并读取转换结果。 编写驱动程序的过程可以分为以下几个步骤: 1. **初始化**:首先,在程序启动时,你需要配置STM32F103的GPIO用于ADC128S102的数据输入、参考电压以及复位信号。这通常涉及到设置GPIO模式、推挽输出、中断等功能。 ```c void adc128s102_init(void) { // GPIO配置... GPIO_InitStructure.GPIO_Pin = ...; GPIO_InitStructure.GPIO_Mode = ...; GPIO_Init(GPIO_PORT, &GPIO_InitStructure); } ``` 2. **注册中断处理函数**:ADC128S102转换完成后会通过中断通知微控制器,这时需要注册一个中断服务函数(ISRCallback)来处理转换数据。 ```c void NVIC_Configuration(void) { // 配置ADC中断... ADC128S102_IRQn = ...; EnableIRQ(ADC128S102_IRQn); ADC128S102_SetCallback(ISRCallback); } void ISRCallback(void) { uint16_t data; // 获取并处理ADC数据... } ``` 3. **开始转换**:准备好后,你可以调用ADC128S102提供的开始转换函数,指定要测量的通道和相关的转换参数。 ```c void start_conversion(uint8_t channel) { ADC128S102_CmdChannel(channel, ENABLE); // 开始单次转换 } ``` 4. **读取和解析数据**:转换结束后,从ADC寄存器中读取并存储转换结果,然后可能需要进一步处理这些值。 5. **错误检查和日志记录**:考虑到实际应用中的稳定性和调试方便,还需要对驱动程序中的操作进行适当的错误检查和日志记录。 完成上述步骤后,你就有了基本的ADC128S102驱动程序框架。不过,具体的细节可能会因为芯片的具体型号和硬件接口的不同而有所变化,所以可能需要查阅相关的文档或API说明。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值