久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 27747|回復: 7
收起左側

STM8L的ADC之測量VDD電壓詳解 含例程

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



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

從第一張圖中可以看到,STM8L內部還有一個內部參考電壓,這個內部參考電壓的電壓值是可知的,且是精確的。由數據手冊可知,內部參考電壓為1.225V。

ADC選擇內部參考電壓作為測量通道,可以測量到內部電壓的轉化值Nadc。
此時,已經VDD的轉化值4096,VREFINT電壓值1.225V及對應的轉化值Nadc。
這些值滿足比例關系,VDD/4096=VREFINT/Nadc
VDD/4096 =1.225/Nadc
VDD=1.225*4096/Nadc

本文使用ADC的單次轉換模式,每隔大約0.5S觸發一次ADC轉換。ADC轉換的通道需要在ADC_SQR寄存器中選擇。
ADC完成一次數據采集轉化后,會進入中斷。我們在中斷中打一個斷點,查看變量VDD_Value中的數據,可以看到此時數據為2976(電壓值被擴大了1000倍),即VDD的電壓為2.976V。.與實際用萬用表測量的2.99V幾乎一樣。
  1. /****************************************************************************************

  2. *開發環境:IAR for stm8 v1.40.1

  3. *硬件平臺:STM8L-DISCOVERY

  4. *功能說明:測量VDD電壓,VDD的計算結果在ADC中斷中,通過仿真,設置斷點,可以在IAR中查看擴大1000被后的VDD電壓數據VDD_Value

  5. *作    者:茗風

  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. *  功    能:延時10ms

  14. *  入口參數:無

  15. *  出口參數:無

  16. *  說    明:

  17. *  范    例:無

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

  19. void delay_100ms(void)

  20. {

  21.   uint8_t i,j;

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

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

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

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

  26.   //此延時函數,延時時間為130ms

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

  28. }

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

  30. *  名    稱:void ADC_Init(void)

  31. *  功    能:初始化ADC

  32. *  入口參數:無

  33. *  出口參數:無

  34. *  說    明:ADC1的測量通道為內部參考電壓,單次轉換模式

  35. *  范    例:無

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

  37. void ADC_Init(void)

  38. {   

  39.    CLK_PCKENR2_PCKEN20=1; //國際慣例,開啟ADC1外設時鐘

  40.    ADC1_TRIGR1_VREFINTON=1;//打開內部參考電壓源

  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  //系統時鐘此時為默認的16M/8=2M,這里分頻后,fadc=2M/2=1M

  45.   

  46.    ADC1_SQR1_DMAOFF=1;    //關閉DMA,暫時不用


  47.    ADC1_CR3_SMTP2=0x06;//采樣時間為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; //選擇內部參考電壓通道

  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事件處理函數

  78. * 入口           參數:無

  79. * 出口           參數:無

  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;//得到的數值單位為mv

  92.    asm("nop");

  93. }
復制代碼




回復

使用道具 舉報

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

使用道具 舉報

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

這么好的東西咋沒人點贊呢???怒贊,狂贊,超贊666
回復

使用道具 舉報

ID:237362 發表于 2018-6-30 09:41 | 顯示全部樓層
學習了
回復

使用道具 舉報

ID:106835 發表于 2018-11-15 15:25 | 顯示全部樓層
學習了,正需要,mark
回復

使用道具 舉報

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

好東西要學習
回復

使用道具 舉報

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

使用道具 舉報

ID:723157 發表于 2020-5-15 15:24 | 顯示全部樓層
教大家一起來點贊!  挺詳細的的
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人综合伊人 | 在线不卡视频 | 国产精品视频网站 | 中文字幕高清视频 | 久久中文字幕视频 | 欧美激情一区二区三级高清视频 | 久久久久综合 | 亚洲第一av | 视频一区在线观看 | 国产人成在线观看 | 亚洲成人免费视频 | 羞羞的视频在线看 | 午夜国产 | 成人高清在线视频 | 国产精品久久久久久久午夜片 | 婷婷国产一区二区三区 | 久热免费 | 欧美激情区| 国产精品视频一区二区三区四蜜臂 | av在线一区二区三区 | 国产高清在线精品一区二区三区 | 中文字幕精品视频在线观看 | 黄色毛片免费看 | 日韩国产在线 | 高清视频一区二区三区 | 香蕉视频在线播放 | 亚洲超碰在线观看 | 97av视频| 久久精品成人 | 亚洲一区二区在线免费观看 | 青娱乐国产 | 国产亚洲一区二区精品 | 精品久久久久久久 | 在线一级片 | 综合自拍| 美女在线视频一区二区三区 | 午夜精品一区二区三区在线观看 | 亚洲精美视频 | 在线播放国产一区二区三区 | 欧美一区二区 | 国产污视频在线 |