OpenEdv-开源电子网

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

adc+dma+can为什么上位机波形不对

[复制链接]

4

主题

13

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2019-8-1
在线时间
19 小时
发表于 2019-8-4 22:41:03 | 显示全部楼层 |阅读模式
1金钱
  1. 以下是adc+dma和main里的代码,adc就采一个通道,dma采用双缓冲模式,每次传142个数据,正好一个周波,每次先把dma空闲的那块内存里的量导出来,然后can慢慢发,在上位机上看波形总是乱的,请大神帮忙看一下,多谢。
  2. void  Adc_Init(void)
  3. {   
  4.   GPIO_InitTypeDef  GPIO_InitStructure;
  5.         ADC_CommonInitTypeDef ADC_CommonInitStructure;
  6.         ADC_InitTypeDef       ADC_InitStructure;
  7. //        NVIC_InitTypeDef NVIC_InitStructure;
  8.        
  9.   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//ê1ÄüGPIOAê±Öó
  10.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //ê1ÄüADC1ê±Öó

  11.        
  12.                         /*************3õê¼»ˉADC        ***********/
  13.        
  14.   //Ïè3õê¼»ˉGPIO0,1,5,7 IO¿ú
  15.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  16.         GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_AN ;//Ä£Äaêäèë
  17.   //GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//íÆíìêä3ö
  18.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
  19.   GPIO_InitStructure.GPIO_PuPd =  GPIO_PuPd_NOPULL ;//2»′øéÏÏÂà-

  20.   GPIO_Init(GPIOA, &GPIO_InitStructure);//3õê¼»ˉ


  21.                         /**************ADC_CommonInit********/

  22.         RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,ENABLE);          //ADC1¸′λ
  23.         RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,DISABLE);        //¸′λ½áêø         

  24.        
  25.   ADC_CommonInitStructure.ADC_Mode =ADC_Mode_Independent;//Ë«í¨μàí¬2½×a»»Ä£ê½ 1æÔòí¬2½
  26.   //ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;//ὸö2éÑù½×¶ÎÖ®¼äμÄÑó3ù5¸öÑóê± ¸ÃéèÖÃÖ»Õë¶Ôóú½»ìæ′¥·¢Ä£ê½
  27.   ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_1  ; //DMAÄ£ê½1
  28.   ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;//Ô¤·ÖÆμ4·ÖÆμ¡£ADCCLK=PCLK2/4=84/4=21Mhz,ADCê±Öó×îoÃ2»òa3¬1y36Mhz

  29.         ADC_CommonInit(&ADC_CommonInitStructure);//3õê¼»ˉ
  30.        
  31.                         /***********ADC13õê¼»ˉ**********/
  32.                        
  33.   ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;//12λÄ£ê½
  34.   ADC_InitStructure.ADC_ScanConvMode = DISABLE;//é¨Ãèģ꽠      
  35.   ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//¿aÆôá¬DøÄ£ê½ ÖØ¸′2éÑù
  36.   ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;//éÏéyÑØ′¥·¢
  37.   //ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_T2_CC2;
  38.         ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//óò¶ÔÆë       
  39.   ADC_InitStructure.ADC_NbrOfConversion = 1;//2¸ö×a»»Ôú1æÔòDòáDÖD

  40.         ADC_Init(ADC1, &ADC_InitStructure);//ADC13õê¼»ˉ
  41.         ADC_Cmd(ADC1,ENABLE);//ê1ÄüADC

  42.         ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_480Cycles  );        //ADC1_PA0,ADCí¨μà,480¸öÖüÆú,ìá¸ß2éÑùê±¼ä¿éòÔìá¸ß¾«è·¶è       


  43. ADC_DMARequestAfterLastTransferCmd(ADC1,ENABLE);
  44. ADC_DMACmd(ADC1, ENABLE);
  45. ADC_SoftwareStartConv(ADC1);<div class="blockcode"><blockquote>u32 i=0;
  46. void MY_DMA_Config(DMA_Stream_TypeDef *DMA_Streamx,u32 chx,u32 par,u32 mar,u32 mar1,u16 ndtr)
  47. {

  48.         DMA_InitTypeDef  DMA_InitStructure;
  49.         NVIC_InitTypeDef NVIC_InitStructure;
  50.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,ENABLE);
  51.   DMA_DeInit(DMA_Streamx);
  52.        
  53.         while (DMA_GetCmdStatus(DMA_Streamx) != DISABLE){}//μè′yDMA&#191;é&#197;&#228;&#214;&#195;

  54.                 /* &#197;&#228;&#214;&#195; DMA Stream */
  55.   DMA_InitStructure.DMA_Channel = chx;  //í¨μà&#209;&#161;&#212;&#241; DMA_Channel_0
  56.   DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)par;//DMAíaéèμ&#216;&#214;· ADC12_DR_Address
  57.   DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)mar;//DMA ′&#230;′¢&#198;÷0μ&#216;&#214;·
  58.   DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;//′&#230;′¢&#198;÷μ&#189;íaéè&#196;£ê&#189;
  59.   DMA_InitStructure.DMA_BufferSize = ndtr;//êy&#190;Y′&#171;ê&#228;á&#191;
  60.   DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//íaéè·&#199;&#212;&#246;á&#191;&#196;£ê&#189;
  61.   DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//′&#230;′¢&#198;÷&#212;&#246;á&#191;&#196;£ê&#189;
  62.   DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//íaéèêy&#190;Y3¤&#182;è:16&#206;&#187;
  63.   DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_HalfWord;//′&#230;′¢&#198;÷êy&#190;Y3¤&#182;è:16&#206;&#187;
  64.   DMA_InitStructure.DMA_Mode = DMA_Mode_Circular  ;// ê1ó&#195;&#209;-&#187;·&#196;£ê&#189;
  65.   DMA_InitStructure.DMA_Priority = DMA_Priority_High;//&#214;Dμèó&#197;&#207;è&#188;&#182;
  66.   DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;         
  67.   DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
  68.   DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;//′&#230;′¢&#198;÷í&#187;·¢μ¥′&#206;′&#171;ê&#228;
  69.   DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;//íaéèí&#187;·¢μ¥′&#206;′&#171;ê&#228;
  70.                 DMA_DoubleBufferModeConfig(DMA2_Stream0, (uint32_t)mar1, DMA_Memory_0);
  71.     DMA_DoubleBufferModeCmd(DMA2_Stream0, ENABLE);
  72.   DMA_Init(DMA_Streamx, &DMA_InitStructure);//3&#245;ê&#188;&#187;ˉDMA_Stream0
  73.         DMA_Cmd(DMA_Streamx, ENABLE);

  74.         //&#191;a&#214;D&#182;&#207;
  75. //        DMA_ITConfig(DMA2_Stream0,DMA_IT_HTIF0,ENABLE);
  76.         NVIC_InitStructure.NVIC_IRQChannel  = DMA2_Stream0_IRQn;         
  77.   //ADC1,ADC2è&#171;&#190;&#214;&#214;D&#182;&#207;   
  78.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
  79.   //&#199;à&#213;&#188;ó&#197;&#207;è&#188;&#182;  0
  80.   NVIC_InitStructure.NVIC_IRQChannelSubPriority   = 1;  
  81.   //&#207;ìó|ó&#197;&#207;è&#188;&#182; 1  
  82.   NVIC_InitStructure.NVIC_IRQChannelCmd   = ENABLE;   
  83.   NVIC_Init(&NVIC_InitStructure);
  84.   DMA_ITConfig(DMA2_Stream0,DMA_IT_TC,ENABLE);//′&#171;ê&#228;íê3é&#214;D&#182;&#207;&#191;&#216;&#214;&#198;&#206;&#187;&#191;a&#198;&#244;

  85. }



  86. void DMA2_Stream0_IRQHandler(void)
  87. {

  88.     if(DMA_GetITStatus(DMA2_Stream0,DMA_IT_TCIF0) != RESET)
  89.     {
  90.                        
  91.         DMA_ClearITPendingBit(DMA2_Stream0,DMA_IT_TCIF0);//&#199;&#229;3y&#214;D&#182;&#207;±ê&#214;&#190;&#206;&#187;

  92.     }
  93. }


  94. <div class="blockcode"><blockquote>

  95. __IO uint16_t  ADC1_ConvertedValue[142]; //&#195;&#191;&#214;ü2¨2é&#209;ù60&#184;&#246;μ&#227;£&#172;2é&#209;ù&#194;ê&#206;a3KHz
  96. __IO uint16_t  ADC1_ConvertedValue1[142];
  97. __IO uint16_t ADC1_ConvertedValueLocal[142];
  98. extern u32 i;
  99. #define ADC_DR_Address      ((uint32_t)0x4001204C)


  100. CanRxMsg RxMessage;                                 //&#189;óê&#213;&#187;o3&#229;&#199;&#248;
  101. __IO uint32_t my_flag=0 ;             //&#189;óê&#213;3é1|±ê&#214;&#190;
  102. int main(void)
  103. {

  104.         u16 j,k=0;//da_8,j,k;
  105.         u8 buff[2],res,s;
  106.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//éè&#214;&#195;&#207;μí3&#214;D&#182;&#207;ó&#197;&#207;è&#188;&#182;·&#214;×é2
  107.         delay_init(168);    //3&#245;ê&#188;&#187;ˉ&#209;óê±oˉêy
  108.         uart_init(115200);        //3&#245;ê&#188;&#187;ˉ′&#174;&#191;ú2¨ì&#216;&#194;ê&#206;a115200
  109.         LED_Init();                                        //3&#245;ê&#188;&#187;ˉLED
  110.                 Adc_Init();         //3&#245;ê&#188;&#187;ˉADC

  111.          MY_DMA_Config(DMA2_Stream0,DMA_Channel_0,(u32)ADC_DR_Address ,(u32)ADC1_ConvertedValue,(u32)ADC1_ConvertedValue1,142);
  112. //TIM2_Int_Init(999,83);//3&#245;ê&#188;&#187;ˉ′¥·¢&#198;÷t=(acc+1)*(psc+1)/Fs; F=1/t=500Hz

  113.         CAN_Config();

  114.   while (1)
  115.   {

  116.     if(DMA_GetCurrentMemoryTarget(DMA2_Stream0))
  117.                 {
  118.    
  119.                         for (k=0;k<142;k++)
  120.                         {
  121. ADC1_ConvertedValueLocal[k]=ADC1_ConvertedValue[k];
  122.                         }

  123.           }
  124.        
  125.                 else
  126.                 {
  127.                         for (k=0;k<142;k++)
  128.                         {
  129.                                 ADC1_ConvertedValueLocal[k]=ADC1_ConvertedValue[k];
  130.                         }
  131.   }
  132.                 for(j=0;j<142;j++)
  133.         {
  134.                                 buff[0]= (uint8_t) (ADC1_ConvertedValueLocal[j]&0xff);
  135.                                 buff[1]= (uint8_t)  ((ADC1_ConvertedValueLocal[j]>>8)&0xff);
  136.                         res=CAN1_Send_Msg(buff,2);//CAN·¢&#203;í
  137.                 }
  138. }

  139. }
  140.                

  141.        
  142.        





复制代码
































正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

13

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2019-8-1
在线时间
19 小时
 楼主| 发表于 2019-8-4 22:48:20 来自手机 | 显示全部楼层
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2019-8-5 01:29:44 | 显示全部楼层
帮顶
回复

使用道具 举报

4

主题

13

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2019-8-1
在线时间
19 小时
 楼主| 发表于 2019-8-5 09:18:42 | 显示全部楼层

多谢,原子哥没用过这个吗
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-18 03:56

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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