发新帖本帖赏金 20.00元(功能说明)我要提问
12下一页
返回列表
[数据转换器-信号链]

应坛友求助,开贴讨论STM32F103高速控制ADS8363的题目。

[复制链接]
7125|39
手机看帖
扫描二维码
随时随地手机跟帖
玄德|  楼主 | 2017-11-1 22:14 | 显示全部楼层 |阅读模式
本帖最后由 玄德 于 2017-11-1 22:37 编辑


应坛友求助,开贴讨论STM32F103高速控制ADS8363的题目。     @qmmdzd     
类似的帖子有这么几个:
https://bbs.21ic.com/forum.php?mod=viewthread&tid=1170466&page=1#pid8853734
https://bbs.21ic.com/icview-2028914-1-1.html
https://bbs.21ic.com/icview-1864650-1-1.html
https://bbs.21ic.com/icview-1703588-1-1.html

类似的芯片还有ADS7263, ADS7223。可能还有其他型号。

欢迎各位大侠、坛友,和有类似需求的坛友参与。   @airwill     @xyz549040622      @永远的牛虻




相关帖子

玄德|  楼主 | 2017-11-1 22:19 | 显示全部楼层
本帖最后由 玄德 于 2017-11-2 21:42 编辑

坛友的需求基本是这样:
STM32F103控制ADS8363,高速控制AD转换和数据读取,速度尽可能高;(所以,IO口模拟时序的方法,不在讨论之列。)
而且,A、B两路信号是有关联的,所以需要同时采集,而不是只采集其中一路;以1M左右或者几百K的高速采样率,只需要采集几个毫秒,存储下来,就可以了。后续处理不考虑。

为了方便,上传一下芯片手册,
STM32的手册太大,没法传。

ads8363.pdf (1.41 MB)

使用特权

评论回复
玄德|  楼主 | 2017-11-1 22:25 | 显示全部楼层
本帖最后由 玄德 于 2017-11-2 00:13 编辑

首先考察一下 ADS8363。

这个芯片有 HALF CLOCK 和 FULL CLOCK两种工作模式,
后者需要更多的时钟,速度自然偏慢,所以暂时不考虑。
只看 HALF CLOCK 模式。另外,CID=0的方式下数据是18位,也暂时不考虑,只考虑CID=1,16位的情况。

无标题.png

16位AD,SPI串行接口,有三个特殊之处:
1、转换一次,需要至少18个时钟脉冲,——这和SPI常见的8位、16位模式不同,
2、数据的串行输出所需的时钟,和AD转换时钟是共用的。
3、A、B通道分别从SDOA、SDOB管脚输出。

这个时序,显然用CPLD/FPGA控制最合适。但这是另一个背景,这里不考虑。深入考虑一下就会发现,用STM32F103来控制,确实有难度。
讨论的目的是:这样做是否可行?如果可行,怎么做?

基本信号:

CS应当可以直连地线,固定为低电平。

CONVST负责启动芯片内部的转换逻辑,RD信号负责启动芯片SPI接口工作,
二者各司其责,而且特征相同,
如果其他方面允许,可以把二者短接起来,用一个CPU信号来控制,当然要同时满足双方的时序。这时视为一个管脚,RD。如果其他方面有要求,那只能分开。

BUSY信号可以无视,前提是CPU提供足够数量的时钟,其他时序正确无误。

比较难的是CLOCK、RD、SDI、SDOA、SDOB,这几个信号是有时序要求的,需要统筹考虑。







使用特权

评论回复
玄德|  楼主 | 2017-11-1 23:00 | 显示全部楼层
本帖最后由 玄德 于 2017-11-2 00:04 编辑

在读取数据期间,考虑到位同步问题,
CLOCK必须使用SPI接口的时钟,SCK,
也就是说,至少在读取数据的时候,SCK管脚必须与CLOCK管脚直接连接,或间接连接。
这点应当没有疑问。

随之而来的问题是:AD转换所需要的、额外的2个时钟脉冲,怎么产生?
不同的处理方法,都意味着整套方案必须正确、合理。“整套”,这一点很重要。
可能性比较多。





使用特权

评论回复
xyz549040622| | 2017-11-2 00:37 | 显示全部楼层
玄德继续更新,明天详细拜读。

使用特权

评论回复
airwill| | 2017-11-2 06:54 | 显示全部楼层
作为整套问题, 你还得讲一下那些信号中, 哪些是输入, 哪些又是输出.
这两个时钟, 是固定不变的, 还是不确定的?

使用特权

评论回复
玄德|  楼主 | 2017-11-2 10:52 | 显示全部楼层
本帖最后由 玄德 于 2017-11-2 11:36 编辑

上午有空,看了两三个小时手册。
还在构思。
用STM32控制确实有难度。

@qmmdzd
希望明确一下你的需求。
1、输入信号,A、B各一路,需要同步采样,对吧?
2、是全差分,还是伪差分(单端)?
3、最低采样速度要求多少,期望多少?看你其他帖子曾经说过,300K4、你目前采用什么方法,达到什么程度,最好细说一下。



使用特权

评论回复
玄德|  楼主 | 2017-11-2 12:02 | 显示全部楼层

多种情况综合考虑,形成这样的思路:

使用HALF CLOCK方式,RD与CONVST捆在一起。
1、定时器X的某个通道产生脉冲,下降沿触发DMA,启动SPI接收数据,2、SPI设为8位,每三个脉冲为一组,产生24个脉冲,同时读到三个字节数据;

3、该脉冲送给定时器Y,每计够三个脉冲定时器翻转一次,产生RD/CONVST信号。

(下午再细化。)

使用特权

评论回复
qmmdzd| | 2017-11-2 13:28 | 显示全部楼层
感谢玄德开这个帖子,我现在是用STM32模拟SPI方式控制的,BUSY信号不管,采用的是半时钟模式,RD和CONVST连在一起使用,两路信号输入,双ADC模式同时采集,现在速度能到300K左右,采集的信号还不稳定

使用特权

评论回复
qmmdzd| | 2017-11-2 13:55 | 显示全部楼层
玄德 发表于 2017-11-2 10:52
上午有空,看了两三个小时手册。
还在构思。
用STM32控制确实有难度。

想要采集的速度尽量达到这个芯片的最高速度,全差分模式,双ADC各一路同步采集,按手册上可以选择的是半时钟模式,RD和CONVST连在一起使用,M0和M1都接低,输出为SDOA和SDOB,配置寄存器config分三步走,第一步ADC1基准电压,写入0x1002,0x03ff;第二步配置ADC2内部基准电压0x1005,0x03ff;第三步更新整个寄存器0x1020  我理解的是这些

使用特权

评论回复
玄德|  楼主 | 2017-11-2 15:07 | 显示全部楼层
qmmdzd 发表于 2017-11-2 13:55
想要采集的速度尽量达到这个芯片的最高速度,全差分模式,双ADC各一路同步采集,按手册上可以选择的是半 ...


我比较关心的是:
1、CLOCK怎么产生的?
2、SDI、SDOA、SDOB、RD、CONVST,都靠IO模拟吗?
3、300K,是指这样模拟的采样速度?

使用特权

评论回复
qmmdzd| | 2017-11-2 15:16 | 显示全部楼层
玄德 发表于 2017-11-2 15:07
我比较关心的是:
1、CLOCK怎么产生的?
2、SDI、SDOA、SDOB、RD、CONVST,都靠IO模拟吗?

对的 所有的信号全是IO模拟产生的  后来调试了一段时间速度也提不上来

使用特权

评论回复
玄德|  楼主 | 2017-11-2 15:22 | 显示全部楼层
qmmdzd 发表于 2017-11-2 15:16
对的 所有的信号全是IO模拟产生的  后来调试了一段时间速度也提不上来


IO模拟,居然能达到300K的效果?
有点怀疑。

有没有实际测过,CLOCK管脚的脉冲频率大概有多少?

使用特权

评论回复
qmmdzd| | 2017-11-2 15:33 | 显示全部楼层
玄德 发表于 2017-11-2 15:22
IO模拟,居然能达到300K的效果?
有点怀疑。

这个我没有实际测试,是一个同学软件模拟后告诉我的最快速度,我不确定  我自己写的程序只到了10K

使用特权

评论回复
airwill| | 2017-11-2 16:02 | 显示全部楼层
本帖最后由 airwill 于 2017-11-2 16:03 编辑

我们最后讨论硬件 SPI 方式, 而不是软件模拟方式.
没有时间去细细读那厚厚的手册, 希望看明白的朋友, 先回答一下我上面的问题.

使用特权

评论回复
玄德|  楼主 | 2017-11-2 16:15 | 显示全部楼层
本帖最后由 玄德 于 2017-11-2 16:17 编辑
airwill 发表于 2017-11-2 16:02
我们最后讨论硬件 SPI 方式, 而不是软件模拟方式.
没有时间去细细读那厚厚的手册, 希望看明白的朋友, 先回 ...


CONVST是输入,启动信号,上升沿启动AD转换;
RD是输入,读取信号,在下降沿的时候,芯片把数据输出到SDOA、SDOB管脚;
BUSY是输出,高电平表示内部忙、正在转换;

SDI是SPI的通信接口,相当于 MOSI端;
SDO是MISO端。

其他还是要看手册。
具体的使用方式、读写模式,我也没吃透。


使用特权

评论回复
crazyhertz007| | 2017-11-2 16:18 | 显示全部楼层
期待更新中,谢谢分享。。。

使用特权

评论回复
玄德|  楼主 | 2017-11-2 16:39 | 显示全部楼层
本帖最后由 玄德 于 2017-11-2 17:28 编辑
qmmdzd 发表于 2017-11-2 15:33
这个我没有实际测试,是一个同学软件模拟后告诉我的最快速度,我不确定  我自己写的程序只到了10K ...

如果是这样,那我就敢不信300K了。
既然IO模拟的,测一下频率应当很简单。

我现在的思路是:
使用HALF CLOCK方式,RD与CONVST捆在一起,
用SPI接口的SCK作为CLOCK,
那么读三次,可以读出三字节数据,同时也产生24个CLOCK脉冲,
而HALF CLOCK模式一次转换需要20~21个脉冲,24个就够用了,多出来的芯片会无视(这一点很巧妙),
设置SPI的时钟为18MHz,24个时钟会耗时1.4微秒,
即使达不到1M采样率,也可以到600~700K。如果SPI时钟设置为24MHz,正好可以达到1M采样率。但时钟随意设置,可能做不到。
如果再设高一些,就不能满足芯片时序要求了。

上面是大思路。






使用特权

评论回复
玄德|  楼主 | 2017-11-2 16:52 | 显示全部楼层
本帖最后由 玄德 于 2017-11-2 21:16 编辑

细说一下SPI的操作过程,是这样:

816581686076084441.jpg

如上图,用一个定时器产生PWM脉冲,脉冲的下降沿触发DMA,启动SPI传输;
传输完成后,SPI的Rx事件再次触发DMA,把接收的数据转移到缓冲区。

这整个过程,我用STM32F407实现过,效果不错,纯硬件过程,速度是最快的了。
但F103的DMA功能弱一些,能否实现,还需要验证一下。
现在先假设可以做到。




使用特权

评论回复
玄德|  楼主 | 2017-11-2 17:08 | 显示全部楼层
本帖最后由 玄德 于 2017-11-2 21:46 编辑

前面说的PWM波,只能用于启动SPI,
而RD/CONVST信号,需要每三个PWM脉冲才出现一次。
或者说,用一个RD/CONVST脉冲,触发出三个PWM脉冲。

如果做到这一点,整个硬件流就齐了。

但是,如何用F103的硬件实现呢?
也许,定时器的主、从、级联功能可以组合出来;这需要对STM32的定时器非常熟悉。

如果用硬件电路配合,也许能做到这一点:另开一路定时器,对PWM脉冲进行计数,为1时输出高电平,其他数值为低电平,
用此高电平接通一个数字开关。
如下图:

348336687249041108.jpg


如果做不到,可以考虑用IO模拟,
IO模拟出RD/CONVST脉冲,
同时启动上一层的硬件流,即启动PWM波、读数据、转移数据的过程,
转移数据的DMA执行次数设为3,在结束时返回第一步,产生下一个RD/CONVST脉冲。也就是说,能用硬件尽量用硬件实现,有困难才用软件,这也是折中的方法,不能做到最快,也算比较快。


使用特权

评论回复
发新帖 本帖赏金 20.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:有事请找 xuander

150

主题

5841

帖子

43

粉丝