发新帖我要提问
12
返回列表
打印
[应用相关]

ADC问题

[复制链接]
楼主: 171795276
手机看帖
扫描二维码
随时随地手机跟帖
21
171795276|  楼主 | 2009-7-9 09:17 | 只看该作者 回帖奖励 |倒序浏览

DMA

参考手册中,关于AD使用DMA传送数据这样描述:

DMA:直接数据访问模式
该位由软件设置和清除。详见DMA控制器章节。
0:不使用DMA模式
1:使用DMA模式
注:在多于一个ADC的器件中,只有ADC1能产生DMA请求。

要使用ADC1、ADC3两个,不能用两通道的DMA分别传送两个ADC的数据么?

使用特权

评论回复
22
香水城| | 2009-7-9 09:50 | 只看该作者

回21楼:对不起,这是翻译时的疏忽

那个"注"的原文是:Note: Only ADC1 and ADC3 can generate a DMA request. 只有ADC1和ADC2能产生DMA请求。

第10.8节的表述是正确的:

使用特权

评论回复
23
171795276|  楼主 | 2009-7-13 10:36 | 只看该作者

如何实现在我需要的时刻采样

情况是这样的:
1)ADC时钟9M,TIM1时钟72M经18分频计62500次得到156.25us的定时时间,TIM2时钟36M经9分频计4000次得1ms的定时时间。
2)总的周期是60ms,其中要采20路信号,需要156.25us采20通道一次样,20ms内每路信号采128次。
3)我设置的每次每路AD采样时间是(55.5+12.5)*(1/(9M)=7.5(5无限循环)采20路需要的总时间=20*7.5(5无限循环)=151.111111111111111111us

我现在设置成 单次连续模式,担心的问题是只采了151us采不了完整的波形。

使用特权

评论回复
24
香水城| | 2009-7-13 10:57 | 只看该作者

STM32的每个ADC模块最多只有16个外部通道,你需要使用2个ADC模

STM32的每个ADC模块最多只有16个外部通道,你需要使用2个ADC模块才能实现20路信号的采集,这样你使用20路平均的计算方法就不对了。

比如你安排ADC1处理16路信号,ADC3处理剩余的4路信号,你需要按16路平均计算一次和按4路平均再计算一次。

使用特权

评论回复
25
171795276|  楼主 | 2009-7-13 15:19 | 只看该作者

使用了ADC1、ADC3,,,,,,

1)ADC1用了11通道外部加上一通道内部的参考电压共12路,ADC3用了9通道;
2)每通道都得采128个点,一样得定156.25us采一次

您是指:如果启动ADC1那么只ADC1转换12路,启动ADC3同理?


,,,,,,,,,,,

使用特权

评论回复
26
香水城| | 2009-7-13 16:00 | 只看该作者

是的

建议你每个ADC模块各安排10个通道,这样可以2个ADC模块使用一个定时基准进行采样。

使用特权

评论回复
27
171795276|  楼主 | 2009-7-13 17:03 | 只看该作者

电压信号有11路,电流信号9路

电压信号11路,电流9路,ADC1采电压,ADC3采电流;

我能这样采么:
1)TIM1定156.25us时间中,进入定时器处理函数后复位ADC_DR的EOC位,再启动ADC1;
2)当发现状态寄存器ADC_DR的EOC位被置1时启动ADC3,然后复位EOC位;
3)如此依次重复步骤1)、2)来采20通道的信号。

使用特权

评论回复
28
香水城| | 2009-7-13 18:40 | 只看该作者

如果你要求每156.25us对每个通道采样一次,可以使用定时器触

设置ADC为单次+扫描+定时器触发+DMA,例如定时器设置为10us,则每10us定时器触发一次转换,这样第1次触发时转换第1个通道,第2次触发时转换第2个通道,......,第11次触发时转换第11个通道,每个通道开始转换的时间间隔就是定时器设置的10us;即每个通道转换需要(55+12.5)/(1/9M)=7.556us,再等待2.444u之后开始下一个通道的转换。

这样总共只需要10x10+7.556=107.556us就可以转换完11个通道,另一个ADC模块可以照此操作,2个模块完全并行且互不干扰;因此2个模块同时操作可以轻松地在107.556us转换完20个通道,大大少于156.25us。

使用特权

评论回复
29
171795276|  楼主 | 2009-7-13 22:46 | 只看该作者

谢谢香城主,这样一个周期能采得完整的波形么?

1)ADC1的这个内部电压参考信号,如果我要用到电压校准,是否一定得转换这个内部信号呢?
2)采的电压、电流信号都是周期为20ms的正弦波,希望一周采128个点,如果采电压信号11路外部+1路内部参考信号,对于每一路信号就是每隔13.0208333...3...us(20ms/(128*12))采一个点;
对于9路电流来说同理推得;
怎样设置能保证恰好在这段时间内采到20通道完整的信号呢;
3)您上面讲到两个ADC可以并行工作,我应该把它们两个设置成双ADC模式从而让它们能并行的转换么?
   也就是在ADC配置时这一句应该这样赋值么:
ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult;//工作在双ADC模式下

使用特权

评论回复
30
freefish| | 2009-7-13 22:59 | 只看该作者

有问题

28楼香斑竹所说,与我的理解有偏差。据我试验得知,一旦是设定为扫描模式,即使是非连续转换,触发后也是全部转换完才产生EOC信号,转换结果需要用DMA传到RAM里。以下是部分设置:
ADC_DeInit(ADC1);//DMA传输后的采样表,第0个高16位是IA,低16位是IB;第1个高16位是IC,低16位是3I0
  ADC_DeInit(ADC2);//第3个高16位是IA,低16位是5V采集,判断DMA通道错位后的纠正。
  ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult;
  ADC_InitStructure.ADC_ScanConvMode = ENABLE;
  ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;

使用特权

评论回复
31
171795276|  楼主 | 2009-7-14 14:04 | 只看该作者

晕了

,,,,, 
搞不清楚了,
我得好好看看 手册,
,,,,,

使用特权

评论回复
32
香水城| | 2009-7-14 14:55 | 只看该作者

谢谢,我搞混了,30楼正确

对不起咯~~~~

使用特权

评论回复
33
ijk| | 2009-7-14 15:28 | 只看该作者

我觉得

  我觉得,两位说的都没错,用定时器触发单次转换,或者使用扫描模式都可以。

使用特权

评论回复
34
171795276|  楼主 | 2009-7-14 15:36 | 只看该作者

谢谢,设置ADC为单次+扫描+定时器触发+DMA

按照香城主的,设置ADC为单次+扫描+定时器触发+DMA,如下这样安排可以么:

1)ADC1 ADC3每通道采样一次时间=(41.5+12.5)*(1/9M)=6us;
2)定时156.25us,
进入定时处理函数后先复位ADC_DR的EOC位,再启动ADC1,ADC1转换所有通道的时间T1=6us*12=72us;
当检测到ADC_DR的EOC位被置位的时候,启动ADC3并复位ADC_DR的EOC位,ADC3所有通道转换所用时间T2=6*9=54us
总的时间T=T1+T2+语句判断时间=72us+54us+数us >= 126us;
3)剩下的时间等待到156.25us,进入下一次转换,直到采完所有通道的128个点,开始计算每通道的值。

使用特权

评论回复
35
wenzj12345| | 2012-3-14 11:23 | 只看该作者
正需要··

使用特权

评论回复
36
vrary| | 2012-4-10 14:21 | 只看该作者
mark

使用特权

评论回复
37
Zacking| | 2014-12-13 11:28 | 只看该作者
mark

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则