女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于STM32片內(nèi)信號(hào)的ADC應(yīng)用演示案例

茶話MCU ? 來(lái)源:茶話MCU ? 2024-01-13 13:42 ? 次閱讀

很多STM32芯片里往往內(nèi)置了專用的ADC通道,比方用來(lái)測(cè)量Vrefint,VBAT的分壓或溫度傳感器的輸出電壓信號(hào)。不同系列所內(nèi)置的模擬信號(hào)通道可能有差異。這里以STM32G4系列為例,它內(nèi)置了對(duì)應(yīng)于Vrefint,VBAT的三分之一分壓和溫度傳感器的輸出電壓的專用模擬通道。

55e3b76c-b1ce-11ee-8b88-92fbcf53809c.png

55eed25a-b1ce-11ee-8b88-92fbcf53809c.png

下面的示例就是針對(duì)上述3個(gè)通道進(jìn)行AD,并測(cè)量相關(guān)電壓和片內(nèi)溫度,最終得到3個(gè)結(jié)果,分別是VRefint電壓,VBAT的電壓,片內(nèi)溫度。

5601ae20-b1ce-11ee-8b88-92fbcf53809c.png

實(shí)現(xiàn)過(guò)程是這樣的,大體分四步:【有點(diǎn)點(diǎn)麻雀雖小五臟俱全的味道】

1、TIMER1 更新事件觸發(fā)ADC的轉(zhuǎn)換;

2、CPU基于EOC中斷獲取ADC結(jié)果;

3、對(duì)ADC結(jié)果進(jìn)行換算,得到電壓值和溫度值存放在特定內(nèi)存位置;

4、基于DMA傳輸通過(guò)UART將最終結(jié)果在串口終端顯示;

其中,TIMER1的CH1輸出PWM波形,其更新事件做ADC的轉(zhuǎn)換啟動(dòng)信號(hào)。每次的TIMER更新事件觸發(fā)ADC,3個(gè)通道掃描方式轉(zhuǎn)換。這里的UART使用片內(nèi)LPUART,使用它主要是考慮它跟板載虛擬串口直接相連,沒(méi)有其它特別用意。

56178920-b1ce-11ee-8b88-92fbcf53809c.png

我使用STM32G474Nucleo板來(lái)進(jìn)行下面實(shí)驗(yàn)。其中VDD=3.3v,VBAT與VDD相連。另外,ADC模塊的參考電壓也是3.3v.

使用CubeMx圖形化工具進(jìn)行配置,先看TIMER配置:

56327942-b1ce-11ee-8b88-92fbcf53809c.png

再看看ADC的基本配置:

564d2ba2-b1ce-11ee-8b88-92fbcf53809c.png

LPUART的基本配置:

567b7d90-b1ce-11ee-8b88-92fbcf53809c.png

因?yàn)橐褂肁DC中斷和UART的DMA傳輸,記得做ADC的中斷響應(yīng)使能配置和LPUART的DMA配置,這里只使用UART的TX DMA功能。

568bdb0e-b1ce-11ee-8b88-92fbcf53809c.png

使用CubeMx主要配置主要是上面這些。

在組織用戶代碼前,先簡(jiǎn)單介紹下片內(nèi)溫度傳感器的內(nèi)容。該溫度傳感器針對(duì)不同溫度有不同電壓輸出,其輸出電壓跟溫度呈線性關(guān)系。ST公司針對(duì)片內(nèi)溫度傳感器在兩個(gè)特定溫度【30℃和110℃或30℃和130℃】、基于特定參考電壓【3v或3.3v,不同系列以數(shù)據(jù)手冊(cè)為準(zhǔn)】生成了1組校準(zhǔn)值并存放于片內(nèi)特定FLASH位置。

STM32G4系列的校準(zhǔn)值是在參考電壓為3v,30℃和110℃條件下的兩個(gè)值,在數(shù)據(jù)手冊(cè)里還給出了校準(zhǔn)值的片內(nèi)存放地址。

569b3356-b1ce-11ee-8b88-92fbcf53809c.png

針對(duì)這個(gè)溫度傳感器的使用,ST公司在參考手冊(cè)里還給出了計(jì)算公式。其實(shí),有無(wú)這個(gè)公式無(wú)所謂,我們不難自行推理出來(lái)?!綯S_DATA代表某時(shí)刻測(cè)得的傳感器輸出電壓對(duì)應(yīng)的轉(zhuǎn)換值,TS_CAL1/TS_CAL2分別表示在30℃和110℃條件下基于傳感器輸出電壓的轉(zhuǎn)換值。】

56b32d8a-b1ce-11ee-8b88-92fbcf53809c.png

另外,前面提過(guò),ST公司在手冊(cè)里給出了溫度傳感器的兩個(gè)溫度下的校準(zhǔn)值,但要注意生成校準(zhǔn)值的ADC模塊所用參考電壓跟我們實(shí)際應(yīng)用時(shí)AD模塊所用的參考基準(zhǔn)電壓可能不一致。如果不一致,就必須將ADC值換算成同一基準(zhǔn)參考電壓條件下的數(shù)據(jù)。目前在ST手冊(cè)里也特別強(qiáng)調(diào)這點(diǎn)了。我把上面一副圖再貼一遍于此【見(jiàn)黃色語(yǔ)句提醒】。

55eed25a-b1ce-11ee-8b88-92fbcf53809c.png

關(guān)于這點(diǎn),我們也不難理解。同一待測(cè)信號(hào)、同一ADC模塊在不同基準(zhǔn)參考電壓下轉(zhuǎn)換值往往是不一樣的。見(jiàn)下面示意圖加以理解。

56d1ca4c-b1ce-11ee-8b88-92fbcf53809c.png

完成各項(xiàng)配置后,創(chuàng)建軟件工程。添加必需的用戶代碼:

#define TX_Timeout (9999)


#define TS_CAL1_ADDR  (0x1FFF75A8)  //用于計(jì)算溫度傳感器數(shù)據(jù)
#define TS_CAL2_ADDR  (0x1FFF75CA) //用于計(jì)算溫度傳感器數(shù)據(jù)


#define size1 (40)


char WDVol[size1],BatVol[size1],InVol[size1];


uint16_t ts_c30,ts_c110;


uint16_t ADCResult[3],convCNT;


volatile  uint32_t Completed,EndofCon_Flag;


floatVBATVolt;//存放BBAT電壓最終結(jié)果
floatVRefint;//存放Vrefint電壓最終結(jié)果
floatTemperature;//存放片外溫度℃最終結(jié)果


int main(void)
{
/* USER CODE BEGIN 1 */


/* USER CODE END 1 */


/* MCU Configuration--------------------------------------------------------*/


/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();


/* USER CODE BEGIN Init */


/* USER CODE END Init */


/* Configure the system clock */
  SystemClock_Config();


/* USER CODE BEGIN SysInit */


/* USER CODE END SysInit */


/* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_ADC1_Init();
  MX_LPUART1_UART_Init();
  MX_TIM1_Init();
/* USER CODE BEGIN 2 */


ts_c30=*(uint16_t*)(TS_CAL1_ADDR);//讀取30℃時(shí)的ADC校準(zhǔn)值


   ts_c110 =  *(uint16_t *)(TS_CAL2_ADDR);//讀取110℃時(shí)的ADC校準(zhǔn)值


  HAL_ADCEx_Calibration_Start(&hadc1 , ADC_SINGLE_ENDED);//ADC校準(zhǔn)


  HAL_ADC_Start_IT(&hadc1);//啟動(dòng)ADC并開(kāi)啟轉(zhuǎn)換中斷


  HAL_TIM_PWM_Start(&htim1,  TIM_CHANNEL_1);




/* USER CODE END 2 */


/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
  {
/* USER CODE END WHILE */


/* USER CODE BEGIN 3 */


if (EndofCon_Flag!=0)
  {
    VBATVolt=(ADCResult[0]/4095.)* 3.3 * 3.;  


    VRefint=(ADCResult[1]/4095.) * 3.3;  


    Temperature = 30.+ (88.*(ADCResult[2]-((ts_c30/1.1))))/(ts_c110 - ts_c30);


      EndofCon_Flag=0;


//HAL_UART_Transmit(&hlpuart1, (uint8_t *)WDVol ,sizeof(WDVol), TX_Timeout);


HAL_GPIO_WritePin(GPIOC,GPIO_PIN_3,GPIO_PIN_RESET);//forauxiliarytest


      HAL_UART_Transmit_DMA(&hlpuart1, (uint8_t *)WDVol ,sizeof(WDVol));


while(Completed==0){}
      Completed =0;



//HAL_UART_Transmit(&hlpuart1, (uint8_t *)InVol ,sizeof(InVol), TX_Timeout);
HAL_UART_Transmit_DMA(&hlpuart1,(uint8_t*)InVol,sizeof(InVol));


while(Completed==0)  {}
      Completed =0;




//HAL_UART_Transmit(&hlpuart1, (uint8_t *)BatVol ,sizeof(BatVol), TX_Timeout);
      HAL_UART_Transmit_DMA(&hlpuart1, (uint8_t *)BatVol ,sizeof(BatVol));

while(Completed==0){}
      Completed =0;


      HAL_GPIO_WritePin( GPIOC,GPIO_PIN_3,GPIO_PIN_SET);  //for auxiliary test


   }    


  }
/* USER CODE END 3 */
}


//ADCEOC 中斷處理函數(shù)
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)
{


  ADCResult[convCNT]=HAL_ADC_GetValue(&hadc1); //獲取轉(zhuǎn)換結(jié)果并存入數(shù)組


  convCNT++;


if(convCNT==3)  


{
    convCNT=0;


    EndofCon_Flag=0xff;


sprintf(WDVol,"Internal PN Temperature: %5.3f  
",Temperature);  


sprintf(InVol,"Internal Reference Volt: %5.3f  
",VRefint);  


sprintf(BatVol,"Current Battery Volt:   %5.3f  

",VBATVolt);


}


}


//UART DMA傳輸完成處理函數(shù)


void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{


  Completed=0xff;
}

基于上面的配置和測(cè)試代碼,我們就可以看到最終的結(jié)果了。定時(shí)器周期性地觸發(fā)ADC,每得到3個(gè)ADC結(jié)果就進(jìn)行數(shù)據(jù)處理,然后通過(guò)UART以DMA方式傳輸?shù)酱诮K端。注意VBat電壓是測(cè)量結(jié)果再乘以3得到的。

56e29926-b1ce-11ee-8b88-92fbcf53809c.png

56ef71be-b1ce-11ee-8b88-92fbcf53809c.png

針對(duì)上面的應(yīng)用演示,最后給幾點(diǎn)相關(guān)應(yīng)用提醒:

1、針對(duì)溫度傳感器做測(cè)量時(shí),校準(zhǔn)時(shí)使用的參考電壓與實(shí)際應(yīng)用不一致時(shí)要做換算,換算成相同參考電壓的數(shù)據(jù)后再做計(jì)算。這點(diǎn)前面也提過(guò)了。

2、使用TIMER的TRGO觸發(fā)ADC,如果選擇類似比較事件、更新事件來(lái)觸發(fā)ADC時(shí),此時(shí)ADC對(duì)觸發(fā)極性的選擇是無(wú)效的,或者說(shuō)ADC的轉(zhuǎn)換僅依賴于觸發(fā)事件時(shí)間點(diǎn)。如果是選擇TIMER的Ocref信號(hào)作為觸發(fā)源,此時(shí)ADC的硬件觸發(fā)的極性選擇是有效的,可以是上沿或下沿觸發(fā),甚至是雙沿觸發(fā)。這時(shí)就得根據(jù)需要選擇合適的觸發(fā)沿。【可以進(jìn)一步閱讀本公眾號(hào)文章《STM32定時(shí)器觸發(fā)ADC的時(shí)序話題》】

3、這里使用UART的DMA傳輸依次顯示三個(gè)結(jié)果于串口終端,三個(gè)啟動(dòng)UART DMA傳輸?shù)暮瘮?shù)須保留適當(dāng)時(shí)間間隔,即等上次傳輸完成后再啟動(dòng)下一次傳輸,因?yàn)檫@里每次傳輸使用的是同一DMA通道。否則沒(méi)法全部正常輸出。比如上面3次UART DMA傳輸?shù)拇a改成下面這樣子:

 HAL_UART_Transmit_DMA(&hlpuart1, (uint8_t *)WDVol ,sizeof(WDVol));

 HAL_UART_Transmit_DMA(&hlpuart1,(uint8_t*)InVol,sizeof(InVol));


  HAL_UART_Transmit_DMA(&hlpuart1, (uint8_t *)BatVol ,sizeof(BatVol))

這時(shí)輸出結(jié)果會(huì)變成下面的情形,總是只能看到一個(gè)結(jié)果的輸出,即第一次啟動(dòng)的DMA傳輸結(jié)果。

5704c6c2-b1ce-11ee-8b88-92fbcf53809c.png

如果想省事點(diǎn),直接在相鄰2次DMA傳輸間加上合適延時(shí)也行。我這里根據(jù)DMA傳輸完成事件來(lái)決定執(zhí)行下一次發(fā)送。在DMA傳輸完成中斷里設(shè)置Completed變量為非0值表示當(dāng)前一輪DMA傳輸完成。

4、對(duì)于那些在中斷和主程序里都會(huì)被訪問(wèn)的變量,記得將它們冠以volatile。

下圖的三路波形是我調(diào)試時(shí)輔助使用的。

第一路表示計(jì)數(shù)器的計(jì)數(shù)變化,顯然是單向向上計(jì)數(shù)模式。

第二路是TIMER1通道1的PWM輸出波形。

第三路是我每次基于DMA實(shí)現(xiàn)UART發(fā)送時(shí)拉高拉低的波形。平常管腳電平為高,在實(shí)現(xiàn)DMA傳輸過(guò)程中拉低。

57198de6-b1ce-11ee-8b88-92fbcf53809c.png

好,今天的分享就到這里,供君參考。下次再聊。







審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 溫度傳感器
    +關(guān)注

    關(guān)注

    48

    文章

    3023

    瀏覽量

    158039
  • 輸出電壓
    +關(guān)注

    關(guān)注

    2

    文章

    1458

    瀏覽量

    39017
  • PWM波
    +關(guān)注

    關(guān)注

    0

    文章

    100

    瀏覽量

    17247
  • VDD
    VDD
    +關(guān)注

    關(guān)注

    1

    文章

    316

    瀏覽量

    34749
  • STM32芯片
    +關(guān)注

    關(guān)注

    0

    文章

    38

    瀏覽量

    4561

原文標(biāo)題:基于STM32片內(nèi)信號(hào)的ADC應(yīng)用演示

文章出處:【微信號(hào):stmcu832,微信公眾號(hào):茶話MCU】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    STM32內(nèi)FLASH操作說(shuō)明

    STM32內(nèi)FLASH操作說(shuō)明
    發(fā)表于 07-08 09:51

    STM32內(nèi)FLASH操作步驟

    STM32內(nèi)FLASH可分為哪幾類?如何去使用STM32內(nèi)FLASH呢?
    發(fā)表于 11-01 06:36

    STM32內(nèi)FLASH有何功能

    怎么去操作STM32的FLSAH呢?STM32內(nèi)FLASH有何功能?
    發(fā)表于 11-01 06:35

    STM32內(nèi)FLASH該如何去使用呢

    STM32內(nèi)FLASH可分成哪幾部分?STM32的FLASH共有幾個(gè)鍵值呢?
    發(fā)表于 11-02 07:08

    2812內(nèi)ADC采樣時(shí)間計(jì)算

    本內(nèi)容提供了2812內(nèi)ADC采樣時(shí)間計(jì)算。1)序列采樣模式(SMODE = 0)[attach]12497[/attach]
    發(fā)表于 09-05 11:39 ?3576次閱讀

    STM32F0xx_FLASH編程(內(nèi)) 配置詳細(xì)過(guò)程

    STM32F0xx_FLASH編程(內(nèi))配置詳細(xì)過(guò)程
    的頭像 發(fā)表于 04-07 14:21 ?3595次閱讀
    <b class='flag-5'>STM32</b>F0xx_FLASH編程(<b class='flag-5'>片</b><b class='flag-5'>內(nèi)</b>) 配置詳細(xì)過(guò)程

    STM32F1_ 內(nèi)FLASH編程

    STM32F1_內(nèi)FLASH編程
    的頭像 發(fā)表于 04-08 10:28 ?4284次閱讀
    <b class='flag-5'>STM32</b>F1_ <b class='flag-5'>片</b><b class='flag-5'>內(nèi)</b>FLASH編程

    STM32 ADC基礎(chǔ)內(nèi)容

    STM32的每個(gè)ADC有數(shù)條復(fù)用模擬輸入通道,具體通道數(shù)因不同系列及型號(hào)而異。內(nèi)溫度傳感器、內(nèi)部參考電壓、VBAT還可以與內(nèi)部模擬通道相連,便于測(cè)量和使用。
    的頭像 發(fā)表于 03-12 13:51 ?6232次閱讀
    <b class='flag-5'>STM32</b> <b class='flag-5'>ADC</b>基礎(chǔ)內(nèi)容

    AD7760:24位、2.5 MSPS、100 dB,Σ-Δ ADC,內(nèi)置內(nèi)緩沖 數(shù)據(jù)手冊(cè)

    AD7760:24位、2.5 MSPS、100 dB,Σ-Δ ADC,內(nèi)置內(nèi)緩沖 數(shù)據(jù)手冊(cè)
    發(fā)表于 03-20 17:19 ?11次下載
    AD7760:24位、2.5 MSPS、100 dB,Σ-Δ <b class='flag-5'>ADC</b>,內(nèi)置<b class='flag-5'>片</b><b class='flag-5'>內(nèi)</b>緩沖 數(shù)據(jù)手冊(cè)

    STM32CubeMX | 28 - STM32內(nèi)Flash的使用

    本系列文章匯總:STM32CubeMX系列教程本篇文章主要介紹如何使用STM32中的內(nèi)FLash。1. 準(zhǔn)備工作硬件準(zhǔn)備開(kāi)發(fā)板首先需要準(zhǔn)備一個(gè)開(kāi)發(fā)板,這里我準(zhǔn)備的是
    發(fā)表于 12-01 20:36 ?7次下載
    <b class='flag-5'>STM32</b>CubeMX | 28 - <b class='flag-5'>STM32</b><b class='flag-5'>片</b><b class='flag-5'>內(nèi)</b>Flash的使用

    STM32內(nèi)FLASH燒寫錯(cuò)誤導(dǎo)致ST-li

    STM32內(nèi)FLASH燒寫錯(cuò)誤導(dǎo)致ST-li
    發(fā)表于 12-02 18:06 ?7次下載
    <b class='flag-5'>STM32</b><b class='flag-5'>片</b><b class='flag-5'>內(nèi)</b>FLASH燒寫錯(cuò)誤導(dǎo)致ST-li

    STM32F1 使用easyflash操作內(nèi)flash

    STM32F1 使用easyflash操作內(nèi)flash
    發(fā)表于 12-09 10:06 ?15次下載
    <b class='flag-5'>STM32</b>F1 使用easyflash操作<b class='flag-5'>片</b><b class='flag-5'>內(nèi)</b>flash

    STM32U5系列內(nèi)ADC1和ADC4實(shí)現(xiàn)過(guò)程(上)

    有人使用STM32U5系列MCU開(kāi)發(fā)產(chǎn)品,在用到ADC結(jié)合DMA傳輸時(shí)遇到點(diǎn)障礙,這里針對(duì)內(nèi)ADC1和
    的頭像 發(fā)表于 07-30 09:27 ?1535次閱讀
    <b class='flag-5'>STM32</b>U5系列<b class='flag-5'>片</b><b class='flag-5'>內(nèi)</b><b class='flag-5'>ADC</b>1和<b class='flag-5'>ADC</b>4實(shí)現(xiàn)過(guò)程(上)

    STM32U5系列內(nèi)ADC1和ADC4實(shí)現(xiàn)過(guò)程(下)

    現(xiàn)在對(duì)ADC4基于DMA鏈表模式做演示,其實(shí)就一個(gè)節(jié)點(diǎn)。 選擇ADC4的4個(gè)內(nèi)部信號(hào)通道,掃描模式,連續(xù)轉(zhuǎn)換,DMA傳輸轉(zhuǎn)換結(jié)果,并令DMA工作在外設(shè)字到內(nèi)存字的循環(huán)模式。使用Cube
    的頭像 發(fā)表于 07-30 09:30 ?1805次閱讀
    <b class='flag-5'>STM32</b>U5系列<b class='flag-5'>片</b><b class='flag-5'>內(nèi)</b><b class='flag-5'>ADC</b>1和<b class='flag-5'>ADC</b>4實(shí)現(xiàn)過(guò)程(下)

    【深度測(cè)評(píng)】HPM6750 MCU內(nèi)16位ADC精度測(cè)試

    【深度測(cè)評(píng)】HPM6750 MCU內(nèi)16位ADC精度測(cè)試
    的頭像 發(fā)表于 10-30 17:43 ?3364次閱讀
    【深度測(cè)評(píng)】HPM6750 MCU<b class='flag-5'>片</b><b class='flag-5'>內(nèi)</b>16位<b class='flag-5'>ADC</b>精度測(cè)試