小梅哥17——基于SPI接口的ADC芯片功能和接口时序分析

一、ADC基础

ADC(Analog to Digital Conver),通常是指一个将模拟信号转变为数字信号(二进制表示的离散信号)的转换器。

1. 间接ADC    先将输入模拟电压转换成时间或频率,再把中间量转换成数字量

双积分型 ADC,先对输入采样电压和基准电压进行两次积分,获得与采样电压平均值成正比的时间间隔,同时用计数器对标准时钟脉冲计数。抗干扰能力强,稳定性好,但转换速度低。

2. 直接ADC

①并联比较型 ADC,采用各量级同时并行比较,各位输出码也是同时并行产生,转换速度快。缺点是成本高、功耗大。

②逐次逼近型 ADC,逐个产生系列比较电压,逐次与输入电压分别比较,以逐渐逼近的方式进行模数转换,属于中速 ADC 器件。

3. 位数、分辨率、精度

ADC位数,每个通道转换结果的位数。

n位的ADC的分辨率为2的n次方。

假如量程是5V,用12位ADC能采集得到的最小电压值为5/(2^12)=1.2mv,此为该ADC的精度。

二、ADC128S022

1. 结构

AC620 使用逐次逼近型的低功耗芯片 ADC128S022,具有8通道及12位分辨率。12位ADC,转换结果需要通过12个SCLK将数据采集出来。

12 位分辨率,该ADC 1bit 代表的电压值即为 VA/4096。手册中同时指出,模拟输入电压低于 VA/8192 时,输出 0000_0000_0000b,当输出数 0000_0000_0000b 变为 0000_0000_0001b 时,实际输入电压变化为 VA/8192 而不是 VA/4096。当输入电压大于等于 VA-1.5* VA/4096,输出数据即为 1111_1111_1111b。 

 2. 接口时序

ADC128S022 通过 SPI 接口与控制器进行通信,FPGA 按SPI 时序实现对ADC的控制。

DIN:ADC通道信号,FPGA输出,ADC在SCLK上升沿采样输入,在下降沿改变数据。

DOUT:ADC采集到的模拟串行信号,输入FPGA转换为并行数字信号Data,FPGA在上升沿采样,在下降沿改变数据。

一帧包含 16 个SCLK上升沿,前三个处于采样模式track,后13个为保持模式hold。下降沿 1~4 为前导零,5~16 为输出转换结果。(SCLK第一个下降沿自动进入采样模式)

 三、线性序列机设计接口时序

线性序列机:计数器每个计数值对应一个时间,按顺序执行,SCLK每个下降沿、上升沿应该做什么是已知的。区别于状态机

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
STM32F103 内部 ADC 的时序过程主要涉及以下几个步骤: 1. 初始化 ADC 控制器 2. 配置 ADC 通道和采样时间 3. 开始转换 4. 等待转换完成 5. 读取转换结果 下面逐步讲解这些步骤的具体细节。 1. 初始化 ADC 控制器 首先需要初始化 ADC 控制器。具体实现方法如下: ```c RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); // 使能 ADC1 时钟 ADC_InitTypeDef ADC_InitStructure; ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; // 独立模式 ADC_InitStructure.ADC_ScanConvMode = DISABLE; // 关闭扫描模式 ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; // 关闭连续转换模式 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; // 不使用外部触发 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; // 数据右对齐 ADC_InitStructure.ADC_NbrOfChannel = 1; // 转换通道数量 ADC_Init(ADC1, &ADC_InitStructure); // 初始化 ADC1 ``` 2. 配置 ADC 通道和采样时间 然后需要配置 ADC 通道和采样时间。具体实现方法如下: ```c ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_28Cycles5); // 配置 ADC1 通道0为转换通道,采样时间为28.5个周期 ``` 3. 开始转换 接下来开始进行转换。具体实现方法如下: ```c ADC_Cmd(ADC1, ENABLE); // 使能 ADC1 ADC_ResetCalibration(ADC1); // 重置校准寄存器 while(ADC_GetResetCalibrationStatus(ADC1)); // 等待校准寄存器重置完成 ADC_StartCalibration(ADC1); // 开始校准 while(ADC_GetCalibrationStatus(ADC1)); // 等待校准完成 ADC_SoftwareStartConvCmd(ADC1, ENABLE); // 开始软件转换 ``` 4. 等待转换完成 转换完成后会触发 ADC 中断或者 DMA 传输完成中断。可以在中断回调函数中读取转换结果。如果不使用中断和 DMA,可以通过轮询的方式等待转换完成。具体实现方法如下: ```c while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); // 等待转换完成 ``` 5. 读取转换结果 转换完成后需要读取转换结果。具体实现方法如下: ```c uint16_t adc_value = ADC_GetConversionValue(ADC1); // 读取转换结果 ``` 以上就是 STM32F103 内部 ADC 的时序过程。需要注意的是,具体实现可能因为不同的开发板或者使用场景而有所不同,上述代码仅供参考。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值