找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 4136|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

STM32注入多通道采集ADC 源程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:501195 發(fā)表于 2020-9-18 09:49 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
無(wú)意間看到網(wǎng)上有網(wǎng)友分享ADC注入組采集數(shù)據(jù)的文章,然后自己試著去配置代碼,翻遍了所有的網(wǎng)頁(yè)說(shuō)明幾乎千篇一律并沒(méi)有一個(gè)實(shí)用用的例程,然后就花了一天的時(shí)間去研究庫(kù)函數(shù),搞了很久都不可以,最終功夫不負(fù)有心人人我調(diào)出來(lái)了  看看我的代碼  不需要DMA搬運(yùn):

單片機(jī)代碼:
  1. #include "stm32f10x.h"               
  2. #include "adc.h"
  3. void Adc_Init(void)
  4. {
  5.         GPIO_InitTypeDef GPIO_InitStructure;//定義一個(gè)結(jié)構(gòu)體變量
  6.         ADC_InitTypeDef  ADC_InitStructure;
  7.                
  8.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能PA時(shí)鐘
  9.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);//使能ADC1時(shí)鐘
  10.         RCC_ADCCLKConfig(RCC_PCLK2_Div2);
  11.         
  12.         GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;//引腳選擇
  13.         GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AIN;    //模擬模式
  14.         GPIO_Init(GPIOA, &GPIO_InitStructure);            //初始化
  15.         
  16.         ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;        //獨(dú)立模式
  17.         ADC_InitStructure.ADC_ScanConvMode = DISABLE;            //單通道模式(非掃描模式)
  18.         ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;        //單次轉(zhuǎn)換模式
  19.         ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //軟件觸發(fā)啟動(dòng)
  20.         ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//ADC數(shù)據(jù)右對(duì)齊
  21.         ADC_InitStructure.ADC_NbrOfChannel = 1;                                //順序轉(zhuǎn)換的ADC通道的數(shù)目
  22.         ADC_Init(ADC1,&ADC_InitStructure);                                        //初始化ADC1
  23.         ADC_Cmd(ADC1,ENABLE);
  24.         ADC_ResetCalibration(ADC1);                                                        //使能復(fù)位校準(zhǔn)
  25.         while(ADC_GetResetCalibrationStatus(ADC1));                        //等待復(fù)位校準(zhǔn)結(jié)束
  26.         ADC_StartCalibration(ADC1);                                                        //開啟AD校準(zhǔn)
  27.         while(ADC_GetCalibrationStatus(ADC1));                                //等待校準(zhǔn)結(jié)束
  28. }
  29. u16 ADC1_CH_Data(u8 ch)     
  30. {         
  31.         ADC_RegularChannelConfig(ADC1,ch,1,ADC_SampleTime_239Cycles5);//設(shè)置規(guī)則轉(zhuǎn)換通道
  32.         ADC_SoftwareStartConvCmd(ADC1,ENABLE);//使能軟件轉(zhuǎn)換啟動(dòng)功能
  33.         ADC_Cmd(ADC1,ENABLE);             //使能ADC
  34.         while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待轉(zhuǎn)換結(jié)束
  35.         return ADC_GetConversionValue(ADC1);//讀取轉(zhuǎn)換值
  36. }  
  37. /************注入組**************/
  38. void ADC_GPIO(void)
  39. {
  40.     GPIO_InitTypeDef GPIO_InitStructure;//定義一個(gè)結(jié)構(gòu)體變量        
  41.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能PA時(shí)鐘
  42.         GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;//引腳選擇
  43.         GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AIN;    //模擬模式
  44.         GPIO_Init(GPIOA, &GPIO_InitStructure);            //初始化
  45. }
  46. /****************************
  47. 注入通道配置
  48. *****************************/
  49. void Adc_Init_intput(void)
  50. {
  51.           ADC_GPIO();
  52.           RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);//使能ADC1時(shí)鐘
  53.           RCC_ADCCLKConfig(RCC_PCLK2_Div2);//時(shí)鐘分頻
  54.       ADC_InitTypeDef ADC_InitStructure;
  55.       ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC1工作在獨(dú)立模式,和ADC2不配合
  56.           ADC_InitStructure.ADC_ScanConvMode = DISABLE;   //單通道模式,不掃描
  57.       ADC_InitStructure.ADC_ContinuousConvMode =DISABLE;  //單次轉(zhuǎn)換
  58.       ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //數(shù)據(jù)右對(duì)齊
  59.       ADC_Init(ADC1, &ADC_InitStructure);

  60.       /*********** ADC1 注入通道的配置! ************/  
  61.           ADC_ExternalTrigInjectedConvConfig(ADC1,ADC_ExternalTrigInjecConv_None); //外部觸發(fā)源為軟件觸發(fā)
  62.           ADC_InjectedSequencerLengthConfig(ADC1, 1);          //注入轉(zhuǎn)換通道1個(gè)
  63.           ADC_SetInjectedOffset(ADC1,ADC_InjectedChannel_1,0);
  64.           ADC_SetInjectedOffset(ADC1,ADC_InjectedChannel_2,0);
  65.           ADC_SetInjectedOffset(ADC1,ADC_InjectedChannel_3,0);
  66.           ADC_SoftwareStartInjectedConvCmd(ADC1,ENABLE);//使能注入組轉(zhuǎn)換功能
  67.       ADC_AutoInjectedConvCmd(ADC1,ENABLE);//使能轉(zhuǎn)換規(guī)則組后轉(zhuǎn)換注入組功能
  68.           ADC_Cmd(ADC1,ENABLE);
  69.           ADC_ResetCalibration(ADC1);                                                        //使能復(fù)位校準(zhǔn)
  70.           while(ADC_GetResetCalibrationStatus(ADC1));                        //等待復(fù)位校準(zhǔn)結(jié)束
  71.           ADC_StartCalibration(ADC1);                                                        //開啟AD校準(zhǔn)
  72.           while(ADC_GetCalibrationStatus(ADC1));                                //等待校準(zhǔn)結(jié)束
  73.       ADC_TempSensorVrefintCmd(ENABLE); //開啟內(nèi)部溫度傳感器         
  74. }        
  75. u16 ADC1_CH_Intput_Data(u8 ch)     
  76. {         
  77.         ADC_InjectedChannelConfig(ADC1,ch,1,ADC_SampleTime_28Cycles5);//設(shè)置規(guī)則轉(zhuǎn)換通道
  78.         ADC_SoftwareStartInjectedConvCmd(ADC1,ENABLE);//使能軟件轉(zhuǎn)換啟動(dòng)功能
  79.         ADC_Cmd(ADC1,ENABLE);             //使能ADC
  80.         while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待轉(zhuǎn)換結(jié)束
  81.         return ADC_GetInjectedConversionValue(ADC1,ADC_InjectedChannel_1);//讀取轉(zhuǎn)換值
  82. }
  83. //中位值濾波
  84. //方法:連續(xù)采樣N次(N取奇數(shù))把N次采樣值按大小排列取中間值為本次有效值
  85. //優(yōu)點(diǎn):能有效克服因偶然因素引起的波動(dòng)干擾;對(duì)溫度、液位等變化緩慢的被測(cè)參數(shù)有良好的濾波效果
  86. //缺點(diǎn):對(duì)流量,速度等快速變化的參數(shù)不宜

  87. #define N 30
  88. u16 middleValueFilter(u8 ch)      //會(huì)獲取30個(gè)ADC轉(zhuǎn)換值,然后取中間的一個(gè)作為本次采樣周期的輸出值
  89. {
  90.     u16 value_buf[N];
  91.     u16 i,j,k,temp;
  92.     for( i = 0; i < N; ++i)
  93.     {
  94.         value_buf[i] = ADC1_CH_Intput_Data(ch)  ;
  95.                                 
  96.     }
  97.     for(j = 0 ; j < N-1; ++j)
  98.     {
  99.         for(k = 0; k < N-j-1; ++k)
  100.         {
  101.             //從小到大排序,冒泡法排序
  102.             if(value_buf[k] > value_buf[k+1])
  103.             {
  104.                 temp = value_buf[k];
  105.                 value_buf[k] = value_buf[k+1];
  106.                 value_buf[k+1] = temp;
  107.             }
  108.         }
  109.     }
  110.     return value_buf[(N-1)/2];
  111. }
  112. #define                V25                                        1370
  113. #define                Avg_Slope                    4.35
  114. float Get_InternalSensorTemperate(void)        //獲取內(nèi)部溫度傳感器溫度值
  115. {
  116.         int ADC_ConvertedValue;//用來(lái)存儲(chǔ)ADC轉(zhuǎn)換出來(lái)的值
  117.          float Current_Temp;
  118.         ADC_ConvertedValue = middleValueFilter(16) ;        //30次取平均
  119.         ADC_ConvertedValue = (ADC_ConvertedValue*825)>>10;//換算成Vsensor
  120.         Current_Temp = (((V25-ADC_ConvertedValue)/Avg_Slope)+25);        //計(jì)算溫度值         
  121.         return Current_Temp;
  122. }
復(fù)制代碼
全部資料51hei下載地址:
ADC - 注入組.7z (181.88 KB, 下載次數(shù): 94)

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:633470 發(fā)表于 2022-1-23 17:03 | 只看該作者
6666孟工可以啊
回復(fù)

使用道具 舉報(bào)

板凳
ID:873541 發(fā)表于 2022-3-1 20:26 | 只看該作者
你好,我想要做測(cè)足底壓力來(lái)進(jìn)行人體姿態(tài)分析,可以交流一下嗎
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表