OpenEdv-开源电子网

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

STM32的ADC采集10KHZ的信号

[复制链接]

12

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
106
金钱
106
注册时间
2014-10-17
在线时间
3 小时
发表于 2016-5-30 17:33:31 | 显示全部楼层 |阅读模式
10金钱
本帖最后由 军霸之上 于 2016-5-31 21:28 编辑

我现在需要用STM32F103ZET6的ADC采集1路10KHZ的信号,我目前用的是ADC+DMA采集(用定时器2来触发ADC),用USART+DMA发送;我的思路是:信号时10K,每个周期采集20个点,因此我的AD的采样速率要达到200K,由5us=(12.5+采样周期)/12M,得采样周期=47.5,这里我使用采样周期=41.5;
我把定时器2的周期定为5us(即没5us就触发AD采集1次),另外我设用作采集的DMA的存储器的数组宽度为30(数据是16位的),每采集完30个数据时DMA中断触发串口发送,
现在面临两个问题是:(1)采集到的数据不但不准(用来采集3.3V和0V的时候,有时候数据不准,但都在50(最大为4096)以内,(2)而且1秒钟内采集到的数据只有1K左右(5us就触发1次采集,应该1秒能采到很多才对啊)

下面是主要的配置程序,中文部分乱码,大神帮忙看看喽

AD的配置void  Adc_Init(void)
{   
        //Ïè3õê¼»ˉIO¿ú
         RCC->APB2ENR|=1<<2;    //ê1&#196;üPORTA&#191;úê±&#214;ó
        GPIOA->CRL&=0XFFFFFF0F;//PA1 anologê&#228;è&#235;
        //í¨μà10/11éè&#214;&#195;                        
        RCC->APB2ENR|=1<<9;    //ADC1ê±&#214;óê1&#196;ü         
        RCC->APB2RSTR|=1<<9;   //ADC1&#184;′&#206;&#187;
        RCC->APB2RSTR&=~(1<<9);//&#184;′&#206;&#187;&#189;áê&#248;            
        RCC->CFGR&=~(3<<14);   //·&#214;&#198;μòò×ó&#199;&#229;á&#227;        &#182;&#212;APB2£¨56M£&#169; 4·&#214;&#198;μμ&#195;μ&#189;ADCμ&#196;ê§×ù&#206;a14M
        //SYSCLK/DIV2=12M ADCê±&#214;óéè&#214;&#195;&#206;a12M,ADC×&#238;′óê±&#214;ó2&#187;&#196;ü3&#172;1y14M!
        //·&#241;&#212;ò&#189;&#171;μ&#188;&#214;&#194;ADC×&#188;è·&#182;è&#207;&#194;&#189;μ!
        RCC->CFGR|=2<<14;  //&#213;aà&#239;éè&#214;&#195;AD×a&#187;&#187;&#198;÷μ&#196;·&#214;&#198;μê±&#214;ó£&#172;&#212;úRCC_CFGR&#188;&#196;′&#230;&#198;÷&#214;D£&#172;ADCê±&#214;óóé&#184;&#223;&#203;ùAPB2ê±&#214;ó&#190;-2£&#172;4 £&#172;6 £&#172;8·&#214;&#198;μoó&#187;&#241;μ&#195;
        ADC1->CR1&=0XF0FFFF;   //1¤×÷&#196;£ê&#189;&#199;&#229;á&#227;
        ADC1->CR1|=0<<16;      //&#182;àá¢1¤×÷&#196;£ê&#189;  
        ADC1->CR1&=~(1<<8);    //·&#199;é¨&#195;è&#196;£ê&#189;         
        ADC1->CR2|=0<<1;    //μ¥′&#206;×a&#187;&#187;&#196;£ê&#189;
        ADC1->CR2|=1<<8;   //&#198;&#244;ó&#195;DMA
        ADC1->CR2&=~(7<<17);           
        ADC1->CR2|=3<<17;           //&#182;¨ê±&#198;÷2μ&#196;CC2ê&#194;&#188;t
        ADC1->CR2|=1<<20;      //&#212;êDíía2&#191;ê&#194;&#188;t′¥·¢
        ADC1->CR2&=~(1<<11);   //óò&#182;&#212;&#198;&#235;         
        //ADC1->CR2|=1<<23;      //ê1&#196;ü&#206;&#194;&#182;è′&#171;&#184;D&#198;÷
        ADC1->SQR1&=~(0XF<<20);
        ADC1->SQR1|=0<<20;     //  1&#184;&#246;×a&#187;&#187;&#212;ú1&#230;&#212;òDòáD&#214;D ò2&#190;íê&#199;&#214;&#187;×a&#187;&#187;1&#230;&#212;òDòáD1                        



  ADC1->SQR3&=0XFFFFFFE0;//1&#230;&#212;òDòáD1 í¨μàch///////////////////////////////////////////////////////////////////
        ADC1->SQR3|=ADC_CH1;        /////í¨μà1///////////////////////////////////////////////////////////////////////////////////////

        //éè&#214;&#195;í¨μà1μ&#196;2é&#209;ùê±&#188;&#228;
        ADC1->SMPR2&=~(7<<3);  //í¨μà12é&#209;ùê±&#188;&#228;&#199;&#229;&#191;&#213;         
         ADC1->SMPR2|=5<<3;     //í¨μà1  55.5&#214;ü&#198;ú

        ADC1->CR2|=1<<0;           //&#191;a&#198;&#244;AD×a&#187;&#187;&#198;÷         
        ADC1->CR2|=1<<3;       //ê1&#196;ü&#184;′&#206;&#187;D£×&#188;  
        while(ADC1->CR2&1<<3); //μè′yD£×&#188;&#189;áê&#248;                          
    //&#184;&#195;&#206;&#187;óéèí&#188;téè&#214;&#195;2¢óéó2&#188;t&#199;&#229;3y&#161;£&#212;úD£×&#188;&#188;&#196;′&#230;&#198;÷±&#187;3&#245;ê&#188;&#187;ˉoó&#184;&#195;&#206;&#187;&#189;&#171;±&#187;&#199;&#229;3y&#161;£                  
        ADC1->CR2|=1<<2;        //&#191;a&#198;&#244;ADD£×&#188;           
        while(ADC1->CR2&1<<2);  //μè′yD£×&#188;&#189;áê&#248;
        //&#184;&#195;&#206;&#187;óéèí&#188;téè&#214;&#195;ò&#212;&#191;aê&#188;D£×&#188;£&#172;2¢&#212;úD£×&#188;&#189;áê&#248;ê±óéó2&#188;t&#199;&#229;3y  
        //ADC1->CR2|=1<<22; //&#198;&#244;&#182;ˉ1&#230;&#212;ò×a&#187;&#187;í¨μà///////1&#216;±&#213;1&#230;&#212;ò&#198;&#244;&#182;ˉ£&#172;òò&#206;a&#213;aà&#239;ê&#199;óé&#182;¨ê±&#198;÷2μ&#196;ê&#194;&#188;tà′′¥·¢μ&#196;
}                                 


用于AD采集的DMA配置

void ADC_DMA_Config(DMA_Channel_TypeDef*DMA_CHx,u32 cpar,u32 cmar,u16 cndtr)
{
        RCC->AHBENR|=1<<0;                        //&#191;a&#198;&#244;DMA1ê±&#214;ó
        delay_ms(5);                                //μè′yDMAê±&#214;ó&#206;è&#182;¨
        DMA_CHx->CPAR=cpar;                  //DMA1 íaéèμ&#216;&#214;·
        DMA_CHx->CMAR=(u32)cmar;         //DMA1,′&#230;′¢&#198;÷μ&#216;&#214;·
        ADC_DMA1_MEM_LEN=cndtr;              //±£′&#230;DMA′&#171;ê&#228;êy&#190;Yá&#191;
        DMA_CHx->CNDTR=cndtr;            //DMA1,′&#171;ê&#228;êy&#190;Yá&#191;
        DMA_CHx->CCR=0X00000000;        //&#184;′&#206;&#187;
        DMA_CHx->CCR|=1<<1;     //&#212;êDíDMA′&#171;ê&#228;íê&#214;D&#182;&#207;
        DMA_CHx->CCR|=0<<4;                  //′óíaéè&#182;á
        DMA_CHx->CCR|=1<<5;                  //2&#187;&#214;′DD&#209;-&#187;·&#196;£ê&#189;
        DMA_CHx->CCR|=0<<6;                 //íaéèμ&#216;&#214;··&#199;&#212;&#246;á&#191;&#196;£ê&#189;
        DMA_CHx->CCR|=1<<7;                  //′&#230;′¢&#198;÷&#212;&#246;á&#191;&#196;£ê&#189;
        DMA_CHx->CCR|=1<<8;                  //íaéèêy&#190;Y&#191;í&#182;è&#206;a16&#206;&#187;
        DMA_CHx->CCR|=1<<10;                 //′&#230;′¢&#198;÷êy&#190;Y&#191;í&#182;è16&#206;&#187;
        DMA_CHx->CCR|=1<<12;                 //&#214;Dμèó&#197;&#207;è&#188;&#182;
        DMA_CHx->CCR|=0<<14;                 //·&#199;′&#230;′¢&#198;÷μ&#189;′&#230;′¢&#198;÷&#196;£ê&#189;        
  MY_NVIC_Init(1,3,DMA1_Channel1_IRQn ,2);
}


用于串口发送的DMA设置
void MYDMA_Config(DMA_Channel_TypeDef*DMA_CHx,u32 cpar,u32 cmar,u16 cndtr)
{
        RCC->AHBENR|=1<<0;                        //&#191;a&#198;&#244;DMA1ê±&#214;ó
        delay_ms(5);                                //μè′yDMAê±&#214;ó&#206;è&#182;¨
        DMA_CHx->CPAR=cpar;                  //DMA1 íaéèμ&#216;&#214;·
        DMA_CHx->CMAR=(u32)cmar;         //DMA1,′&#230;′¢&#198;÷μ&#216;&#214;·
        DMA1_MEM_LEN=cndtr;              //±£′&#230;DMA′&#171;ê&#228;êy&#190;Yá&#191;
        DMA_CHx->CNDTR=cndtr;            //DMA1,′&#171;ê&#228;êy&#190;Yá&#191;
        DMA_CHx->CCR=0X00000000;        //&#184;′&#206;&#187;
        DMA_CHx->CCR|=1<<1;     //&#212;êDíDMA′&#171;ê&#228;íê&#214;D&#182;&#207;
        DMA_CHx->CCR|=1<<4;                  //′ó′&#230;′¢&#198;÷&#182;á
        DMA_CHx->CCR|=0<<5;                  //2&#187;&#214;′DD&#209;-&#187;·&#196;£ê&#189;
        DMA_CHx->CCR|=0<<6;                 //íaéèμ&#216;&#214;··&#199;&#212;&#246;á&#191;&#196;£ê&#189;
        DMA_CHx->CCR|=1<<7;                  //′&#230;′¢&#198;÷&#212;&#246;á&#191;&#196;£ê&#189;
        DMA_CHx->CCR|=0<<8;                  //íaéèêy&#190;Y&#191;í&#182;è&#206;a8&#206;&#187;
        DMA_CHx->CCR|=0<<10;                 //′&#230;′¢&#198;÷êy&#190;Y&#191;í&#182;è8&#206;&#187;
        DMA_CHx->CCR|=1<<12;                 //&#214;Dμèó&#197;&#207;è&#188;&#182;
        DMA_CHx->CCR|=0<<14;                 //·&#199;′&#230;′¢&#198;÷μ&#189;′&#230;′¢&#198;÷&#196;£ê&#189;                  
  MY_NVIC_Init(1,3,DMA1_Channel4_IRQn ,3);        
}

               

没有最好只有更好
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-6-1 22:10:42 | 显示全部楼层
1,算误差。  2,串口传输速度慢,严重拖累系统速度。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-11 07:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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