初级会员

- 积分
- 106
- 金钱
- 106
- 注册时间
- 2014-10-17
- 在线时间
- 3 小时
|
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ÄüPORTA¿úê±Öó
GPIOA->CRL&=0XFFFFFF0F;//PA1 anologêäèë
//í¨μà10/11éèÖÃ
RCC->APB2ENR|=1<<9; //ADC1ê±Öóê1Äü
RCC->APB2RSTR|=1<<9; //ADC1¸′λ
RCC->APB2RSTR&=~(1<<9);//¸′λ½áêø
RCC->CFGR&=~(3<<14); //·ÖÆμòò×óÇåáã ¶ÔAPB2£¨56M£© 4·ÖÆμμÃμ½ADCμÄê§×ùÎa14M
//SYSCLK/DIV2=12M ADCê±ÖóéèÖÃÎa12M,ADC×î′óê±Öó2»Äü3¬1y14M!
//·ñÔò½«μ¼ÖÂADC׼跶èϽμ!
RCC->CFGR|=2<<14; //ÕaàïéèÖÃAD×a»»Æ÷μÄ·ÖÆμê±Öó£¬ÔúRCC_CFGR¼Ä′æÆ÷ÖD£¬ADCê±Öóóé¸ßËùAPB2ê±Öó¾-2£¬4 £¬6 £¬8·ÖÆμoó»ñμÃ
ADC1->CR1&=0XF0FFFF; //1¤×÷Ä£ê½Çåáã
ADC1->CR1|=0<<16; //¶àá¢1¤×÷Ä£ê½
ADC1->CR1&=~(1<<8); //·Çé¨ÃèÄ£ê½
ADC1->CR2|=0<<1; //μ¥′Î×a»»Ä£ê½
ADC1->CR2|=1<<8; //ÆôóÃDMA
ADC1->CR2&=~(7<<17);
ADC1->CR2|=3<<17; //¶¨ê±Æ÷2μÄCC2ê¼t
ADC1->CR2|=1<<20; //ÔêDíía2¿ê¼t′¥·¢
ADC1->CR2&=~(1<<11); //óò¶ÔÆë
//ADC1->CR2|=1<<23; //ê1Äüζè′«¸DÆ÷
ADC1->SQR1&=~(0XF<<20);
ADC1->SQR1|=0<<20; // 1¸ö×a»»Ôú1æÔòDòáDÖD ò2¾íêÇÖ»×a»»1æÔòDòáD1
ADC1->SQR3&=0XFFFFFFE0;//1æÔòDòáD1 í¨μàch///////////////////////////////////////////////////////////////////
ADC1->SQR3|=ADC_CH1; /////í¨μà1///////////////////////////////////////////////////////////////////////////////////////
//éèÖÃí¨μà1μÄ2éÑùê±¼ä
ADC1->SMPR2&=~(7<<3); //í¨μà12éÑùê±¼äÇå¿Õ
ADC1->SMPR2|=5<<3; //í¨μà1 55.5ÖüÆú
ADC1->CR2|=1<<0; //¿aÆôAD×a»»Æ÷
ADC1->CR2|=1<<3; //ê1Äü¸′λD£×¼
while(ADC1->CR2&1<<3); //μè′yD£×¼½áêø
//¸Ãλóéèí¼téèÖÃ2¢óéó2¼tÇå3y¡£ÔúD£×¼¼Ä′æÆ÷±»3õê¼»ˉoó¸Ã뽫±»Çå3y¡£
ADC1->CR2|=1<<2; //¿aÆôADD£×¼
while(ADC1->CR2&1<<2); //μè′yD£×¼½áêø
//¸Ãλóéèí¼téèÖÃòÔ¿aê¼D£×¼£¬2¢ÔúD£×¼½áêøê±óéó2¼tÇå3y
//ADC1->CR2|=1<<22; //Æô¶ˉ1æÔò×a»»í¨μà///////1رÕ1æÔòÆô¶ˉ£¬òòÎaÕaàïêÇóé¶¨ê±Æ÷2μÄê¼tà′′¥·¢μÄ
}
用于AD采集的DMA配置
void ADC_DMA_Config(DMA_Channel_TypeDef*DMA_CHx,u32 cpar,u32 cmar,u16 cndtr)
{
RCC->AHBENR|=1<<0; //¿aÆôDMA1ê±Öó
delay_ms(5); //μè′yDMAê±ÖóÎ趨
DMA_CHx->CPAR=cpar; //DMA1 íaéèμØÖ·
DMA_CHx->CMAR=(u32)cmar; //DMA1,′æ′¢Æ÷μØÖ·
ADC_DMA1_MEM_LEN=cndtr; //±£′æDMA′«êäêy¾Yá¿
DMA_CHx->CNDTR=cndtr; //DMA1,′«êäêy¾Yá¿
DMA_CHx->CCR=0X00000000; //¸′λ
DMA_CHx->CCR|=1<<1; //ÔêDíDMA′«êäíêÖD¶Ï
DMA_CHx->CCR|=0<<4; //′óíaéè¶á
DMA_CHx->CCR|=1<<5; //2»Ö′DDÑ-»·Ä£ê½
DMA_CHx->CCR|=0<<6; //íaéèμØÖ··ÇÔöá¿Ä£ê½
DMA_CHx->CCR|=1<<7; //′æ′¢Æ÷Ôöá¿Ä£ê½
DMA_CHx->CCR|=1<<8; //íaéèêy¾Y¿í¶èÎa16λ
DMA_CHx->CCR|=1<<10; //′æ′¢Æ÷êy¾Y¿í¶è16λ
DMA_CHx->CCR|=1<<12; //ÖDμèóÅÏè¼¶
DMA_CHx->CCR|=0<<14; //·Ç′æ′¢Æ÷μ½′æ′¢Æ÷Ä£ê½
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; //¿aÆôDMA1ê±Öó
delay_ms(5); //μè′yDMAê±ÖóÎ趨
DMA_CHx->CPAR=cpar; //DMA1 íaéèμØÖ·
DMA_CHx->CMAR=(u32)cmar; //DMA1,′æ′¢Æ÷μØÖ·
DMA1_MEM_LEN=cndtr; //±£′æDMA′«êäêy¾Yá¿
DMA_CHx->CNDTR=cndtr; //DMA1,′«êäêy¾Yá¿
DMA_CHx->CCR=0X00000000; //¸′λ
DMA_CHx->CCR|=1<<1; //ÔêDíDMA′«êäíêÖD¶Ï
DMA_CHx->CCR|=1<<4; //′ó′æ′¢Æ÷¶á
DMA_CHx->CCR|=0<<5; //2»Ö′DDÑ-»·Ä£ê½
DMA_CHx->CCR|=0<<6; //íaéèμØÖ··ÇÔöá¿Ä£ê½
DMA_CHx->CCR|=1<<7; //′æ′¢Æ÷Ôöá¿Ä£ê½
DMA_CHx->CCR|=0<<8; //íaéèêy¾Y¿í¶èÎa8λ
DMA_CHx->CCR|=0<<10; //′æ′¢Æ÷êy¾Y¿í¶è8λ
DMA_CHx->CCR|=1<<12; //ÖDμèóÅÏè¼¶
DMA_CHx->CCR|=0<<14; //·Ç′æ′¢Æ÷μ½′æ′¢Æ÷Ä£ê½
MY_NVIC_Init(1,3,DMA1_Channel4_IRQn ,3);
}
|
|