STM32 ADC單通道采集 (STM32F103C8T6 ADC1的0通道 )


// STM32F103C8T6 的ADC1 通道有10路,分別是:
// 10 腳PA0 ADC12_IN0
// 11 腳PA1 ADC12_IN1
// 12 腳PA2 ADC12_IN2
// 13 腳PA3 ADC12_IN3
// 14 腳PA4 ADC12_IN4
// 15 腳PA5 ADC12_IN5
// 16 腳PA6 ADC12_IN6
// 17 腳PA7 ADC12_IN7
// 18 腳PA8 ADC12_IN8
// 19 腳PA9 ADC12_IN9
// ADC12 意為可配成ADC1或ADC2,不是有ADC12
//以下是main.c 程序;

#include "stm32f10x.h"
#include "stm32f10x_tim.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_adc.h"

float adc_data=0,dyzh=0; //采集值變量,電壓顯示值變量
//引用請指明出處https://www.cnblogs.com/beiyhs/p/12320695.html          ** 北有寒山 ***

void ADC_GPIO_Init(void)                            //ADC-GPIO輸入引腳配置,在此可以設置10路外部輸入通道
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //使能AHB預分頻器到端口A的開關
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//引腳復用 進行重映射時要開啟AFIO 時鍾

GPIO_InitTypeDef GPIO_InitStructure;                                              //聲明結構變量
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;             //定義PA0,PA1腳為AD輸入
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;                      //IO口為模擬輸入模式
//GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;            //AD口設置為浮空輸入
GPIO_Init(GPIOA, &GPIO_InitStructure);                                         //按以上參數設置A口 A0/A1
}

//********************************************************************************************
void ADC1_Init(void) //配置ADC參數及采集
{

RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //使能AHB預分頻器到外設ADC1的開關
RCC_ADCCLKConfig(RCC_PCLK2_Div8) ;                                   //時鍾分頻72M/8=9M 最大時鍾不超過14M
ADC_DeInit(ADC1);                                                                        //ADC復位
ADC_DMACmd(ADC1, DISABLE);                                                //禁止DMA

ADC_InitTypeDef ADC_InitStuctrue;                                              //聲明ADC結構變量
ADC_InitStuctrue.ADC_Mode = ADC_Mode_Independent;          //ADC 獨立工作模式
ADC_InitStuctrue.ADC_ScanConvMode = DISABLE;                   //是否掃描_單通道
ADC_InitStuctrue.ADC_ContinuousConvMode = DISABLE;         //是否連續_單次
ADC_InitStuctrue.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None; //不用外部觸發,軟件觸發轉換
ADC_InitStuctrue.ADC_DataAlign=ADC_DataAlign_Right;           //數據右對齊
ADC_InitStuctrue.ADC_NbrOfChannel = 1;                                   //結構體_ADC-通道個數_單通道
//ADC_InitStuctrue.ADC_ScanDirection=ADC_ScanDirection_Backward; //數據覆蓋/瀏覽方向
ADC_Init(ADC1,&ADC_InitStuctrue);                                            //按以上參數設置ADC1

ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_1Cycles5);
//配置內容和ADC外設的具體對接函數 (ADC端口1 ,ADC通道0 ,轉換序號-第1個轉換 ,轉換的周期)
ADC_Cmd(ADC1,ENABLE);                                                        //使能ADC1
ADC_ResetCalibration(ADC1);                                                    //ADC寄存器復位校准函數
while(ADC_GetResetCalibrationStatus(ADC1));                         //等待上一步完成
ADC_StartCalibration(ADC1);                                                     //開始指定ADC的校准狀態
while(ADC_GetCalibrationStatus(ADC1));                                  //等待上一步完成
}
//******************************************************************************************
void delay_ms(void)
{
  unsigned char i,j;
  for(i=255;i>0;i--)
     {
      for(j=250;j>0;j--);
     }
}

//******************************************************************************************
//******************************************************************************************
int main(void)
{
  ADC_GPIO_Init();                                         //配置ADC的IO口
  ADC1_Init();                                                 //配置ADC參數及采集

  while (1)
   {
   delay_ms();
   ADC_SoftwareStartConvCmd(ADC1, ENABLE); //開關_ADC軟件觸發-開關 狀態寄存器為0
   while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==RESET);    //等待ADC完成
   adc_data=ADC_GetConversionValue(ADC1);    //所得數據即為ADC數據

   dyzh=(adc_data*3.27)/4095;                               //轉換采集值為電壓值
                                                                               //參考電壓3.27V,12位分辨率4095
                                                                               //此處可以設斷點,查看上面dyzh值
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM