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

QQ登錄

只需一步,快速開始

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

STC8G1K08單片機(jī)P1.0ADC測(cè)量電壓?jiǎn)栴}

  [復(fù)制鏈接]
ID:92556 發(fā)表于 2020-9-5 02:47 | 顯示全部樓層 |閱讀模式
官方例程改的,vcc的電壓顯示是正常的,P1.0,除了接地,是00,輸入什么電壓都是顯示都是65,,
自己看不出問題在哪,,



int *BGV; //內(nèi)部 1.19V 參考信號(hào)源值存放在 idata 中
//idata 的 EFH 地址存放高字節(jié)
//idata 的 F0H 地址存放低字節(jié)
//電壓?jiǎn)挝粸楹练?mV)
unsigned int   v1; v2; v3; pv1; pv2; pv3;  //voltage;        

int vcc; voltage;         

int res; res2;

/* void DelayMS(xg)

{ unsigned char i, j;

        i = 12;
        j = 169;
        do
        {
                while (--j);
        } while (--i);
}          //延時(shí)子程序
*/

void ADCInit()
{
P_SW2 |= 0x80;
ADCTIM = 0x3f; //設(shè)置 ADC 內(nèi)部時(shí)序
P_SW2 &= 0x7f;
ADCCFG = 0x2f; //設(shè)置 ADC 時(shí)鐘為系統(tǒng)時(shí)鐘/2/16/16
ADC_CONTR = 0x8f; //使能 ADC 模塊,并選擇第 15 通道
DelayMS(20) ;
}
int ADCRead()
{ int res ;

ADC_CONTR |= 0x40; //啟動(dòng) AD 轉(zhuǎn)換
_nop_();
_nop_();
while (!(ADC_CONTR & 0x20)); //查詢 ADC 完成標(biāo)志
ADC_CONTR &= ~0x20; //清完成標(biāo)志
res = (ADC_RES << 8) | ADC_RESL; //讀取 ADC 結(jié)果

return res;
}


void ADCInit2()
{

P_SW2 |= 0x80;
ADCTIM = 0x3f; //設(shè)置 ADC 內(nèi)部時(shí)序
P_SW2 &= 0x7f;
ADCCFG = 0x2f; //設(shè)置 ADC 時(shí)鐘為系統(tǒng)時(shí)鐘/2/16/16
ADC_CONTR =0x80; //使能 ADC 模塊,并選擇第 0 通道
DelayMS(20);
}
int ADCRead2()
{  int res2        ;

  ADC_RES=0;
  ADC_RESL=0;

    P1M0=0xFE;
        P1M1=0x01;//P1.0高阻態(tài)
ADC_CONTR |= 0x40; //啟動(dòng) AD 轉(zhuǎn)換
_nop_();
_nop_();
while (!(ADC_CONTR & 0x20)); //查詢 ADC 完成標(biāo)志
ADC_CONTR &= ~0x20; //清完成標(biāo)志
res2 = (ADC_RES << 8) | ADC_RESL; //讀取 ADC 結(jié)果

return res2;
}


void dy (void)
{


int i;
int m ;
BGV = (int idata *)0xef;
ADCInit(); //ADC 初始化

//ES = 1;
//EA = 1;

// ADCRead();
// ADCRead(); //前兩個(gè)數(shù)據(jù)建議丟棄
res = 0;
for (i=0; i<8; i++)
{
res += ADCRead(); //讀取 8 次數(shù)據(jù)
}
res >>= 3; //取平均值

        

ADCInit2();

ADCRead2();
ADCRead2(); //前兩個(gè)數(shù)據(jù)建議丟棄

  res2 = 0;
for (m=0; m<8; m++)
{
res2 += ADCRead2(); //讀取 8 次數(shù)據(jù)
}
res2 >>= 3; //取平均值




vcc = (int)(1024L * *BGV / res); //(10 位 ADC 算法)計(jì)算 VREF 管腳電壓,即電池電壓
pv3=vcc+270;
voltage= (int)(vcc*res2/1024L);
v=voltage*10;  //100k/10k分壓

// vcc = (int)(4096L * *BGV / res); //(12 位 ADC 算法)計(jì)算 VREF 管腳電壓,即電池電壓
//注意,此電壓的單位為毫伏(mV)
}

回復(fù)

使用道具 舉報(bào)

ID:337139 發(fā)表于 2022-3-26 11:08 | 顯示全部樓層
這里有一個(gè)問題,取值平均應(yīng)用流水串的思想要準(zhǔn)確一些。
回復(fù)

使用道具 舉報(bào)

ID:115923 發(fā)表于 2022-3-26 13:03 | 顯示全部樓層
P1M0=0xFE;
        P1M1=0x01;//P1.0高阻態(tài)

沒有設(shè)置P1.0為 ADC, 還是IO模式, 所以讀不到ADC數(shù)據(jù)
回復(fù)

使用道具 舉報(bào)

ID:950349 發(fā)表于 2022-8-15 09:57 | 顯示全部樓層
voltage= (int)(vcc*res2/1024L);
--》 int 是兩個(gè)字節(jié),還是有符號(hào)的;vcc*res2相乘溢出了符號(hào)位,v 是無符號(hào)int。
回復(fù)

使用道具 舉報(bào)

ID:1034262 發(fā)表于 2022-8-15 12:04 | 顯示全部樓層
應(yīng)該監(jiān)控原始的ADC值,如果ADC只正確,則是你計(jì)算的問題,通常要用32位來計(jì)算避免溢出。如果ADC值不正常,則是初始化或硬件連接的問題。
回復(fù)

使用道具 舉報(bào)

ID:213173 發(fā)表于 2022-8-15 13:46 | 顯示全部樓層
給你一個(gè)示例參考,根據(jù)你的硬件電路修改端口定義。
  1. //4位數(shù)碼管電壓表示例
  2. //適用STC8G1K08-20
  3. #include <STC8G.H>
  4. #include "intrins.h"
  5. #define uchar unsigned char
  6. #define uint unsigned int
  7. //宏定義ADC的操作命令
  8. #define ADCTIM  (*(unsigned char volatile xdata *)0xfea8)
  9. #define ADC_POWER   0x80                        //ADC power control dit (宏定義ADC電源控制位)1000 0000
  10. #define ADC_START   0x40                        //ADC start control dit (宏定義ADC啟動(dòng)控制位)0100 0000
  11. #define ADC_FLAG    0x20                        //ADC complete flag (宏定義ADC完成標(biāo)志位)    0010 0000
  12. #define ADC_EPWMT   0x10                        //使能 PWM  實(shí)時(shí)觸發(fā) ADC                     0001 0000
  13. #define VCC_mV      5000                        //VCC

  14. uchar code table[]={//共陰數(shù)碼管段碼"0~f-."
  15.                 0x3f,0x06,0x5b,0x4f,
  16.                 0x66,0x6d,0x7d,0x07,
  17.                 0x7f,0x6f,0x77,0x7c,
  18.                 0x39,0x5e,0x79,0x71,0x40,0x80};
  19. uchar data dis_buf[4];                //緩存數(shù)組
  20. uchar num=0;
  21. uint ADC_mV;                                                //測(cè)量結(jié)果
  22. uint ADC_data;                                                //ADC轉(zhuǎn)換結(jié)果

  23. /*-------------------------------
  24.   1ms延時(shí)子程序(11.0592MHz 1T)
  25. -------------------------------*/
  26. void delayms(uint k)
  27. {
  28.         uint i,j;
  29.         for(i=k;i>0;i--)
  30.                 for(j=1110;j>0;j--);
  31. }
  32. /*-------------------------------------------------------
  33.   InitADC 初始化ADC
  34. -------------------------------------------------------*/
  35. void Init_ADC()
  36. {        //ADC 控制器  電源  啟動(dòng)  完成  --   15通道模擬選擇位
  37.         //ADC_CONTR    B7    B6    B5   B4   B3   B2   B1   B0
  38.         P_SW2 |= 0x80;                                        //打開
  39.         ADCTIM = 0x3f;                                        //設(shè)置 ADC 內(nèi)部時(shí)序
  40.         P_SW2 &= 0x7f;                                        //關(guān)閉
  41.         ADCCFG = 0x27;                                        //設(shè)置ADC結(jié)果右對(duì)齊,速度為512系統(tǒng)時(shí)鐘
  42.         ADC_RES=0;                                                //清除ADC_RES存儲(chǔ)器以前的結(jié)果
  43.         ADC_RESL=0;
  44.         ADC_CONTR=ADC_POWER;                         //ADC 開啟電源
  45.         delayms(1);                                                //上電延時(shí)1ms
  46. }
  47. /*---------------------------------------------------
  48.         讀取ADC結(jié)果
  49. ----------------------------------------------------*/
  50. uint GetADCResult(uchar CH)
  51. {
  52.         ADC_CONTR=ADC_POWER|ADC_START|CH;//啟動(dòng)轉(zhuǎn)換1100 1000
  53.         _nop_();_nop_();                                //小延時(shí)
  54.         while (!(ADC_CONTR & ADC_FLAG));//等待ADC轉(zhuǎn)換完成標(biāo)志置位 1010 0000
  55.         ADC_CONTR &=~ADC_FLAG;                        //清完成標(biāo)志
  56.         return ADC_RES<<8|ADC_RESL;                //返回十位ADC結(jié)果
  57. }

  58. /*----------------------
  59.   main主程序
  60. ----------------------*/
  61. void main()                                                       
  62. {
  63.         P1M1 = 0x01;                                         //設(shè)置P1.0高阻其余雙向
  64.         P1M0 = 0x00;                                         //設(shè)置P1.0高阻其余雙向
  65.         P3M1 = 0x00;                                         //設(shè)置P3雙向
  66.         P3M0 = 0x00;                                         //設(shè)置P3雙向
  67.         P5M0 = 0x00;                                         //設(shè)置P5雙向
  68.         P5M1 = 0x00;                                         //設(shè)置P5雙向
  69.         Init_ADC();
  70.         while(1)
  71.         {
  72.                 ADC_data = GetADCResult(0);
  73.                 ADC_mV=VCC_mV*(long)ADC_data/1024;//強(qiáng)制轉(zhuǎn)換數(shù)據(jù)類型(32位)運(yùn)算,得到結(jié)果mV
  74.                 dis_buf[0]=table[ADC_mV/1000%10];
  75.                 dis_buf[1]=table[ADC_mV/100%10];
  76.                 dis_buf[2]=table[ADC_mV/10%10];
  77.                 dis_buf[3]=table[ADC_mV%10];
  78.                 P3=0x00;                                //消隱
  79.                 P1&=0x0f;                        //清位碼
  80.                 P1|=~(0x10<<num); //送位碼
  81.                 if(num==0)P3=dis_buf[num]|0x80;//送段碼+小數(shù)點(diǎn)
  82.                 else P3=dis_buf[num];  //送段碼
  83.                 num=++num%4;
  84.         }
  85. }
復(fù)制代碼

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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