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

QQ登錄

只需一步,快速開始

搜索
查看: 27747|回復(fù): 7
收起左側(cè)

STM8L的ADC之測(cè)量VDD電壓詳解 含例程

  [復(fù)制鏈接]
ID:140343 發(fā)表于 2016-10-10 00:55 | 顯示全部樓層 |閱讀模式
STM8L內(nèi)部含有一個(gè)12位的ADC,擁有25個(gè)輸入通道,包括一個(gè)內(nèi)部溫度傳感器,一個(gè)內(nèi)部參考電壓。



STM8L使用外部參考電壓作為ADC參考電壓,由于VDD,GND一般和ADC的外部參考電壓引腳VREF+,VREF-連接在一起。所以VDD的電壓就是ADC的參考電壓,由于LDO供給MCU的電壓有一定的偏差。所以使用ADC前需要知道VDD的電壓為多少,對(duì)于十二位的ADC,VDD電壓對(duì)應(yīng)的轉(zhuǎn)換出的數(shù)值為4096(2^12).

從第一張圖中可以看到,STM8L內(nèi)部還有一個(gè)內(nèi)部參考電壓,這個(gè)內(nèi)部參考電壓的電壓值是可知的,且是精確的。由數(shù)據(jù)手冊(cè)可知,內(nèi)部參考電壓為1.225V。

ADC選擇內(nèi)部參考電壓作為測(cè)量通道,可以測(cè)量到內(nèi)部電壓的轉(zhuǎn)化值Nadc。
此時(shí),已經(jīng)VDD的轉(zhuǎn)化值4096,VREFINT電壓值1.225V及對(duì)應(yīng)的轉(zhuǎn)化值Nadc。
這些值滿足比例關(guān)系,VDD/4096=VREFINT/Nadc
VDD/4096 =1.225/Nadc
VDD=1.225*4096/Nadc

本文使用ADC的單次轉(zhuǎn)換模式,每隔大約0.5S觸發(fā)一次ADC轉(zhuǎn)換。ADC轉(zhuǎn)換的通道需要在ADC_SQR寄存器中選擇。
ADC完成一次數(shù)據(jù)采集轉(zhuǎn)化后,會(huì)進(jìn)入中斷。我們?cè)谥袛嘀写蛞粋(gè)斷點(diǎn),查看變量VDD_Value中的數(shù)據(jù),可以看到此時(shí)數(shù)據(jù)為2976(電壓值被擴(kuò)大了1000倍),即VDD的電壓為2.976V。.與實(shí)際用萬用表測(cè)量的2.99V幾乎一樣。
  1. /****************************************************************************************

  2. *開發(fā)環(huán)境:IAR for stm8 v1.40.1

  3. *硬件平臺(tái):STM8L-DISCOVERY

  4. *功能說明:測(cè)量VDD電壓,VDD的計(jì)算結(jié)果在ADC中斷中,通過仿真,設(shè)置斷點(diǎn),可以在IAR中查看擴(kuò)大1000被后的VDD電壓數(shù)據(jù)VDD_Value

  5. *作    者:茗風(fēng)

  6. ****************************************************************************************/

  7. #include"iostm8l152c6.h"

  8. #include"stdbool.h"

  9. #include"stdint.h"

  10. uint16_t VDD_Value=0;

  11. /******************************************************************************************************

  12. *  名    稱:void delay_10ms(uint8_t x_ms)

  13. *  功    能:延時(shí)10ms

  14. *  入口參數(shù):無

  15. *  出口參數(shù):無

  16. *  說    明:

  17. *  范    例:無

  18. ******************************************************************************************************/

  19. void delay_100ms(void)

  20. {

  21.   uint8_t i,j;

  22.   for(i=0;i<255;i++)//2*255個(gè)指令周期

  23.     for(j=0;j<255;j++);//2*255個(gè)指令周期

  24.   //delay_10ms共消耗 x_ms*2*255+2*x_ms個(gè)指令周期  

  25.   //255*2*255+2*255=130610us=130ms

  26.   //此延時(shí)函數(shù),延時(shí)時(shí)間為130ms

  27.   //16M/8/2=1M 一個(gè)指令周期為1us

  28. }

  29. /******************************************************************************************************

  30. *  名    稱:void ADC_Init(void)

  31. *  功    能:初始化ADC

  32. *  入口參數(shù):無

  33. *  出口參數(shù):無

  34. *  說    明:ADC1的測(cè)量通道為內(nèi)部參考電壓,單次轉(zhuǎn)換模式

  35. *  范    例:無

  36. ******************************************************************************************************/

  37. void ADC_Init(void)

  38. {   

  39.    CLK_PCKENR2_PCKEN20=1; //國(guó)際慣例,開啟ADC1外設(shè)時(shí)鐘

  40.    ADC1_TRIGR1_VREFINTON=1;//打開內(nèi)部參考電壓源

  41.    ADC1_CR1_ADON=1;  //wakes up the ADC from Power down mode.

  42.    ADC1_CR2_PRESC=1;//Select a sample time of 10 μs

  43. //   0: f(ADC_CLK) = CK

  44. //   1: f(ADC_CLK) = CK/2  //系統(tǒng)時(shí)鐘此時(shí)為默認(rèn)的16M/8=2M,這里分頻后,fadc=2M/2=1M

  45.   

  46.    ADC1_SQR1_DMAOFF=1;    //關(guān)閉DMA,暫時(shí)不用


  47.    ADC1_CR3_SMTP2=0x06;//采樣時(shí)間為24 ADC clock cycles,也就是24*1us=24us

  48. //000: 4 ADC clock cycles

  49. //001: 9 ADC clock cycles

  50. //010: 16 ADC clock cycles

  51. //011: 24 ADC clock cycles

  52. //100: 48 ADC clock cycles

  53. //101: 96 ADC clock cycles

  54. //110: 192 ADC clock cycles

  55. //111: 384 ADC clock cycles

  56.    

  57.    ADC1_SQR1_CHSEL_S28=1; //選擇內(nèi)部參考電壓通道

  58.    

  59.    ADC1_CR1_EOCIE=1;

  60. }


  61. void main(void)

  62. {

  63.   ADC_Init();

  64.   asm("rim");               //enable interrupts

  65.   while(1)

  66.   {

  67.     delay_100ms();

  68.     ADC1_CR1_START=1;

  69.     delay_100ms();

  70.     delay_100ms();

  71.     delay_100ms();

  72.     delay_100ms();

  73.   }

  74. }

  75. /******************************************************************************************************

  76. * 名               稱: ADC中斷

  77. * 功         能: EOC事件處理函數(shù)

  78. * 入口           參數(shù):無

  79. * 出口           參數(shù):無

  80. * 說               明:

  81. * 范              例:無

  82. ******************************************************************************************************/

  83. #pragma vector=COMP_EF2_vector

  84. __interrupt void ADC1_ISR(void)

  85. {

  86.    static uint16_t temp=0;

  87.    PC_ODR_ODR7 ^=0x01;//輸出低電平

  88.    ADC1_SR_EOC=0;

  89.    temp = ADC1_DRH;

  90.    temp = (temp<<8)+ADC1_DRL;

  91.    VDD_Value=(uint32_t)1225*4096/temp;//得到的數(shù)值單位為mv

  92.    asm("nop");

  93. }
復(fù)制代碼




回復(fù)

使用道具 舉報(bào)

ID:100312 發(fā)表于 2017-8-24 20:22 | 顯示全部樓層
這么好的東西咋沒人點(diǎn)贊呢???怒贊,狂贊,超贊666
回復(fù)

使用道具 舉報(bào)

ID:355067 發(fā)表于 2018-6-20 12:02 | 顯示全部樓層

這么好的東西咋沒人點(diǎn)贊呢???怒贊,狂贊,超贊666
回復(fù)

使用道具 舉報(bào)

ID:237362 發(fā)表于 2018-6-30 09:41 | 顯示全部樓層
學(xué)習(xí)了
回復(fù)

使用道具 舉報(bào)

ID:106835 發(fā)表于 2018-11-15 15:25 | 顯示全部樓層
學(xué)習(xí)了,正需要,mark
回復(fù)

使用道具 舉報(bào)

ID:171207 發(fā)表于 2018-11-29 11:56 | 顯示全部樓層

好東西要學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

ID:18591 發(fā)表于 2019-2-15 22:59 | 顯示全部樓層
棒棒棒
回復(fù)

使用道具 舉報(bào)

ID:723157 發(fā)表于 2020-5-15 15:24 | 顯示全部樓層
教大家一起來點(diǎn)贊!  挺詳細(xì)的的
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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