thw3172335 发表于 2019-1-18 13:22:29

DMA ADC多通道采样数据错位

</blockquote></div>
<div class="blockcode"><blockquote>volatile unsigned intAfter_filter;    //ÓÃÀ´´æ·ÅÇ󯽾ùÖµÖ®ºóµÄ½á¹û


void ADC1_GPIO_Config(void);
void ADC1_Mode_Config(void);
void ADC1_DMA_Init(void);

void ADC1_Init(void)
{
      ADC1_DMA_Init();
      ADC1_GPIO_Config();
      ADC1_Mode_Config();
      
}
//Ñ¡ÓÃADCµÄͨµÀ0   1   2   3   4   5   6   7   8   9   101112131415
//·Ö±ð¶ÔÓ¦¹Ü½Å   PA0 PA1 PA2 PA3 PA4 PA5 PA6 PA7 PB0 PB1 PC0 PC1 PC2 PC3 PC4 PC5
//¶ÔÓ¦¹¦ÄÜ       OCE OCF OCG OCH OVA OVB OVC OVD OVG OVH OCA OCB OCC OCD OVE OVF
void ADC1_GPIO_Config(void)
{
      GPIO_InitTypeDef GPIO_InitStructure;
      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |
                               RCC_APB2Periph_GPIOC |RCC_APB2Periph_AFIO ,ENABLE);//¹¦Äܸ´ÓÃIOʱÖÓ
      
      GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
      GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;//Ä£ÄâÊäÈë
      GPIO_Init(GPIOA,&GPIO_InitStructure);//PA0 1 2 3 4 5 6 7
      
      GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0 | GPIO_Pin_1;
      GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;//Ä£ÄâÊäÈë
      GPIO_Init(GPIOB,&GPIO_InitStructure);//PB0 1
      
      GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 ;
      GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;//Ä£ÄâÊäÈë
      GPIO_Init(GPIOC,&GPIO_InitStructure);//PC0 1 2 3 4 5
}
void ADC1_DMA_Init(void)
{
DMA_InitTypeDef DMA_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);//ʹÄÜDMAʱÖÓ
///**************************DMAͨµÀ1ÅäÖÃ****************************/////
      DMA_DeInit(DMA1_Channel1);//DMAͨµÀ1³õʼ»¯
      DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;//ADCµØÖ·
      DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&After_filter;//ÄÚ´æµØÖ·
      DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//ÍâÉèΪÊý¾ÝÔ´
      DMA_InitStructure.DMA_BufferSize = 16;//MAX_ADC_CH*GET_ADC_NMB;
      DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//ÍâÉèµØÖ·¹Ì¶¨
      DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//ÄÚ´æµØÖ·¹Ì¶¨
      DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//°ë×Ö
      DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
      DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;//Ñ&shy;»·´«Êä
      DMA_InitStructure.DMA_Priority = DMA_Priority_High;
      DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
      DMA_Init(DMA1_Channel1,&DMA_InitStructure);
      DMA_Cmd(DMA1_Channel1,ENABLE);
}

void ADC1_Mode_Config(void)
{
      
      ADC_InitTypeDef ADC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 ,ENABLE);//ʹÄÜADC1ʱÖÓ
      //*******************************ADC1ÅäÖÃ**********************///
      ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//¶ÀÁ¢ADCģʽ
      ADC_InitStructure.ADC_ScanConvMode = ENABLE;//½ûֹɨÃèģʽ£¬É¨ÃèģʽÓÃÓÚ¶àͨµÀ²É¼¯
      ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//¿ªÆôÁ¬ÐøÄ£Ê½£¬¼´²»Í£µÄ½øÐÐADCת»»
      ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//²»Ê¹ÓÃÍⲿ´¥·¢×ª»»
      ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//²É¼¯Êý¾ÝÓÒ¶ÔÆë
      ADC_InitStructure.ADC_NbrOfChannel = 8;//Ҫת»»µÄͨµÀÊýÄ¿
      ADC_Init(ADC1, &ADC_InitStructure);
      
      RCC_ADCCLKConfig(RCC_PCLK2_Div8);//ÅäÖÃADCʱÖÓ£¬ÎªPCLK2µÄ8·ÖƵ£¬¼´9MHz
      
ADC_RegularChannelConfig(ADC1, ADC_Channel_10,   1,ADC_SampleTime_55Cycles5);                      //ADC4   PC0               µçÁ÷1
ADC_RegularChannelConfig(ADC1, ADC_Channel_11,   2,ADC_SampleTime_55Cycles5);                      //ADC5   PC1   µçÁ÷2
ADC_RegularChannelConfig(ADC1, ADC_Channel_12,   3,ADC_SampleTime_55Cycles5);                      //ADC2   PC2   µçÁ÷3
      ADC_RegularChannelConfig(ADC1, ADC_Channel_13,   4,ADC_SampleTime_55Cycles5);                      //ADC3   PC3   µçÁ÷4
ADC_RegularChannelConfig(ADC1, ADC_Channel_0,    5,ADC_SampleTime_55Cycles5);                      //ADC12PA0   µçÁ÷5
ADC_RegularChannelConfig(ADC1, ADC_Channel_1,    6,ADC_SampleTime_55Cycles5);                      //ADC13PA1   µçÁ÷6
ADC_RegularChannelConfig(ADC1, ADC_Channel_2,    7,ADC_SampleTime_55Cycles5);                      //ADC11PA2   µçÁ÷7
ADC_RegularChannelConfig(ADC1, ADC_Channel_3,    8,ADC_SampleTime_55Cycles5);                      //ADC10PA3   µçÁ÷8

      ADC_DMACmd(ADC1,ENABLE);
      ADC_Cmd(ADC1,ENABLE);

      ADC_ResetCalibration(ADC1);//¸´Î»Ð£×¼¼Ä´æÆ÷
      while(ADC_GetResetCalibrationStatus(ADC1));//µÈ´ýУ׼¼Ä´æÆ÷¸´Î»Íê³É
      ADC_StartCalibration(ADC1);//ADCУ׼
      while(ADC_GetCalibrationStatus(ADC1));//µÈ´ýУ׼Íê³É

      ADC_SoftwareStartConvCmd(ADC1,ENABLE);//ÓÉÓÚûÓвÉÓÃÍⲿ´¥·¢£¬ËùÒÔʹÓÃÈí¼þ´¥·¢ADCת»»
}
void pid_task(void *pdata)
{
      float temp=0;
      pdata = pdata;
      ADC1_Init();             //ADC³õʼ»¯
      OSTimeDlyHMSM(0, 0, 0, 100);//ÑÓʱ0.1Ãë      
      for(;;)
      {

          OSTimeDlyHMSM(0, 0, 0, 10);//ÑÓʱ1Ãë

                TIM_SetCompare1(TIM1, After_filter);
                TIM_SetCompare2(TIM1, After_filter);
                TIM_SetCompare3(TIM1, After_filter);
                TIM_SetCompare4(TIM1, After_filter);
                TIM_SetCompare3(TIM2, After_filter);
                TIM_SetCompare4(TIM2, After_filter);
                TIM_SetCompare1(TIM4, After_filter);
                TIM_SetCompare2(TIM4, After_filter);

      }
}

thw3172335 发表于 2019-1-18 13:31:28

怎么发才能让中文不乱码呀

thw3172335 发表于 2019-1-18 13:42:20

我采的8通道数据DMA_InitStructure.DMA_BufferSize为什么设置成8不行,只能是8的倍数,不然有几路就没采样

stm1024 发表于 2019-1-18 14:09:45

thw3172335 发表于 2019-1-18 13:31
怎么发才能让中文不乱码呀
试试这样?


BG4RFF 发表于 2019-1-18 15:30:58

12位的AD,右对齐,一个通道需要2byte,就是一个Uint16_t,当然8的倍数不行,要设置成16的倍数才行

thw3172335 发表于 2019-1-19 09:12:51

本帖最后由 thw3172335 于 2019-1-19 09:33 编辑

BG4RFF 发表于 2019-1-18 15:30
12位的AD,右对齐,一个通道需要2byte,就是一个Uint16_t,当然8的倍数不行,要设置成16的倍数才行 ...
好的,我试试看,再找找问题

gege196 发表于 2019-2-20 11:20:35

数据错位的情况解决了吗?我也出现这种情况
页: [1]
查看完整版本: DMA ADC多通道采样数据错位