当前位置: 首页 > news >正文

ADC模-数转换原理与实现

1.  今日摸鱼计划

今天来学习一下ADC的原理,然后把ADC给实现

ADC芯片:ADC128S102

视频:

18A_基于SPI接口的ADC芯片功能和接口时序介绍_哔哩哔哩_bilibili

18B_使用线性序列机思路分析SPI接口的ADC芯片接口时序_哔哩哔哩_bilibili

18C_基于线性序列机的SPI接口ADC控制逻辑设计_哔哩哔哩_bilibili

2. ADC指标参数

3. ADC128S102

        在 ACZ702 EDA 扩展板上使用的模数转换器为逐次逼近型的低功耗芯片ADC128S102,其具有 8 通道以及 12 位的分辨率。电源采用独立的模拟供电以及数字供电,其中模拟电源 VA输入范围为 2.7V~5.25V,数字电源 VD输入范围为 2.7V~VA。其与外部通信支持多种接口如:SPIQSPIMICROWIRE以及通用的 DSP 接口。转换速度在 500 kps~1 Mkps,典型情况下当 3V 供电时功耗为2.3mW5V 供电时为 10.7mW,如下图为该 ADC 芯片的内部结构图。

芯片引脚功能如下:

ADC128S102通过 SPI接口与控制器进行通信的时序图如下图所示:

四线SPI分析:

CS

片选信号(本摸鱼怪不会加横线)

CS拉低,表示通信的开始,CS拉高表示通信结束

SCLK
CS 为高时 SCLK 默认高
一帧包含 16 个上升沿 SCLK
DIN

SCLK的上升沿,DIN上的信号要保持稳定,此时ADC芯片会对DIN上的信号采样

DOUT
CS 为高时代表空闲状态,当为低时为传输状态

4.  线性序列机实现ADC

module adc128s102(
                input Clk,
                input Reset_n ,
                
                input Conv_Go,//使能信号
                input [2:0]Addr,
                
                output reg Conv_Done,
                output reg[11:0]Data,
                
                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;
    
    always@(posedge Clk)
    if(Conv_Go)    
        r_Addr <= Addr;
    else
        r_Addr <= 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 <= DIV_CNT + 1'd1;
    end
    else
        DIV_CNT <= 0;

    always@(posedge Clk or negedge Reset_n)
    if(!Reset_n)
        LSM_CNT <= 6'd0;
    else if(DIV_CNT == MCNT_DIV_CNT)begin
        if(LSM_CNT == 6'd34)
            LSM_CNT <= 6'd0;
        else
            LSM_CNT <= LSM_CNT + 1'd1; 
    end
    else
        LSM_CNT <= LSM_CNT;


    always@(posedge Clk or negedge Reset_n )
    if(!Reset_n )begin
        Data_r <= 12'd0;
        ADC_SCLK <= 1'd1;
        ADC_DIN <= 1'd1;
        ADC_CS_N <= 1'd1;
    end
    else if(DIV_CNT == MCNT_DIV_CNT)begin
        case(LSM_CNT)
            0 : begin ADC_CS_N <= 1'd1; ADC_SCLK <= 1'd1;end
            1 : begin ADC_CS_N <= 1'd0;end
            2 : begin ADC_SCLK <= 1'd0;end
            3 : begin ADC_SCLK <= 1'd1;end
            4 : begin ADC_SCLK <= 1'd0;end
            5 : begin ADC_SCLK <= 1'd1;end    
            6 : begin ADC_SCLK <= 1'd0;ADC_DIN <= r_Addr[2]; end
            7 : begin ADC_SCLK <= 1'd1;end    
            8 : begin ADC_SCLK <= 1'd0;ADC_DIN <= r_Addr[1]; end
            9 : begin ADC_SCLK <= 1'd1;end    
            10 :begin ADC_SCLK <= 1'd0;ADC_DIN <= r_Addr[0]; end
            11: begin ADC_SCLK <= 1'd1;Data_r[11] <= ADC_DOUT; end
            12: begin ADC_SCLK <= 1'd0;end
            13: begin ADC_SCLK <= 1'd1;Data_r[10] <= ADC_DOUT; end
            14: begin ADC_SCLK <= 1'd0;end    
            15: begin ADC_SCLK <= 1'd1;Data_r[9] <= ADC_DOUT; end
            16: begin ADC_SCLK <= 1'd0;end
            17: begin ADC_SCLK <= 1'd1;Data_r[8] <= ADC_DOUT; end
            18: begin ADC_SCLK <= 1'd0;end    
            19: begin ADC_SCLK <= 1'd1;Data_r[7] <= ADC_DOUT; end
            20: begin ADC_SCLK <= 1'd0;end
            21: begin ADC_SCLK <= 1'd1;Data_r[6] <= ADC_DOUT; end
            22: begin ADC_SCLK <= 1'd0;end    
            23: begin ADC_SCLK <= 1'd1;Data_r[5] <= ADC_DOUT; end
            24: begin ADC_SCLK <= 1'd0;end
            25: begin ADC_SCLK <= 1'd1;Data_r[4] <= ADC_DOUT; end
            26: begin ADC_SCLK <= 1'd0;end    
            27: begin ADC_SCLK <= 1'd1;Data_r[3] <= ADC_DOUT; end
            28: begin ADC_SCLK <= 1'd0;end
            29: begin ADC_SCLK <= 1'd1;Data_r[2] <= ADC_DOUT; end
            30: begin ADC_SCLK <= 1'd0;end    
            31: begin ADC_SCLK <= 1'd1;Data_r[1] <= ADC_DOUT; end
            32: begin ADC_SCLK <= 1'd0;end
            33: begin ADC_SCLK <= 1'd1;Data_r[0] <= ADC_DOUT; end
            34: begin ADC_SCLK <= 1'd1;ADC_CS_N <= 1'd1; end
            default: ADC_CS_N <= 1'd1; 
        endcase
    end

    always@(posedge Clk or negedge Reset_n )
    if(!Reset_n )begin
        Data <= 12'd0;
        Conv_Done <= 0;
    end
    else if((LSM_CNT == 34) && (DIV_CNT == MCNT_DIV_CNT))begin
        Conv_Done <= 1'd1;
        Data <= Data_r;
    end
    else begin
        Conv_Done <= 1'd0;
        Data <= Data;
    end

endmodule

5.  adc128s102_tb

`timescale 1ns/1ns

module adc128s102_tb;

    reg clk;
    reg reset_n;
    
    reg Conv_Go;
    reg [2:0]Addr;
    
    wire Conv_Done;
    wire[11:0]Data;
    
    wire ADC_SCLK;
    wire ADC_CS_N;
    wire ADC_DIN;
    reg ADC_DOUT;

    adc128s102 adc128s102(
        .Clk(clk),
        .Reset_n(reset_n),
        .Conv_Go(Conv_Go),
        .Addr(Addr),

        .Conv_Done(Conv_Done),
        .Data(Data),
        .ADC_SCLK(ADC_SCLK),
        .ADC_CS_N(ADC_CS_N),
        .ADC_DIN(ADC_DIN),
        .ADC_DOUT(ADC_DOUT)
    );
    
    initial clk = 1;
    always #10 clk = ~clk;
    
    initial begin
        reset_n = 0;
        Conv_Go = 0;
        Addr = 0;
        #201;
        reset_n = 1;
        #200;
        Conv_Go = 1;
        Addr = 3;
        #20;
        Conv_Go  = 0;
        wait(!ADC_CS_N);
        //16'h0A58
        @(negedge ADC_SCLK);
        ADC_DOUT = 0; //DB15 
        @(negedge ADC_SCLK);
        ADC_DOUT = 0; //DB14 
        @(negedge ADC_SCLK);
        ADC_DOUT = 0; //DB13        
        @(negedge ADC_SCLK);
        ADC_DOUT = 0; //DB12        
        @(negedge ADC_SCLK);
        ADC_DOUT = 1; //DB11          
        @(negedge ADC_SCLK);
        ADC_DOUT = 0; //DB10         
        @(negedge ADC_SCLK);
        ADC_DOUT = 1; //DB9         
        @(negedge ADC_SCLK);
        ADC_DOUT = 0; //DB8         
        @(negedge ADC_SCLK);
        ADC_DOUT = 0; //DB7         
        @(negedge ADC_SCLK);
        ADC_DOUT = 1; //DB6         
        @(negedge ADC_SCLK);
        ADC_DOUT = 0; //DB5         
        @(negedge ADC_SCLK);
        ADC_DOUT = 1; //DB4        
        @(negedge ADC_SCLK);
        ADC_DOUT = 1; //DB3         
        @(negedge ADC_SCLK);
        ADC_DOUT = 0; //DB2        
        @(negedge ADC_SCLK);
        ADC_DOUT = 0; //DB1         
        @(negedge ADC_SCLK);
        ADC_DOUT = 0; //DB0      
        wait(ADC_CS_N);
        #2000;   
             
        Conv_Go = 1;
        Addr = 7;
        #20;
        Conv_Go  = 0;        
        wait(!ADC_CS_N);
        //16'h0893
        @(negedge ADC_SCLK);
        ADC_DOUT = 0;
        @(negedge ADC_SCLK);
        ADC_DOUT = 0;
        @(negedge ADC_SCLK);
        ADC_DOUT = 0;        
        @(negedge ADC_SCLK);
        ADC_DOUT = 0;        
        @(negedge ADC_SCLK);
        ADC_DOUT = 1;          
        @(negedge ADC_SCLK);
        ADC_DOUT = 0;         
        @(negedge ADC_SCLK);
        ADC_DOUT = 0;         
        @(negedge ADC_SCLK);
        ADC_DOUT = 0;         
        @(negedge ADC_SCLK);
        ADC_DOUT = 1;         
        @(negedge ADC_SCLK);
        ADC_DOUT = 0;         
        @(negedge ADC_SCLK);
        ADC_DOUT = 0;         
        @(negedge ADC_SCLK);
        ADC_DOUT = 1;         
        @(negedge ADC_SCLK);
        ADC_DOUT = 0;         
        @(negedge ADC_SCLK);
        ADC_DOUT = 0;         
        @(negedge ADC_SCLK);
        ADC_DOUT = 1;         
        @(negedge ADC_SCLK);
        ADC_DOUT = 1;       
        wait(ADC_CS_N);
        #200;    
        #2000;
        $stop;
    end
endmodule

相关文章:

ADC模-数转换原理与实现

1. 今日摸鱼计划 今天来学习一下ADC的原理&#xff0c;然后把ADC给实现 ADC芯片:ADC128S102 视频&#xff1a; 18A_基于SPI接口的ADC芯片功能和接口时序介绍_哔哩哔哩_bilibili 18B_使用线性序列机思路分析SPI接口的ADC芯片接口时序_哔哩哔哩_bilibili 18C_基于线性序列机的S…...

Android 文件传输

目录 device explorer 文件目录关系对应&#xff1a; device explorer 经常写adb命令传文件&#xff0c;结果发现Android studio有自带的文件管理器&#xff0c;可以上传下载文件。 tool windows ->device explorer 文件目录关系对应&#xff1a; Android java获取的程序…...

一起深度学习

CIFAR-10 卷积神经网络 下载数据集构建网络运行测试 下载数据集 batchsz 32cifar_train datasets.CIFAR10(data,trainTrue,transformtorchvision.transforms.Compose([torchvision.transforms.Resize((32,32)),torchvision.transforms.ToTensor()]),downloadTrue)cifar_train …...

servlet-会话(cookie与session)

servlet会话技术 会话技术cookie创建Cookieindex.jspCookieServlet 获取Cookieindex.jspshowCookie session创建sessionindex.jsplogin.jspLoginServlet 获取sessionRedurectServket 清除会话login.jspClearItmeServlet 会话技术 两种会话&#xff1a;cookie&#xff0c;sessi…...

windows11忘记登录密码怎么办?

STEP1&#xff1a;进入Win RE界面 1.按住shift不要松手,点击重新启动&#xff0c;进入WINRE界面 2.选择疑难解答 选择高级选项 点击命令提示符 STEP2:替换utilman 1.输入以下代码查看所在windows所在盘 diskpart list volume exit 2.根据所在盘输入命令&#xff08;以C盘为…...

C#里如何设置输出路径,不要net7.0-windows

官网介绍&#xff1a; 更改生成输出目录 - Visual Studio (Windows) | Microsoft Learn <PropertyGroup> <AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath> <AppendRuntimeIdentifierToOutputPath>false</Appen…...

知名员工上网行为管理系统推荐榜单

上网行为管理软件旨在帮助组织监控和管理员工的网络活动&#xff0c;以提高工作效率、确保网络安全和合规性。以下是一些常见的上网行为管理软件&#xff1a; Ping32&#xff1a;Ping32是一款专业的员工上网行为管理系统&#xff0c;Ping32作为一款专业的员工上网行为管理系统&…...

第12章 软件测试基础(第三部分)测试类型、测试工具

七、测试类型&#xff08;按工程阶段划分&#xff09; 单集系确收 &#xff08;一&#xff09;单元测试 1、单元测试/模块测试 单元就是软件中最小单位&#xff08;或模块&#xff09;。可以是一个函数、一个过程、一个类。主要依据是模块的详细设计文档。价值在于尽早发现…...

open-vm-tools使用虚机的拷贝/粘切

open-vm-tools 是一组用于 VMware 虚拟机中的开源工具,它们提供了一些与虚拟机操作和管理相关的功能。这些工具与 VMware 虚拟化平台集成,可以在虚拟机中提供更好的性能和功能。以下是一些 open-vm-tools 提供的功能: 1. 虚拟机增强功能: open-vm-tools 提供了与 VMware 虚…...

CKEditor编辑器的简单使用方法,取值,赋值

先从官网下载包。CKEditor 4 - Download Latest Version. 一&#xff1a;在项目里引用JQ基础包和CK的JS包 <script src"/JS/jquery-3.4.1.js?v1.0"></script><script src"/ckeditor/ckeditor.js"></script> 二&#xff1a;在表…...

创建一个线程对象需要花费多少内存空间

创建一个std::thread对象所需的内存空间大小并不是固定的&#xff0c;因为它取决于多种因素&#xff0c;包括C运行时库的实现、编译器优化、以及可能的平台和架构差异。 std::thread对象本身是一个轻量级的控制块&#xff0c;它主要用于管理线程的执行&#xff0c;包括保存线程…...

Java -- (part23)

一.网络编程 1.概述 在网络通信协议下,不同计算机上运行的程序,进行数据传输 2.软件架构 CS架构:客户端和服务端 BS架构:浏览器和服务端 3.服务器概念 安装了服务器软件的计算机 4.通信三要素 IP地址 a.概述 计算机的唯一标识,用于两台计算机之间的链接 b.特殊的IP…...

1. C++入门:命名空间及输入输出

C相比C的变化 兼容C面向对象泛型C的不足的弥补 为什么要有命名空间 在C/C中&#xff0c;变量、函数和后面要学到的类都是大量存在的&#xff0c;这些变量、函数和类的名称将都存在于全局作用域中&#xff0c;可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地…...

【Kotlin】Java三目运算转成 kotlin 表达

这行代码会直接计算 array.size 1 的布尔值&#xff0c;并将其赋值给 result。在 Kotlin 中&#xff0c;不需要使用三元操作符&#xff0c;因为条件表达式本身就返回一个布尔值 java 中三木运算&#xff1a; int [] array new int[]{1, 2, 3, 4, 5}; boolean test array &g…...

如何安全可控地进行内外网跨网络传输文件?

跨网络传输文件通常指的是在不同的网络环境之间移动数据&#xff0c;这在现代企业运营中非常常见。随着网络技术的高速发展&#xff0c;为了有效地保护内部的核心数据资产&#xff0c;企业一般会采用内外网隔离的策略。在进行内外网跨网络传输文件时&#xff0c;需要考虑多种因…...

Python Json数据解析

本篇主要介绍Python 中json数据如何解析、转化、保存和加载。 目录 Json数据解析 概念 作用 Json文件组成 Json转化为Python数据类型 Python数据类型转化为json 写入本地json文件 读取本地的json文件 总结 Json数据解析 概念 一种保存数据的格式 作用 可以保存本地…...

pyinstaller打包pytorch和transformers程序

记录使用pyinstaller打包含有pytorch和transformers库的程序时遇到的问题和解决方法。 环境和版本信息 操作系统&#xff1a;Windows 11 Python&#xff1a;3.10.12 pyinstaller&#xff1a;5.13.0 torch&#xff1a;2.2.2 transformers&#xff1a;4.40.1 打包过程和问…...

西门子数控网络IP设定配置

总结&#xff1a;menuselect-诊断-屏幕下方右翻页找到tcp/ip&#xff0c;进去选择tcp/ip诊断&#xff0c;进去选择x130网口&#xff0c;点击更改&#xff0c; 如果没有更改&#xff0c;menuselect-调试-口令&#xff0c;输入口令 sunrise 然后重新配置tcp/ip&#xff0c;配置完…...

[Unity]备份许可文件

原因&#xff1a;因Unity需要重新恢复出厂设置&#xff0c;所以需要先将许可文件本分到本地&#xff0c;以便重新初始化后输入许可。 1&#xff09;登录管理网络web界面&#xff0c;在服务页面打开SSH 2&#xff09;ssh到管理网络&#xff0c;使用service用户登录 3&#xf…...

第十五届蓝桥杯省赛大学B组(c++)

很幸运拿了辽宁赛区的省一,进入6月1号的国赛啦... 这篇文章主要对第十五届省赛大学B组(C)进行一次完整的复盘,这次省赛2道填空题6道编程题: A.握手问题 把握手情景看成矩阵: 粉色部分是7个不能互相捂手的情况 由于每个人只能和其他人捂手, 所以黑色情况是不算的 1和2握手2和…...

ThinkPHP8.x全面升级:现代化PHP开发新标杆

好的&#xff0c;我们来梳理一下 ThinkPHP 8.x 版本&#xff08;通常指 8.0 及后续小版本&#xff09;的主要特性和改进方向。相较于之前的版本&#xff08;如 5.x&#xff09;&#xff0c;8.x 版本在架构、性能、规范性和安全性上都有显著提升&#xff1a;核心方向与重大变更&…...

TPFanCtrl2:ThinkPad智能风扇控制终极指南,彻底解决过热与噪音问题

TPFanCtrl2&#xff1a;ThinkPad智能风扇控制终极指南&#xff0c;彻底解决过热与噪音问题 【免费下载链接】TPFanCtrl2 ThinkPad Fan Control 2 (Dual Fan) for Windows 10 and 11 项目地址: https://gitcode.com/gh_mirrors/tp/TPFanCtrl2 你是否曾经在安静的会议室中…...

【免费下载】 探索双面神技:STM32G474的USB跨界应用

探索双面神技&#xff1a;STM32G474的USB跨界应用 在物联网与嵌入式开发的世界里&#xff0c;寻找一款能兼顾数据传输与控制沟通的神器是每个开发者的心头好。今天&#xff0c;我们就来揭秘这样一个宝藏项目——STM32G474实现USB的MSCCDC组合功能&#xff0c;它巧妙地将STM32G4…...

如何永久免费使用IDM下载管理器:无需破解的智能重置方案

如何永久免费使用IDM下载管理器&#xff1a;无需破解的智能重置方案 【免费下载链接】idm-trial-reset Use IDM forever without cracking 项目地址: https://gitcode.com/gh_mirrors/id/idm-trial-reset 想要永久免费使用Internet Download Manager这款强大的下载加速工…...

3分钟解锁音乐自由:ncmdump让网易云音乐NCM文件随处播放

3分钟解锁音乐自由&#xff1a;ncmdump让网易云音乐NCM文件随处播放 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的歌曲只能在特定客户端播放而烦恼吗&#xff1f;当您精心收藏的音乐被NCM加密格式束缚&…...

终极指南:如何在Mac上免费实现NTFS读写功能

终极指南&#xff1a;如何在Mac上免费实现NTFS读写功能 【免费下载链接】Free-NTFS-for-Mac Nigate: An open-source NTFS utility for Mac. It supports all Mac models (Intel and Apple Silicon), providing full read-write access, mounting, and management for NTFS dri…...

Cling实时编码音乐应用:探索编程与艺术的跨界融合

Cling实时编码音乐应用&#xff1a;探索编程与艺术的跨界融合 【免费下载链接】cling The interactive C interpreter Cling 项目地址: https://gitcode.com/gh_mirrors/cli/cling Cling作为一款强大的交互式C解释器&#xff0c;不仅能提升编程效率&#xff0c;更能成为…...

为什么选择Hydrogen:对比传统电商平台的5大优势 [特殊字符]

为什么选择Hydrogen&#xff1a;对比传统电商平台的5大优势 &#x1f680; 【免费下载链接】hydrogen Hydrogen lets you build faster headless storefronts in less time, on Shopify. 项目地址: https://gitcode.com/gh_mirrors/hyd/hydrogen 在当今快速发展的电商领…...

从原理到实战:晶体管开关电路设计与常见问题解析

1. 项目概述&#xff1a;为什么我们需要晶体管开关&#xff1f;如果你玩过Arduino或者树莓派&#xff0c;肯定遇到过这样的尴尬&#xff1a;想用单片机的一个GPIO引脚直接点亮一个12V的汽车大灯&#xff0c;或者驱动一个小马达&#xff0c;结果要么灯不亮&#xff0c;要么马达纹…...

别再只会用menuconfig了!手把手教你为ESP32项目定制专属Kconfig配置菜单

从配置使用者到设计者&#xff1a;ESP32项目中的Kconfig高级定制指南 在ESP-IDF开发环境中&#xff0c;menuconfig几乎是每个开发者每天都要接触的工具。但大多数开发者仅仅停留在"使用者"层面——他们知道如何勾选选项、调整参数&#xff0c;却很少思考这些配置菜单…...