找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 10229|回復: 11
打印 上一主題 下一主題
收起左側

關于15系列單片機AD采樣電壓的問題,想測量電池剩余電壓

[復制鏈接]
跳轉到指定樓層
樓主
ID:122751 發(fā)表于 2018-8-21 23:03 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
AD采樣的程序本人已經弄好,想測量電池剩余電壓,但是15系列單片機上電后P1口的io普遍都有4v以上的電壓,而恰恰ad采樣口就在p1口的io上,那我怎么才能消除原有io上的電壓,用來測量電池電壓,不然總是在測量io口上原本的電壓
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:386381 發(fā)表于 2018-8-22 00:33 來自觸屏版 | 只看該作者
這個好辦呀,在P1口接下拉電阻P1口的電壓不就沒了嗎,因為P1口那個電流很小的,是上拉電阻過來的,接個下拉電阻就把它給放掉了,電池電壓沒影響的

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

板凳
ID:213173 發(fā)表于 2018-8-22 06:36 | 只看該作者
沙發(fā)的建議是錯誤的。有很多型號的STC15系列單片機內置有ADC功能,只要把其P1相應端口特殊功能寄存器初始化時設置為高阻即可。
以P1.0設置高阻為例:
        P1M1 = 0x01; //設置P1.0高阻:0000 0001
        P1M0 = 0x00;//設置P1.0高阻 :0000 0000
        P1ASF= 0x01;//設置P1的0通道端口作為模擬輸入
回復

使用道具 舉報

地板
ID:164602 發(fā)表于 2018-8-22 08:58 | 只看該作者
你想多了!
第一:你要測量的電源與單片機共地。
第二:設置好AD轉換通道,設置寄存器如圖所示:

其它設置,去看手冊。STC15的手冊可以從STC官網下載http://www.stcmcu.com/,手冊中還有例子。
第三:開啟AD轉換,單片機會自動從你設置的AD轉換口,讀取數據進行轉換。

例如我的一個小程序(部分)
void ADCInit (void)//ADC設置
{
        P1ASF=0x03;//P10、P11為ADC輸入口。手冊P878
        CLK_DIV=0x20;//ADC轉換結果存放方式。手冊P880
}


void ADC0 (void)//第一路AD轉換函數
{
        ADC_CONTR=0xe8;//開ADC電源、速度最快、開始轉換、P10口。手冊P879
        while (!(ADC_CONTR&0x10));//如果轉換沒結束,則等待
        ADC_CONTR=0x00;//關ADC電源、清轉換完畢標志
        ADCdate=ADC_RES;//ADC轉換數據高兩位。手冊P880
        ADCdate=(ADCdate<<8);
        ADCdate=(ADCdate|ADC_RESL);//合并10位轉換數據
        ADCXX();
}


我測過一節(jié)、兩節(jié)干電池的電壓。
注意:我不是高手,這樣做可能從電路來說是很粗暴的——僅僅是做了程序方面的試驗。
歡迎指正。
回復

使用道具 舉報

5#
ID:155507 發(fā)表于 2018-8-22 09:02 | 只看該作者
你可以運用這個程序
讀ADC內部基準計算MCU的工作電壓, 不需要增加任何硬件零件.


  1. /*---------------------------------------------------------------------*/
  2. /* --- STC MCU International Limited ----------------------------------*/
  3. /* --- STC 1T Series MCU Demo Programme -------------------------------*/
  4. /* --- Mobile: (86)13922805190 ----------------------------------------*/
  5. /* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
  6. /* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/
  7. /* --- Web: www.GXWMCU.com --------------------------------------------*/
  8. /* --- QQ:  800003751 -------------------------------------------------*/
  9. /* 如果要在程序中使用此代碼,請在程序中注明使用了宏晶科技的資料及程序   */
  10. /*---------------------------------------------------------------------*/


  11. /*************        本程序功能說明        **************

  12. 讀ADC內部基準計算MCU的工作電壓, 不需要增加任何硬件零件.

  13. 用STC的MCU的IO方式控制74HC595驅動8位數碼管。

  14. 用戶可以修改宏來選擇時鐘頻率.

  15. 用戶可以在"用戶定義宏"中選擇共陰或共陽. 推薦盡量使用共陰數碼管.

  16. 使用Timer0的16位自動重裝來產生1ms節(jié)拍,程序運行于這個節(jié)拍下, 用戶修改MCU主時鐘頻率時,自動定時于1ms.

  17. 右邊4位數碼管顯示MCU的工作電壓值值.


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

  19. #define MAIN_Fosc                22118400L        //定義主時鐘

  20. #include        "STC15Fxxxx.H"


  21. /***********************************************************/

  22. #define DIS_DOT                0x20
  23. #define DIS_BLACK        0x10
  24. #define DIS_                0x11

  25. #define P1n_pure_input(bitn)                P1M1 |=  (bitn),        P1M0 &= ~(bitn)

  26. /****************************** 用戶定義宏 ***********************************/

  27. #define                LED_TYPE        0x00                //定義LED類型, 0x00--共陰, 0xff--共陽

  28. #define        Timer0_Reload        (65536UL -(MAIN_Fosc / 1000))                //Timer 0 中斷頻率, 1000次/秒

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






  30. /*************        本地常量聲明        **************/
  31. u8 code t_display[]={                                                //標準字庫
  32. //         0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F
  33.         0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
  34. //black         -     H    J         K          L           N        o   P         U     t    G    Q    r   M    y
  35.         0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,
  36.         0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46};        //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1

  37. u8 code T_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};                //位碼


  38. /*************        IO口定義        **************/
  39. sbit        P_HC595_SER   = P4^0;        //pin 14        SER                data input
  40. sbit        P_HC595_RCLK  = P5^4;        //pin 12        RCLk        store (latch) clock
  41. sbit        P_HC595_SRCLK = P4^3;        //pin 11        SRCLK        Shift data clock


  42. /*************        本地變量聲明        **************/

  43. u8         LED8[8];                //顯示緩沖
  44. u8        display_index;        //顯示位索引
  45. bit        B_1ms;                //1ms標志

  46. u8        msecond;

  47. u16        Get_ADC10bitResult(u8 channel);        //channel = 0~7




  48. /**********************************************/
  49. void main(void)
  50. {
  51.         u8        i;
  52.         u16        j;

  53.         P0M1 = 0;        P0M0 = 0;        //設置為準雙向口
  54.         P1M1 = 0;        P1M0 = 0;        //設置為準雙向口
  55.         P2M1 = 0;        P2M0 = 0;        //設置為準雙向口
  56.         P3M1 = 0;        P3M0 = 0;        //設置為準雙向口
  57.         P4M1 = 0;        P4M0 = 0;        //設置為準雙向口
  58.         P5M1 = 0;        P5M0 = 0;        //設置為準雙向口
  59.         P6M1 = 0;        P6M0 = 0;        //設置為準雙向口
  60.         P7M1 = 0;        P7M0 = 0;        //設置為準雙向口
  61.        
  62.         display_index = 0;
  63.         P1ASF = 0;        //對內部基準做ADC
  64.         ADC_CONTR = 0xE0;                        //90T, ADC power on
  65.        
  66.         AUXR = 0x80;        //Timer0 set as 1T, 16 bits timer auto-reload,
  67.         TH0 = (u8)(Timer0_Reload / 256);
  68.         TL0 = (u8)(Timer0_Reload % 256);
  69.         ET0 = 1;        //Timer0 interrupt enable
  70.         TR0 = 1;        //Tiner0 run
  71.         EA = 1;                //打開總中斷
  72.        
  73.         for(i=0; i<8; i++)        LED8[i] = 0x10;        //上電消隱

  74.        
  75.         while(1)
  76.         {
  77.                 if(B_1ms)        //1ms到
  78.                 {
  79.                         B_1ms = 0;
  80.                         if(++msecond >= 200)        //200ms到
  81.                         {
  82.                                 msecond = 0;

  83.                                 for(j=0,i=0; i<16; i++)                j += Get_ADC10bitResult(0);        //讀內部基準ADC, P1ASF=0, 讀0通道
  84.                                 j = (u32)128000UL*16 / j;        // ADC = 1024 * Uref / Ux, 則 Ux = 1024 * Uref / ADC = 1024 * 1.25 / ADC = 1280 / ADC

  85.                                 LED8[5] = j / 100 + DIS_DOT;        //顯示MCU電壓值, 計算時放大了100倍, 電壓有兩位小數.
  86.                                 LED8[6] = (j % 100) / 10;
  87.                                 LED8[7] = j % 10;
  88.                         }
  89.                 }
  90.         }
  91. }
  92. /**********************************************/

  93. //========================================================================
  94. // 函數: u16        Get_ADC10bitResult(u8 channel)
  95. // 描述: 查詢法讀一次ADC結果.
  96. // 參數: channel: 選擇要轉換的ADC.
  97. // 返回: 10位ADC結果.
  98. // 版本: V1.0, 2012-10-22
  99. //========================================================================
  100. u16        Get_ADC10bitResult(u8 channel)        //channel = 0~7
  101. {
  102.         ADC_RES = 0;
  103.         ADC_RESL = 0;

  104.         ADC_CONTR = (ADC_CONTR & 0xe0) | 0x08 | channel;         //start the ADC
  105.         NOP(4);

  106.         while((ADC_CONTR & 0x10) == 0)        ;        //wait for ADC finish
  107.         ADC_CONTR &= ~0x10;                //清除ADC結束標志
  108.         return        (((u16)ADC_RES << 2) | (ADC_RESL & 3));
  109. }



  110. /**************** 向HC595發(fā)送一個字節(jié)函數 ******************/
  111. void Send_595(u8 dat)
  112. {               
  113.         u8        i;
  114.         for(i=0; i<8; i++)
  115.         {
  116.                 dat <<= 1;
  117.                 P_HC595_SER   = CY;
  118.                 P_HC595_SRCLK = 1;
  119.                 P_HC595_SRCLK = 0;
  120.         }
  121. }

  122. /********************** 顯示掃描函數 ************************/
  123. void DisplayScan(void)
  124. {       
  125.         Send_595(~LED_TYPE ^ T_COM[display_index]);                        //輸出位碼
  126.         Send_595( LED_TYPE ^ t_display[LED8[display_index]]);        //輸出段碼

  127.         P_HC595_RCLK = 1;
  128.         P_HC595_RCLK = 0;                                                        //鎖存輸出數據
  129.         if(++display_index >= 8)        display_index = 0;        //8位結束回0
  130. }


  131. /********************** Timer0 1ms中斷函數 ************************/
  132. void timer0 (void) interrupt TIMER0_VECTOR
  133. {
  134.         DisplayScan();        //1ms掃描顯示一位
  135.         B_1ms = 1;                //1ms標志
  136. }


復制代碼


STC15Fxxxx.zip

8.73 KB, 下載次數: 29

回復

使用道具 舉報

6#
ID:65956 發(fā)表于 2018-8-22 11:26 | 只看該作者
可能是你現在的IO口是懸空狀態(tài)吧,在所在測的IO口上加上加一個下拉10-100K的電阻就行了,如果要測試電池電壓,建議還是用分壓電阻方案測試穩(wěn)當點,我自己現在用的是10K+90K方案,測試正常,考慮到只有10位AD,精度并不是很好
回復

使用道具 舉報

7#
ID:122751 發(fā)表于 2018-8-22 13:01 | 只看該作者
angmall 發(fā)表于 2018-8-22 09:02
你可以運用這個程序
讀ADC內部基準計算MCU的工作電壓, 不需要增加任何硬件零件.

并不是讀取單片機的工作電壓,我是想通過io口的ad采樣功能測量18650電池電量
回復

使用道具 舉報

8#
ID:122751 發(fā)表于 2018-8-22 13:02 | 只看該作者
wulin 發(fā)表于 2018-8-22 06:36
沙發(fā)的建議是錯誤的。有很多型號的STC15系列單片機內置有ADC功能,只要把其P1相應端口特殊功能寄存器初始化 ...

但是情況是我設置了高阻態(tài),設置為ad采樣的io還是有電壓
回復

使用道具 舉報

9#
ID:122751 發(fā)表于 2018-8-22 13:14 | 只看該作者
aking991 發(fā)表于 2018-8-22 11:26
可能是你現在的IO口是懸空狀態(tài)吧,在所在測的IO口上加上加一個下拉10-100K的電阻就行了,如果要測試電池電 ...

是懸空狀態(tài)用萬用表測量有電壓,我就是想測量電池電壓,怕ad采樣io口原來的電壓會影響測量的數據,我不知道該怎么樣測量,還有所說的分壓電阻方案,是ad采樣io接上10k+90k的電阻,然后接地,電阻中間引線出來接待測的的電池正極是嗎
回復

使用道具 舉報

10#
ID:122751 發(fā)表于 2018-8-22 13:26 | 只看該作者
HC6800-ES-V2.0 發(fā)表于 2018-8-22 08:58
你想多了!
第一:你要測量的電源與單片機共地。
第二:設置好AD轉換通道,設置寄存器如圖所示:

學習了
回復

使用道具 舉報

11#
ID:213173 發(fā)表于 2018-8-22 15:42 | 只看該作者
18277067187 發(fā)表于 2018-8-22 13:02
但是情況是我設置了高阻態(tài),設置為ad采樣的io還是有電壓

由于是高阻態(tài),此端口懸空時測到的電壓不必理會,不影響對外電路電壓的測量精度。我用STC15W404AS設計的產品從來沒有發(fā)生你擔心問題。
回復

使用道具 舉報

12#
ID:388947 發(fā)表于 2018-8-22 16:04 | 只看該作者
樓下說的有道理
回復

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表