久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1813|回復: 1
打印 上一主題 下一主題
收起左側

STM32 adc多通道采集數據存儲并DMA傳輸問題

[復制鏈接]
跳轉到指定樓層
樓主
ID:291789 發表于 2020-3-20 11:34 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
adc開啟8個通道采集數據,之后用DMA將數據傳送到數組value[8][10]中,現在我很疑惑,這個二維數組中的前8個數據是不是DMA從ADC->DR中回傳的八個數據的第一次采樣值?

單片機源程序如下:
  1. #define Channel_Num  8 //ADC的通道數,使用8個通道
  2. #define Sample_Num  10 //采樣次數,使用平均濾波,采樣10次取均值
  3. //#define  DMA_BUFF_SIZE  Channel_Num*Sample_Num*3
  4. u16 AD_Value[8][10];//  __attribute__((at(0X68000000)));//行優先存儲,DMA第一次傳輸的8個數據為ADC各個通道的第一次采樣數據
  5. u16 Actual_AD_Value[8];



  6. void  ADC_GPIO_init(void)
  7. {
  8.   GPIO_InitTypeDef GPIO_InitStructure;

  9.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_GPIOC, ENABLE );   
  10.    
  11.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
  12.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;        //模擬輸入引腳
  13.     GPIO_Init(GPIOA, &GPIO_InitStructure);   

  14.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
  15.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;        //模擬輸入引腳
  16.     GPIO_Init(GPIOC, &GPIO_InitStructure);   
  17. }


  18. //adc1  8通道循環采集配置
  19. void  Adc_DMA_Init(void)
  20. {     
  21.     ADC_InitTypeDef ADC_InitStructure;
  22.     DMA_InitTypeDef DMA_InitStructure;

  23.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1    , ENABLE );      //使能ADC1通道時鐘
  24.      RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);    //使能DMA傳輸
  25.    
  26.     RCC_ADCCLKConfig(RCC_PCLK2_Div6);   //設置ADC時鐘分頻因子6,72M/6=12M,ADC最大時間不能超過14M
  27.                      
  28.   DMA_DeInit(DMA1_Channel1);   //將DMA的通道1寄存器重設為缺省值
  29.    
  30.     DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&ADC1->DR;  //DMA外設基地址
  31.     DMA_InitStructure.DMA_MemoryBaseAddr =(u32)&AD_Value;  //DMA內存基地址
  32.     DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;  //數據傳輸方向,從外設讀取發送到內存
  33.     DMA_InitStructure.DMA_BufferSize = (Channel_Num*Sample_Num+2)*2;  //DMA通道的DMA緩存的大小//Channel_Num*Sample_Num
  34.     DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;  //外設地址寄存器不變
  35.     DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;  //內存地址寄存器遞增
  36.     DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;  //外設數據寬度為16位
  37.     DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //數據寬度為16位
  38.     DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;  //工作在循環模式DMA_Mode_Normal   DMA_Mode_Circular
  39.     DMA_InitStructure.DMA_Priority = DMA_Priority_High; //DMA通道1擁有高優先級
  40.     DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;  //DMA通道x沒有設置為內存到內存傳輸
  41.     DMA_Init(DMA1_Channel1, &DMA_InitStructure);  //根據DMA_InitStruct中指定的參數初始化DMA的通道USART1_Tx_DMA_Channel所標識的寄存器
  42.   
  43.     DMA_Cmd(DMA1_Channel1,ENABLE);
  44.    

  45.     ADC_DeInit(ADC1);  //復位ADC1

  46.     ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;    //ADC工作模式:ADC1和ADC2工作在獨立模式
  47.     ADC_InitStructure.ADC_ScanConvMode = ENABLE;    //模數轉換工作在掃描模式
  48.     ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;    //模數轉換工作在連續轉換模式
  49.     ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;    //轉換由軟件而不是外部觸發啟動
  50.     ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;    //ADC數據右對齊
  51.     ADC_InitStructure.ADC_NbrOfChannel = 8;    //順序進行規則轉換的ADC通道的數目
  52.     ADC_Init(ADC1, &ADC_InitStructure);    //根據ADC_InitStruct中指定的參數初始化外設ADCx的寄存器   


  53.       //設置指定ADC的規則組通道,8個序列,采樣時間
  54.     ADC_RegularChannelConfig(ADC1,ADC_Channel_0, 1,ADC_SampleTime_239Cycles5);
  55.     ADC_RegularChannelConfig(ADC1,ADC_Channel_1, 2,ADC_SampleTime_239Cycles5);   
  56.     ADC_RegularChannelConfig(ADC1,ADC_Channel_2, 3,ADC_SampleTime_239Cycles5);
  57.     ADC_RegularChannelConfig(ADC1,ADC_Channel_3, 4,ADC_SampleTime_239Cycles5);
  58.   ADC_RegularChannelConfig(ADC1,ADC_Channel_10, 5,ADC_SampleTime_239Cycles5);
  59.     ADC_RegularChannelConfig(ADC1,ADC_Channel_11, 6,ADC_SampleTime_239Cycles5);
  60.     ADC_RegularChannelConfig(ADC1,ADC_Channel_12, 7,ADC_SampleTime_239Cycles5);
  61.     ADC_RegularChannelConfig(ADC1,ADC_Channel_13, 8,ADC_SampleTime_239Cycles5);        

  62.   ADC_DMACmd(ADC1, ENABLE);
  63.    
  64.     ADC_Cmd(ADC1, ENABLE);    //使能指定的ADC1
  65.    
  66.     ADC_ResetCalibration(ADC1);    //使能復位校準  
  67.      
  68.     while(ADC_GetResetCalibrationStatus(ADC1));    //等待復位校準結束
  69.    
  70.     ADC_StartCalibration(ADC1);     //開啟AD校準

  71.     while(ADC_GetCalibrationStatus(ADC1));     //等待校準結束
  72.    
  73.     ADC_SoftwareStartConvCmd(ADC1, ENABLE);        //使能指定的ADC1的軟件轉換啟動功能
  74. }            


  75.    
  76. //獲得每個通道連續采集10的的AD平均值
  77. void Get_Adc(void)   
  78. {                  
  79.     u16 sum=0;
  80.     u8  i=0,count=0;
  81.     for(i=0;i<Channel_Num;i++)
  82.         {
  83.         for(count=0;count<Sample_Num;count++)
  84.         {
  85.           sum+=AD_Value[i][count];
  86.         }
  87.         Actual_AD_Value[i]=sum/Sample_Num;
  88.     }
  89.      sum=0;
  90. }


  91. float GET_Voltage(u16  AD_values)
  92. {
  93.   return  (float)(AD_values*3.3/4096);
  94. }
復制代碼

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:291789 發表于 2020-3-20 13:22 | 只看該作者
我還想問一下,這個程序,在電壓處理那塊void Get_Adc(void)中,Actual_AD_Value[0]沒有值,也沒查到原因,請哥哥指導下們
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久久久久九九九九九九 | 久久综合一区二区三区 | 成人在线观看中文字幕 | 成人午夜免费视频 | 三级在线观看 | 日韩网 | 在线视频日韩精品 | 午夜久久久久 | 欧美日韩一区二区在线观看 | xx性欧美肥妇精品久久久久久 | 精品国产一级 | 国产精品久久久久一区二区三区 | 亚洲社区在线 | 精品一区二区三区在线观看 | 中文字幕一级毛片视频 | jav成人av免费播放 | 久久精品中文 | 91久久国产综合久久91精品网站 | 欧美精品被 | 日韩精品一区二区三区中文在线 | 欧美国产日韩在线观看 | 永久av | 国产精品美女久久久久aⅴ国产馆 | 欧美激情视频一区二区三区免费 | 欧美综合一区二区 | 欧美在线精品一区 | 美女天堂在线 | 日韩 国产 在线 | 国产精品中文 | 欧美一级黄 | 青青草免费在线视频 | 欧美午夜精品久久久久免费视 | 亚洲一区二区久久 | 欧美黄在线观看 | 国产日韩欧美一区 | h片在线看 | 国产精品久久久久久久久污网站 | 日韩欧美在 | 午夜视频精品 | 国产一区二区在线免费观看 | 黄色网址在线免费播放 |