<dl id="xausj"></dl>
    1. <ul id="xausj"><th id="xausj"></th></ul>

      <b id="xausj"></b>
      <cite id="xausj"></cite>
      <b id="xausj"><meter id="xausj"></meter></b>
      <dl id="xausj"><noframes id="xausj"></noframes></dl>
    2. 您好,歡迎訪問上海意泓電子科技有限責(zé)任公司網(wǎng)站!
      4新聞資訊
      您的位置: 首頁 ->  新聞資訊 -> 單片機(jī)

      ?STM32之ADC_3(內(nèi)部通道)

      文章出處:單片機(jī) 責(zé)任編輯:上海意泓電子科技有限責(zé)任公司 發(fā)表時間:
      2020
      11-10

      ADC的內(nèi)部通道: 
       
      STM32的ADC除了可以用外部通道來采集外部模擬電壓信號之外,還有兩個內(nèi)部通道16和17。其中通道16是連接至芯片上的溫度傳感器,通道17是連接至內(nèi)部電源模塊.(所以這兩個通道可以用來檢測STM32芯片d額溫度和電源狀態(tài),就可以檢測芯片運(yùn)行的狀態(tài)啦?。?/p>

      溫度檢測實(shí)例: 
      通道16是把內(nèi)部溫度傳感器輸出的模擬電壓轉(zhuǎn)換成數(shù)字值,通過公式運(yùn)算我們就可以得到溫度值.內(nèi)部溫度傳感器支持的溫度范圍從 -40 至 125攝氏度.精度是比較差的,所以只適合檢測溫度的變化,并不適合做絕對的溫度檢測.(如果需要測量精確的溫度,可以使用一個外置的溫度傳感器)

      main函數(shù): 
      /用于存放ADC1轉(zhuǎn)換的值/ 
      extern __IO u16 ADC_ConvertedValue; 
      /溫度值/ 
      u16 Current_Temp;

      int main(void) 

      /* USART1 config 115200 8-N-1 */ 
      USART1_Config(); 
      Temp_ADC1_Init();

      while (1)

      {

      Delay(0xffffee); // 延時


      Current_Temp=(V25-ADC_ConvertedValue)/Avg_Slope+25;


      printf("\r\n The current temperature= %3d ℃ \r\n,Current_Temp);



      main函數(shù)里面配置好串口1以及ADC1的通道16后,ADC轉(zhuǎn)換的值就被DMA傳輸?shù)紸DC_ConvertedValue變量里面。然后就可以往串口不斷更新溫度數(shù)據(jù)了. 

      **根據(jù)STM32內(nèi)部溫度傳感器檢測溫度的計算公式: 

      溫度 = {(V25 - Vsense)/Avg_Slope}+25** 

      Vsense:通過ADC通道16檢測的ADC轉(zhuǎn)換值(變量)


      V25:是25度時的ADC轉(zhuǎn)換值(常量)


      Avg_Slope:是溫度與Vsense曲線的平均斜率(單位為 mV/ °C 或 μV/ °C)(常量)


      Ps: 

      其中V25以及Avg_Slope都是根據(jù)數(shù)據(jù)手冊定義好的宏(少了個#,好像會放大就不寫了) 

      define V25 0x6EE 

      define Avg_Slope 0x05


      ADC初始化: 

      void Temp_ADC1_Init(void) 

      ADC1_GPIO_Config(); 

      ADC1_Mode_Config(); 

      DMA以及ADC的配置: 

      static ADC1_Mode_Config(void) 

      DMA_InitTypeDef DMA_InitStructure; 

      ADC_InitTypeDef ADC_InitStructure; 

      /這里是DMA的配置/ 

      DMA_DeInit(DMA1_Channel1);


      DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;//ADC1的地址    

      DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue;//內(nèi)存地址  

      DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//外設(shè)為數(shù)據(jù)源

      DMA_InitStructure.DMA_BufferSize = 1;//DMA緩存大小

      DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外設(shè)地址固定

      DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;//內(nèi)存地址固定

      DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //外設(shè)傳輸數(shù)據(jù)單位半字

      DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //內(nèi)存?zhèn)鬏敂?shù)據(jù)單位半字

      DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //循環(huán)傳輸

      DMA_InitStructure.DMA_Priority = DMA_Priority_High;//優(yōu)先級設(shè)置為高

      DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //關(guān)閉內(nèi)存到內(nèi)存的傳輸

      DMA_Init(DMA1_Channel1, &DMA_InitStructure); //填充DMA,配置為DMA1的通道11


      DMA_Cmd(DMA1_Channel1, ENABLE); //使能通道11


      /*這里是ADC的配置*/

      ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//獨(dú)立的ADC模式

      ADC_InitStructure.ADC_ScanConvMode = DISABLE ;//關(guān)閉掃描模式(掃描一般用于多通道采集)

      ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//開啟連續(xù)轉(zhuǎn)換模式(就是不停的進(jìn)行ADC轉(zhuǎn)換)

      ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //不使用外部觸發(fā)轉(zhuǎn)換

      ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//采集的數(shù)據(jù)右對齊

      ADC_InitStructure.ADC_NbrOfChannel = 1; //要轉(zhuǎn)換的通道數(shù)量是1個

      ADC_Init(ADC1, &ADC_InitStructure);//填充ADC1

      RCC_ADCCLKConfig(RCC_PCLK2_Div8); //設(shè)置ADC時鐘的分頻,為PCLK2的8分頻,就是9HZ 72/8 = 9

      ADC_RegularChannelConfig(ADC1, ADC_Channel_16, 1, ADC_SampleTime_239Cycles5);//配置ADC1的通道16為239.5個采樣周期


      ADC_TempSensorVrefintCmd(ENABLE);//使能溫度傳感器和內(nèi)部參考電壓

      /*這里是ADC的復(fù)位校準(zhǔn)操作*/

      ADC_DMACmd(ADC1, ENABLE);//使能ADC1的DMA

      ADC_Cmd(ADC1, ENABLE);   //使能ADC1


      ADC_ResetCalibration(ADC1);//復(fù)位ADC1校準(zhǔn)寄存器

      while(ADC_GetResetCalibrationStatus(ADC1)); //等待校準(zhǔn)寄存器復(fù)位成功


      ADC_StartCalibration(ADC1);//ADC1校準(zhǔn)

      while(ADC_GetCalibrationStatus(ADC1));//等待ADC1校準(zhǔn)成功


      ADC_SoftwareStartConvCmd(ADC1, ENABLE);//使用軟件觸發(fā)ADC轉(zhuǎn)換,因?yàn)闆]有采用外部觸發(fā)



      溫度檢測的ADC初始化和ADC采集外部數(shù)據(jù)時的差不多,只有以下兩條有改變: 

      ADC_RegularChannelConfig(ADC1,ADC_Channel_16,1,ADC_SampleTime_239Cycles5) 

      配置ADC通道16,把周期改為ADC_SampleTime_239Cycles5(239.5周期),這個周期是根據(jù)手冊推薦的內(nèi)部溫度傳感器ADC轉(zhuǎn)換時間為17.1us,這里為28us.


      ADC_TempSensorVrefintCmd(ENABLE); 

      這是一個庫函數(shù),功能是使能或關(guān)閉內(nèi)部溫度傳感器.它是使用內(nèi)部溫度傳感器時必須調(diào)用的,默認(rèn)的溫度傳感器shi不開啟的,當(dāng)然也就測量不到正確的溫度值.


      上海意泓電子科技有限責(zé)任公司 版權(quán)所有 未經(jīng)授權(quán)禁止復(fù)制或鏡像

      CopyRight 2020-2025 www.pendragonrpg.com All rights reserved   滬ICP備2021005866號

      国产中文欧美日韩,色播在线永久免费视频,另类专区亚洲无码,亚洲中文字无码av

      <dl id="xausj"></dl>
      1. <ul id="xausj"><th id="xausj"></th></ul>

        <b id="xausj"></b>
        <cite id="xausj"></cite>
        <b id="xausj"><meter id="xausj"></meter></b>
        <dl id="xausj"><noframes id="xausj"></noframes></dl>