OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 11625|回复: 3

stm32自带AD采样速率,如何提高采集速度,谢谢

[复制链接]

14

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
144
金钱
144
注册时间
2015-3-24
在线时间
20 小时
发表于 2016-3-9 11:10:01 | 显示全部楼层 |阅读模式
1金钱
在原子哥的ADC实验基础上,实行连续采集,并保存在txt文件中,每次保存一次数据,记录一下时间,发现一秒钟采集3个数据,保存效果如下:

2016-01-02 00:00:03 0.004v
2016-01-02 00:00:03 0.008v
2016-01-02 00:00:03 0.003v
2016-01-02 00:00:04 0.004v
2016-01-02 00:00:04 0.005v
2016-01-02 00:00:04 0.004v
2016-01-02 00:00:05 0.007v
2016-01-02 00:00:05 0.007v
2016-01-02 00:00:05 0.008v


想知道stm32自带的3个ADC采样速率是多少?
如何能提高采集速度?
看资料中提到转换速率可以达到0.41μs,采集数率可以达到μs级吗?

或者想实现高速度采集,必须外部新连接一个AD,来达到目的。
谢谢~~

最佳答案

查看完整内容[请看2#楼]

多个adc同时工作,st官方貌似有这样的例子,可以达到单个ADC的几倍.
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-3-9 11:10:02 | 显示全部楼层
多个adc同时工作,st官方貌似有这样的例子,可以达到单个ADC的几倍.
回复

使用道具 举报

3

主题

548

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1383
金钱
1383
注册时间
2015-2-3
在线时间
197 小时
发表于 2016-3-10 11:17:38 | 显示全部楼层
STM32F4的官方三ADC采样,DMA读取例子
[mw_shl_code=c,true]#define ADC_CHANNEL              ADC_Channel_13
#define ADC123_CHANNEL_GPIO_CLK  RCC_AHB1Periph_GPIOC
#define GPIO_PIN                 GPIO_Pin_3
#define GPIO_PORT                GPIOC
#define DMA_CHANNELx             DMA_Channel_0
#define DMA_STREAMx              DMA2_Stream0
#define ADC_CDR_ADDRESS          ((uint32_t)0x40012308)
u32 uhADCTripleConvertedValue=0;
//ADC三通道交错采样,官方资料称能达到8.4Msps,加入DMA中断之后实测约1.4M
//ADC1-CH13-PC3
//DMA2-CH0-STREAM0
//使用前需使用ADC_SoftwareStartConv(ADC1);
/*
● 第1 个请求:ADC_CDR[31:0] = ADC2_DR[15:0] | ADC1_DR[15:0]
● 第2 个请求:ADC_CDR[31:0] = ADC1_DR[15:0] | ADC3_DR[15:0]
● 第3 个请求:ADC_CDR[31:0] = ADC3_DR[15:0] | ADC2_DR[15:0]
● 第4 个请求:ADC_CDR[31:0] = ADC2_DR[15:0] | ADC1_DR[15:0]
*/
void ADC_TripleInterleaved(void)
{
        GPIO_InitTypeDef       GPIO_InitStructure;
  DMA_InitTypeDef        DMA_InitStructure;
  ADC_InitTypeDef        ADC_InitStructure;
  ADC_CommonInitTypeDef  ADC_CommonInitStructure;  
//  NVIC_InitTypeDef NVIC_InitStructure;
       
  /* Enable peripheral clocks *************************************************/
  RCC_AHB1PeriphClockCmd( ADC123_CHANNEL_GPIO_CLK , ENABLE);
  RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_DMA2 , ENABLE);
  RCC_APB2PeriphClockCmd( RCC_APB2Periph_ADC1 , ENABLE);
  RCC_APB2PeriphClockCmd( RCC_APB2Periph_ADC2 , ENABLE);
  RCC_APB2PeriphClockCmd( RCC_APB2Periph_ADC3 , ENABLE);  

  /* Configure ADC Channel 12 pin as analog input *****************************/
  GPIO_InitStructure.GPIO_Pin = GPIO_PIN;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
  GPIO_Init(GPIO_PORT, &GPIO_InitStructure);

  /* DMA2 Stream0 channel0 configuration **************************************/
  DMA_InitStructure.DMA_Channel = DMA_CHANNELx;  
  DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC_CDR_ADDRESS;
  DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&uhADCTripleConvertedValue;
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
  DMA_InitStructure.DMA_BufferSize = 3;//改动
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//改动
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;//改动
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;//改动
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;         
  DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
  DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
  DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
  DMA_Init(DMA_STREAMx, &DMA_InitStructure);

  /* DMA2_Stream0 enable */
  DMA_Cmd(DMA_STREAMx, ENABLE);

  /* ADC Common configuration *************************************************/
  ADC_CommonInitStructure.ADC_Mode = ADC_TripleMode_Interl;//改动
  ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
  ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_2;  //改动
  ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;
  ADC_CommonInit(&ADC_CommonInitStructure);

  /* DMA mode 2 is used in interleaved mode in 12-bit resolutions *************/
  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
  
  /* ADC1 regular channel 13 configuration ************************************/
  ADC_InitStructure.ADC_ScanConvMode = DISABLE;
  ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
  ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  ADC_InitStructure.ADC_NbrOfConversion = 1;
  ADC_Init(ADC1, &ADC_InitStructure);
  
  /* ADC1 regular channel 13 configuration */
  ADC_RegularChannelConfig(ADC1, ADC_CHANNEL, 1, ADC_SampleTime_3Cycles);
  
  /* Enable ADC1 DMA */
  ADC_DMACmd(ADC1, ENABLE);

  /* ADC2 regular channel 13 configuration ************************************/
  ADC_Init(ADC2, &ADC_InitStructure);
  /* ADC2 regular channel13 configuration */
  ADC_RegularChannelConfig(ADC2, ADC_CHANNEL, 1, ADC_SampleTime_3Cycles);

  /* ADC3 regular channel 13 configuration ************************************/
  ADC_Init(ADC3, &ADC_InitStructure);
  /* ADC3 regular channel13 configuration */
  ADC_RegularChannelConfig(ADC3, ADC_CHANNEL, 1, ADC_SampleTime_3Cycles);

  /* Enable DMA request after last transfer (multi-ADC mode) ******************/
  ADC_MultiModeDMARequestAfterLastTransferCmd(ENABLE);

  /* Enable ADC1 **************************************************************/
  ADC_Cmd(ADC1, ENABLE);

  /* Enable ADC2 **************************************************************/
  ADC_Cmd(ADC2, ENABLE);

  /* Enable ADC3 **************************************************************/
  ADC_Cmd(ADC3, ENABLE);

        NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream0_IRQn;                                                                        //使能TIM中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;                //抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;                                                //子优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                                                        //使能中断
NVIC_Init(&NVIC_InitStructure);
        DMA_ITConfig(DMA2_Stream0,DMA_IT_TC,ENABLE);
}[/mw_shl_code]
回复

使用道具 举报

4

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2013-9-5
在线时间
22 小时
发表于 2017-3-2 09:23:14 | 显示全部楼层
如果要固定采样率的话就用定时器中断,时间到了采集一次;如果要最大速率的话就在定时器中断中打开ad中断,ad中断到了再继续采集
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-10 00:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表