你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

DMA ADC多通道采样数据错位

[复制链接]
thw3172335 提问时间:2019-1-18 13:22 /
  1. </blockquote></div>
  2. <div class="blockcode"><blockquote>volatile unsigned int  After_filter[16];    //ÓÃÀ´´æ·ÅÇóƽ¾ùÖµÖ®ºóµÄ½á¹û


  3. void ADC1_GPIO_Config(void);
  4. void ADC1_Mode_Config(void);
  5. void ADC1_DMA_Init(void);

  6. void ADC1_Init(void)
  7. {
  8.         ADC1_DMA_Init();
  9.         ADC1_GPIO_Config();
  10.         ADC1_Mode_Config();
  11.         
  12. }
  13. //Ñ¡ÓÃADCµÄͨµÀ  0   1   2   3   4   5   6   7   8   9   10  11  12  13  14  15
  14. //·Ö±ð¶ÔÓ¦¹Ü½Å   PA0 PA1 PA2 PA3 PA4 PA5 PA6 PA7 PB0 PB1 PC0 PC1 PC2 PC3 PC4 PC5
  15. //¶ÔÓ¦¹¦ÄÜ       OCE OCF OCG OCH OVA OVB OVC OVD OVG OVH OCA OCB OCC OCD OVE OVF
  16. void ADC1_GPIO_Config(void)
  17. {
  18.         GPIO_InitTypeDef GPIO_InitStructure;
  19.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |
  20.                                RCC_APB2Periph_GPIOC |RCC_APB2Periph_AFIO ,ENABLE);//¹¦Äܸ´ÓÃIOʱÖÓ
  21.         
  22.         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;
  23.         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;//Ä£ÄâÊäÈë
  24.         GPIO_Init(GPIOA,&GPIO_InitStructure);//PA0 1 2 3 4 5 6 7
  25.         
  26.         GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0 | GPIO_Pin_1;
  27.         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;//Ä£ÄâÊäÈë
  28.         GPIO_Init(GPIOB,&GPIO_InitStructure);//PB0 1
  29.         
  30.         GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 ;
  31.         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;//Ä£ÄâÊäÈë
  32.         GPIO_Init(GPIOC,&GPIO_InitStructure);//PC0 1 2 3 4 5
  33. }
  34. void ADC1_DMA_Init(void)
  35. {
  36.   DMA_InitTypeDef DMA_InitStructure;
  37.   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);//ʹÄÜDMAʱÖÓ
  38. ///**************************DMAͨµÀ1ÅäÖÃ****************************/////
  39.         DMA_DeInit(DMA1_Channel1);//DMAͨµÀ1³õʼ»¯
  40.         DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;//ADCµØÖ·
  41.         DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&After_filter;//ÄÚ´æµØÖ·
  42.         DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//ÍâÉèΪÊý¾ÝÔ´
  43.         DMA_InitStructure.DMA_BufferSize = 16;//MAX_ADC_CH*GET_ADC_NMB;
  44.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//ÍâÉèµØÖ·¹Ì¶¨
  45.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//ÄÚ´æµØÖ·¹Ì¶¨
  46.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//°ë×Ö
  47.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
  48.         DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;//Ñ&shy;»·´«Êä
  49.         DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  50.         DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  51.         DMA_Init(DMA1_Channel1,&DMA_InitStructure);
  52.         DMA_Cmd(DMA1_Channel1,ENABLE);
  53. }

  54. void ADC1_Mode_Config(void)
  55. {
  56.         
  57.         ADC_InitTypeDef ADC_InitStructure;
  58.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 ,ENABLE);//ʹÄÜADC1ʱÖÓ
  59.         //*******************************ADC1ÅäÖÃ**********************///
  60.         ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//¶ÀÁ¢ADCģʽ
  61.         ADC_InitStructure.ADC_ScanConvMode = ENABLE;//½ûֹɨÃèģʽ£¬É¨ÃèģʽÓÃÓÚ¶àͨµÀ²É¼¯
  62.         ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//¿ªÆôÁ¬Ðøģʽ£¬¼´²»Í£µÄ½øÐÐADCת»»
  63.         ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//²»Ê¹ÓÃÍⲿ´¥·¢×ª»»
  64.         ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//²É¼¯Êý¾ÝÓÒ¶ÔÆë
  65.         ADC_InitStructure.ADC_NbrOfChannel = 8;//Ҫת»»µÄͨµÀÊýÄ¿
  66.         ADC_Init(ADC1, &ADC_InitStructure);
  67.         
  68.         RCC_ADCCLKConfig(RCC_PCLK2_Div8);//ÅäÖÃADCʱÖÓ£¬ÎªPCLK2µÄ8·ÖƵ£¬¼´9MHz
  69.         
  70.   ADC_RegularChannelConfig(ADC1, ADC_Channel_10,   1,  ADC_SampleTime_55Cycles5);                      //ADC4   PC0                 µçÁ÷1
  71.   ADC_RegularChannelConfig(ADC1, ADC_Channel_11,   2,  ADC_SampleTime_55Cycles5);                      //ADC5   PC1     µçÁ÷2
  72.   ADC_RegularChannelConfig(ADC1, ADC_Channel_12,   3,  ADC_SampleTime_55Cycles5);                      //ADC2   PC2     µçÁ÷3
  73.         ADC_RegularChannelConfig(ADC1, ADC_Channel_13,   4,  ADC_SampleTime_55Cycles5);                      //ADC3   PC3     µçÁ÷4
  74.   ADC_RegularChannelConfig(ADC1, ADC_Channel_0,    5,  ADC_SampleTime_55Cycles5);                      //ADC12  PA0     µçÁ÷5
  75.   ADC_RegularChannelConfig(ADC1, ADC_Channel_1,    6,  ADC_SampleTime_55Cycles5);                      //ADC13  PA1     µçÁ÷6
  76.   ADC_RegularChannelConfig(ADC1, ADC_Channel_2,    7,  ADC_SampleTime_55Cycles5);                      //ADC11  PA2     µçÁ÷7
  77.   ADC_RegularChannelConfig(ADC1, ADC_Channel_3,    8,  ADC_SampleTime_55Cycles5);                      //ADC10  PA3     µçÁ÷8

  78.         ADC_DMACmd(ADC1,ENABLE);
  79.         ADC_Cmd(ADC1,ENABLE);

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

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

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

  95.                 TIM_SetCompare1(TIM1, After_filter[0]);
  96.                 TIM_SetCompare2(TIM1, After_filter[1]);
  97.                 TIM_SetCompare3(TIM1, After_filter[2]);
  98.                 TIM_SetCompare4(TIM1, After_filter[3]);
  99.                 TIM_SetCompare3(TIM2, After_filter[4]);
  100.                 TIM_SetCompare4(TIM2, After_filter[5]);
  101.                 TIM_SetCompare1(TIM4, After_filter[6]);
  102.                 TIM_SetCompare2(TIM4, After_filter[7]);

  103.         }
  104. }
复制代码


收藏 评论6 发布时间:2019-1-18 13:22

举报

6个回答
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
怎么发才能让中文不乱码呀

试试这样?
1.png

评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

BG4RFF 回答时间:2019-1-18 15:30:58
12位的AD,右对齐,一个通道需要2byte,就是一个Uint16_t,当然8的倍数不行,要设置成16的倍数才行

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

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的倍数才行 ...

好的,我试试看,再找找问题
超傻天尊 回答时间:2019-2-20 11:20:35
数据错位的情况解决了吗?我也出现这种情况

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版