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

QQ登錄

只需一步,快速開始

搜索
查看: 3598|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

STC8單片機(jī)的AD采樣不穩(wěn),波動(dòng)特別大

[復(fù)制鏈接]
回帖獎(jiǎng)勵(lì) 20 黑幣 回復(fù)本帖可獲得 1 黑幣獎(jiǎng)勵(lì)! 每人限 5 次
跳轉(zhuǎn)到指定樓層
樓主
ID:514692 發(fā)表于 2019-4-24 18:46 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
采樣的波動(dòng)特別大,電壓采樣后轉(zhuǎn)換成0-500mm長(zhǎng)度,波動(dòng)的幅度可以達(dá)到5mm,這個(gè)正常嗎?程序如下:
單片機(jī)源程序如下:
  1. #define N 12
  2. void ADC_Init(void)
  3. {
  4.          //配置P10口為高阻輸入,作為ADC采樣引腳
  5.          P1M0= 0X00;                     
  6.          P1M1= 0X01;

  7.          //使用定時(shí)器掃描結(jié)果
  8.          TMOD= 0x01;                //選擇定時(shí)器T0 在工作方式1上 即16位定時(shí)器
  9.          TH0  = (65536-50000)/256;  //11.592M晶振的一個(gè)機(jī)器周期接近1us 這里5W就是0.05s
  10.          TL0  = (65536-50000)%256;
  11.          EA   = 1;                   //開啟總中斷
  12.          ET0  = 1;                   //開啟定時(shí)器T0
  13.          TR0  = 1;   
  14. }

  15. /*************************************************************************
  16.                           ADC轉(zhuǎn)換函數(shù)
  17.   輸入:ADC通道0~14數(shù)字;      
  18.   輸出:ADC轉(zhuǎn)換值
  19. **************************************************************************/
  20. unsigned int ADC_Start(unsigned charChannel)
  21. {                                                                                                                                                                                                                                      
  22.          unsignedchar DIWEI,GAOWEI;                //A/D轉(zhuǎn)換后換算的電壓值
  23.          unsignedint trans_result,ADC_Data;

  24.          ADC_RES=0;
  25.          ADC_RESL=0;

  26.          ADC_CONTR  = ADC_POWER;                //打開ADC電源
  27.          ADC_CONTR|= ADC_START;           //開始ADC轉(zhuǎn)換,轉(zhuǎn)換完成后硬件將此位清零
  28.          ADC_CONTR|= Channel;                  //ADC模擬通道選擇;可以用整數(shù)代替;如:ADC_CONTR = 10;(二進(jìn)制1010)則選擇P0.2引腳;                                                                                                                              

  29.    _nop_(); //Must wait before inquiry ,
  30.    _nop_(); //設(shè)置ADC_CONTR寄存器后需加4個(gè)CPU時(shí)鐘周期的延時(shí),才能保證值被寫入ADC_CONTR寄存器
  31.    _nop_();
  32.    _nop_();

  33.          //ADC_FLAG轉(zhuǎn)換結(jié)束標(biāo)志位;當(dāng)ADC完成一次轉(zhuǎn)換后,硬件自動(dòng)將此位置1,并向CPU發(fā)出中斷請(qǐng)求;
  34.    while (!(ADC_CONTR & ADC_FLAG));     //等待轉(zhuǎn)換完成,硬件自動(dòng)將此位置1;
  35.    ADC_CONTR &= ~ADC_FLAG;                                     //軟件把ADC_FLAG轉(zhuǎn)換結(jié)束標(biāo)志位清零;等待下次硬件置1


  36.   GAOWEI = ADC_RES; //高8位
  37.          DIWEI= ADC_RESL; //低4位
  38.          trans_result=GAOWEI;
  39.          trans_result=(trans_result<<8)|DIWEI;
  40.          trans_result=trans_result>>4;

  41.    ADC_Data = trans_result;
  42.    return ADC_Data;
  43. }

  44. /*************************************************************************
  45.                           定時(shí)器0中斷服務(wù)函數(shù)
  46.                          中斷方式掃描ADC轉(zhuǎn)換值
  47. **************************************************************************/

  48. void ADC(void) interrupt 1 using 1
  49. {
  50.          unsignedchar i,j,k,count;
  51.          unsignedint V,V1,temp;
  52.          unsignedlong V2,V3;
  53.          unsignedint value_buf[N];
  54.          TH0= (65536-50000)/256;
  55.          TL0= (65536-50000)%256;
  56.          i++;
  57.     value_buf[ i] = ADC_Start(7);
  58. ]         if(i== (N-1))
  59. {
  60. i = 0;
  61. /***冒泡排序*/
  62. for(j=0;j<N-1;j++)
  63. {
  64. for(k=0;k<N-j;k++)
  65. {
  66. if ( value_buf[k]>value_buf[k+1] )
  67. {
  68. temp = value_buf[k];
  69. value_buf[k] =value_buf[k+1];
  70. value_buf[k+1] = temp;
  71. }
  72. }
  73. }
  74. /**********************************/

  75. for(count=1;count<N-1;count++)
  76. V +=value_buf[count];

  77. V3=(long)V*500/4095;   
  78. V2=(long)V*500/4095/10;      
  79. V1=(unsignedint)((long)V*500/4095)%10;     
  80. printf("\r\n%ld", V3);
  81. printf(",%ld", V2);
  82. printf(".%u",V1);
  83. printf(",%u", V);
  84. V=0;
  85. }




  86. /*************************************************************************
  87. 主函數(shù)
  88. **************************************************************************/
  89. void main (void)
  90. {        

  91. UART1_Init();     //UART串口初始化
  92. ADC_Init();                          //ADC初始化函數(shù)
  93. ADC_Start(7);     //ADC采集轉(zhuǎn)換函數(shù)

  94. while(1);     //主循環(huán)
  95. }
復(fù)制代碼


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:514692 發(fā)表于 2019-4-26 10:43 | 只看該作者
已找到原因,電壓基準(zhǔn)波動(dòng)太大造成的。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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