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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6360|回復: 9
收起左側

stc8單片機ADC切換采樣異常問題

[復制鏈接]
ID:708541 發表于 2021-3-22 15:23 | 顯示全部樓層 |閱讀模式
任意單個通道采樣沒有問題,連續切換通道采樣就出現異常,比如我用P1.0和P1.1,這2個腳連續ADC采樣,P1.0第一次采樣正常,通道++,切換到P1.1采樣,也正常,然后循環切換到P1.0的時候,P1.0是沒有電壓輸入的,P1.1的輸入3.3V,采樣的結果直接賦到P1.0里面,意思就是說,P1.1有電壓那直接給P1.0,好像芯片內部P1.0和P1.1聯通了一樣,程序我調試了一天,我肯定不是程序的問題,我懷疑是芯片的問題了。
回復

使用道具 舉報

ID:895064 發表于 2021-3-22 16:06 | 顯示全部樓層
我也懷疑是芯片的問題
回復

使用道具 舉報

ID:123289 發表于 2021-3-22 16:38 | 顯示全部樓層
在AD的硬件中,有一個采樣電容,當你下達采樣命令后,會經歷如下的過程:
1、將這個電容與端口連通,并保持若干個時鐘。目的讓電容上得到與端口一樣的電壓。
2、再切斷與端口的連接,防止在進行電壓比較時,電壓有波動,影響、絞亂逐次逼近的邏輯。
3、接下來才進行真正的AD轉換(逐次逼近),需要N個時鐘周期,得到AD值。
所以,采樣時要注意(這是精華):
切換端口后,要過一段時間再下達采樣命令,因為剛切換后,采樣電容上是上一個通道的電壓,需要有一個充放電的過程,才能變為新通道端口上的電壓。這一點相當重要!!新手一般不會考慮到這一點,許多高手也吃它的苦。表現為采樣電壓的數據不穩定,其實是部分地受上個通道的電壓“殘余”影響了。

回到樓主的問題:P1.0是沒有電壓輸入的,即空腳。當切換到P1.0之后,采樣電容上的電壓還是上個通道P1.1上的電壓,這時盡管它接改到P1.0上了,但采樣電容被浮空(接在空腳上),也就沒有充放電回路,電壓也就不會有變化了,當然……,不必再說了。

讀不透AD采樣的原理,就無法理解采樣不準的原因!

評分

參與人數 1黑幣 +5 收起 理由
ax6808 + 5

查看全部評分

回復

使用道具 舉報

ID:708541 發表于 2021-3-22 17:08 | 顯示全部樓層
以前STC15系列都不會出現這樣的問題,stc8,往后出的單片機感覺技術都不是很成熟,經常出現一些奇怪的問題,
回復

使用道具 舉報

ID:879348 發表于 2021-3-22 17:20 | 顯示全部樓層
因為采樣保持電容的存在
回復

使用道具 舉報

ID:1065343 發表于 2023-3-5 23:59 | 顯示全部樓層
問題解決了嗎?我也遇到同樣的問題
回復

使用道具 舉報

ID:579397 發表于 2023-3-6 01:00 | 顯示全部樓層
yzwzfyz 發表于 2021-3-22 16:38
在AD的硬件中,有一個采樣電容,當你下達采樣命令后,會經歷如下的過程:
1、將這個電容與端口連通,并保 ...

結合這層的評論,樓主在切換通道采用多少次,看官方的范例,需要丟棄前兩次的結果。

ADCRead();
  ADCRead();                                  //前兩個數據建議丟棄

    res = 0;
    for (i=0; i<8; i++)
    {
        res += ADCRead();                       //讀取8次數據
    }
    res >>= 3;                                  //取平均值

回復

使用道具 舉報

ID:1034262 發表于 2023-3-6 10:12 | 顯示全部樓層
不是芯片的問題,芯片要有這個問題,根本就沒法面市。
ADC輸入懸空的通道,采樣時,采樣電容沒法充放電,所以看似受上一個通道的影響。
樓主要多了解一下ADC的原理,就不會有此問。
回復

使用道具 舉報

ID:975054 發表于 2023-5-24 17:27 | 顯示全部樓層
405616736 發表于 2023-3-6 01:00
結合這層的評論,樓主在切換通道采用多少次,看官方的范例,需要丟棄前兩次的結果。

ADCRead();

說起STC15通道ADC范例這個8次平均代碼,當然沒有問題。
我之前用20腳STC8G1K08又多出好多腳感覺不爽,近期改8腳STC8G1K08A (練練多腳復用,體積沒小多少,還厚一些,才便宜幾毛,好手工焊而已)。雙路ADC(因引腳不夠,其中1路直接改用15通道先測MCU供電電壓VCC,再換算電池電壓了,另外一路P55腳復用,P30P31串口調試ISPLED復用等等)。之前2個通道ADC代碼全部放在一起共用不少代碼,只順序切換通道讀取轉換一下,沒有刻意中間隔一段時間(之前2個空操作,這次有地方就多加了3個),也沒用8次平均方法,每次都一次順利讀取轉換成功?赡苁俏抑皽y的內置2個都是電池電壓,比較穩定或者精度要求沒那么高吧(這次另外一路測的光敏電阻和1M大電阻分壓值,光敏電阻還并聯了一個LED,罕見見的。。。。玩唄)!

void BAT()                //VCC電壓ADC15,P55電壓ADC5,低電量告警及充電指示等(早晚光控代碼另列); P3031P55三腳復用最簡方案用   230523;
{  
    u16 res, *BGV;                  //res:ADC結果(分辨率); *BGV:指針變量;
    res=0;                                        //         230524:int全改為u16沒有問題(但得同時改!);
    BGV = (u16 idata *)0xef;        //獲取內部電壓(1次即可),內部1.19V參考源值存放在idata中,EFH高字節F0H低字節;單位mV;

    P5IE=P5M1=0x20, R=G=b=1;                //1、ADC前:P55允許輸入短暫置高阻,關彩燈可提高ADC穩定準確度!
                                                    //2. ADC設置(2句共用):
    ADCCFG = 0x2f;                              //設置ADC時鐘為系統時鐘/2/16 (含右對齊);
    ADCTIM = 0x3f;                              //設置ADC內部時序:(手冊建議3f,2A~3F);
                                                    //3、ADC15:        VCC和Vbat電壓檢測;                     
    ADC_CONTR = 0xcf;                           //使能ADC模塊,并選擇第15通道,啟動轉換3合1;
    _nop_(),_nop_(),_nop_(),_nop_(),_nop_();           //參考手冊2個空操作
    while (!(ADC_CONTR & 0x20));                //查詢ADC完成標志
    ADC_CONTR &= ~0x20;                         //清完成標志
//  ADC_CONTR &=  0x7F;                                    //ADC轉換完即斷電更省電;        (這里后面再一起關);
    res = (ADC_RES << 8) | ADC_RESL;            //讀取ADC結果 (右對齊:高2位低8位,前面自動補0);
    VCC =(u16)(1024L * *BGV/res);        //先算1次后面再分好;  再處理Vbat修正值+150;
    Vbat=VCC+150L;                                 //

                                                 //4、ADC5: VP55電壓檢測/早晚判斷;                                             
    ADC_CONTR = 0xc5;                           //使能ADC模塊,并選擇第15通道,啟動轉換3合1;
    _nop_(),_nop_(),_nop_(),_nop_(),_nop_();           //參考手冊2個空操作
    while (!(ADC_CONTR & 0x20));                //查詢ADC完成標志
    ADC_CONTR &= ~0x20;                         //清完成標志
    ADC_CONTR &=  0x7F;                                    //ADC轉換完即斷電更省電;        (這里后面再一起關);
    res  = (ADC_RES << 8) | ADC_RESL;           //讀取ADC結果 (右對齊:高2位低8位,前面自動補0);
    VP55 =(u16)((u32)VCC*(u32)res >>10);        //220524:/1024改右移10位快,注意變量運算轉換避免溢出錯誤等;                           

    if(CHG==0)                      //5、低電量告警/自動待機; 未充電有效;   230518;               
   {
    if(Vbat>=3438 && Vbat<=3480)                                                 //1-5%告警:紅燈PD2秒快慢閃1遍;同時關大燈;           
      {W=R=G=b=1, dl_ms(100),R=0,dl_ms(50),R=1,dl_ms(100),R=0,dl_ms(100),R=1;}
    if(Vbat<3438) { W=R=G=b=1, status=2;}                           //<1%燈全滅轉狀態2:自動待機;                                                                        
   }                                                                                                                                                   
    else                            //6、充電狀態指示:4種;   不進PD不待機!  230516;            
   {status=3, R=G=b=1;                                                        //轉狀態3:充電指示;先滅彩燈;
    if   (Vbat>4132) {G=0,dl_ms( 100),G=1,     dl_ms( 500);}       //   100%:綠燈常閃;  可當提醒;  (95%當充滿保護,全按0℃,+5mV);
    else                                                                                 
    {if  (Vbat>4077) {G=0,dl_ms(1000),G=1,     dl_ms( 100);}       // > 90%:綠燈亮1秒,    閃1次;
     else                                                                                          
     {if (Vbat>3918) {G=0,dl_ms(1000),G=1, R=0,dl_ms( 100),  R=1;} // > 75%:綠燈亮1秒,紅燈閃1次;         230502 增加1檔;
      else                                                                                   
      {if(Vbat>3716) {R=0,dl_ms(1000),R=1, G=0,dl_ms( 100),  G=1;} // > 50%:紅燈亮1秒,綠燈閃1次;                                             
       else          {R=0,dl_ms(1000),R=1,     dl_ms( 100);}       //<= 50%:紅燈亮1秒,    閃1次;                                      
   }}}}
}


評分

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

查看全部評分

回復

使用道具 舉報

ID:975054 發表于 2023-5-25 01:11 | 顯示全部樓層
ax6808 發表于 2023-5-24 17:27
說起STC15通道ADC范例這個8次平均代碼,當然沒有問題。
我之前用20腳STC8G1K08又多出好多腳感覺不爽,近 ...

串口測試/監控打印情況:
   printf("VCC = %4.3f",(f32)VCC /1000),printf("V  \n\n");          
   printf("Vbat= %4.3f",(f32)Vbat/1000),printf("V  \n\n");          
   printf("VP55= %4.3f",(f32)VP55/1000),printf("V  \n\n");          
   printf("VLED= %4.3f",(f32)(VCC-VP55)/1000),printf("V  \n\n");        
   printf("  Kc=%2bu",Kc),printf("  DN=%2bu",DN), printf("  status=%1bu\n",status);

串口助手顯示:
VCC = 3.736V                 //ADC15
Vbat= 3.886V                  // VCC+0.15V 電池防反接二極管5819壓降
VP55= 1.371V                //ADC5:光控電路檢測點電壓
VLED= 2.365V                //大LED燈壓降( VCC-VP55)
Kc= 6  DN= 1  status=0  //Kc:短按組合彩燈模式切換次數0-10循環
                                     //DN=0白天/1晚上   
                                     //status=0正常工作/1一鍵關機ISP/2自動待機/3充電指示
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91操操操 | 奇米超碰| 激情欧美一区二区三区中文字幕 | 久久久久国产精品 | 国产黄色在线观看 | 亚洲精品视频免费 | 天天操网 | 亚洲一区毛片 | 精品一二三区在线观看 | 在线观看中文字幕视频 | 91网站在线看 | 在线欧美视频 | 亚洲视频在线观看一区二区三区 | 亚洲美女网站 | 国产精品日韩欧美一区二区三区 | 综合精品| 亚洲精品久久久久中文字幕欢迎你 | 精品欧美一区二区三区免费观看 | 99国产精品久久久 | 精品一区二区三区在线观看国产 | 亚洲一区二区电影在线观看 | 国产高清一区二区 | 亚洲视频在线观看一区二区三区 | 婷婷综合 | 国产精品视频一区二区三区四蜜臂 | 欧美激情视频一区二区三区在线播放 | 成人av一区 | 亚洲精品一区二区网址 | 欧美一区二区三区四区五区无卡码 | 日韩一级精品视频在线观看 | 国产精品久久久久久久久久久久久 | 国产高清一区二区三区 | 日本三级全黄三级三级三级口周 | 日韩精品成人免费观看视频 | 久久久久久久一区二区 | 久草色视频 | 羞羞的视频免费观看 | 成人在线免费 | 午夜影院在线免费观看视频 | 午夜成人在线视频 | 国产小视频在线观看 |