欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標(biāo)題: IAP15W4K58S4單片機(jī)的ad讀數(shù)問題 [打印本頁]

作者: 188461    時(shí)間: 2018-8-28 15:04
標(biāo)題: IAP15W4K58S4單片機(jī)的ad讀數(shù)問題
宏晶IAP15W4K58S4單片機(jī)最小模塊,測AD值,兩個(gè)10k電阻串聯(lián),測a點(diǎn)的ad值不是1024的二分之一,而是700多,為什么?????測b點(diǎn)的ad值就是1023,為什么?????

緊急求助

IMG_20180828_150527.jpg (2.66 MB, 下載次數(shù): 45)

IMG_20180828_150527.jpg

作者: wulin    時(shí)間: 2018-8-28 16:51
你能確認(rèn)兩個(gè)10K電阻的實(shí)際阻值相同?相應(yīng)端口是否設(shè)為高阻和模擬輸入模式?
作者: devcang    時(shí)間: 2018-8-28 17:29


AD的參考電壓是多少,要是參考電壓的1半,結(jié)果才是那樣。不然,就是自己的參考電壓,2路AD,其中1路是參考電壓,另1路是測試的電壓。
作者: lilao3    時(shí)間: 2018-8-29 00:23
看你的情況,貌似IO口沒有配置成模擬輸入,默認(rèn)有弱上拉,所以理論值512,實(shí)際測700多。


作者: 188461    時(shí)間: 2018-8-29 09:25
wulin 發(fā)表于 2018-8-28 16:51
你能確認(rèn)兩個(gè)10K電阻的實(shí)際阻值相同?相應(yīng)端口是否設(shè)為高阻和模擬輸入模式?

一個(gè)電阻為9.88k,一個(gè)為9.95k。P1端口:P1M1 = 0;        P1M0 = 0;        //設(shè)置為準(zhǔn)雙向口
相應(yīng)的p1.0端口通過ADC_CONTR設(shè)置為模擬輸入了
為什么要設(shè)置成高阻呢???
作者: 188461    時(shí)間: 2018-8-29 09:35
devcang 發(fā)表于 2018-8-28 17:29
AD的參考電壓是多少,要是參考電壓的1半,結(jié)果才是那樣。不然,就是自己的參考電壓,2路AD,其中1路是 ...

沒有設(shè)置基準(zhǔn)參考電壓,因?yàn)閼?yīng)用簡單,直接與vcc比較的
測試時(shí)vcc電壓是穩(wěn)定的5.02v,串聯(lián)電阻兩端電壓5.00v
作者: 188461    時(shí)間: 2018-8-29 09:38
lilao3 發(fā)表于 2018-8-29 00:23
看你的情況,貌似IO口沒有配置成模擬輸入,默認(rèn)有弱上拉,所以理論值512,實(shí)際測700多。

        ADC_CONTR = 0x80;         //開AD轉(zhuǎn)換電源,第一次使用時(shí)要打開start the ADC
        for (g=0;g<10000;g++);
        P1ASF|=0x08;                        // 選擇P1.3作為AD轉(zhuǎn)換通道,0x02= 0000 1000       
        ADC_CONTR=0xE3;         // 選擇P1.3作為AD轉(zhuǎn)換通道,最高轉(zhuǎn)換速度,清轉(zhuǎn)換完成標(biāo)志。
        for (g=0;g<1000;g++);
        ADC_CONTR|=0x08;  
        while((ADC_CONTR & 0x10) == 0)        ;        //wait for ADC finish
        ADC_CONTR &= 0xE7;                //將ADC_FLAG清0, 0xE7=1110 0111B,ADC_FLAG=0
        AD_Dat = (ADC_RES<<2)|(ADC_RESL&0x03);        //高低字節(jié)拼接成一個(gè)10位數(shù)。
        return AD_Dat;
這個(gè)程序是p1.3口的,設(shè)置為模擬輸入了啊
作者: 小帖    時(shí)間: 2018-8-30 16:17
VCC是否是單片機(jī)的基準(zhǔn)電壓,還是大于基準(zhǔn)電壓,用的10位的AD,最大值了
作者: qdsupdu    時(shí)間: 2018-8-30 17:17
hdx  好東西  好東西  謝謝嘍
作者: wulin    時(shí)間: 2018-8-30 17:23
188461 發(fā)表于 2018-8-29 09:25
一個(gè)電阻為9.88k,一個(gè)為9.95k。P1端口:P1M1 = 0;        P1M0 = 0;        //設(shè)置為準(zhǔn)雙向口
相應(yīng)的p1.0端口通過ADC_ ...

你把AD輸入端設(shè)為準(zhǔn)雙向口當(dāng)然測出的電壓比實(shí)際電壓高,因?yàn)闇?zhǔn)雙向口使用了內(nèi)部上拉電阻,這個(gè)電阻相當(dāng)于接在你的外電路的a、b兩點(diǎn)之間。也就是并聯(lián)在上分壓電阻上從而改變上分壓電阻阻值。
作者: 188461    時(shí)間: 2018-8-31 16:45
wulin 發(fā)表于 2018-8-30 17:23
你把AD輸入端設(shè)為準(zhǔn)雙向口當(dāng)然測出的電壓比實(shí)際電壓高,因?yàn)闇?zhǔn)雙向口使用了內(nèi)部上拉電阻,這個(gè)電阻相當(dāng)于 ...

P1M1 = 0x08;        P1M0 = 0x00;
我換了P1.3端口,并把其置為高阻模式了,可是沒有效果啊
設(shè)為準(zhǔn)雙向口時(shí),把電源和地?fù)Q位置,測得ad值也是700多,換位置前后ad值差不多,說明內(nèi)部上拉電阻沒并聯(lián)在上分壓電阻上啊。這是不是說明總的ad值有1500多【哭暈】
這是怎么回事呢,求解答,萬分感謝!!!!!
作者: 188461    時(shí)間: 2018-8-31 16:46
小帖 發(fā)表于 2018-8-30 16:17
VCC是否是單片機(jī)的基準(zhǔn)電壓,還是大于基準(zhǔn)電壓,用的10位的AD,最大值了

vcc為4.75v,沒接基準(zhǔn)電壓,電路簡單

作者: dxxa    時(shí)間: 2019-5-28 16:37
188461 發(fā)表于 2018-8-29 09:38
ADC_CONTR = 0x80;         //開AD轉(zhuǎn)換電源,第一次使用時(shí)要打開start the ADC
        for (g=0;g

單片機(jī)的AD轉(zhuǎn)換時(shí)只能使用一個(gè)模擬輸入通道嗎
作者: dbxzjq    時(shí)間: 2021-8-29 04:24
本帖最后由 dbxzjq 于 2021-8-31 00:14 編輯

#define ADC_POWER   0x80            //ADC電源控制位
#define ADC_FLAG    0x10            //ADC完成標(biāo)志
#define ADC_START   0x08            //ADC起始控制位
#define ADC_SPEEDLL 0x00            //540個(gè)時(shí)鐘
#define ADC_SPEEDL  0x20            //360個(gè)時(shí)鐘
#define ADC_SPEEDH  0x40            //180個(gè)時(shí)鐘
#define ADC_SPEEDHH 0x60            //90個(gè)時(shí)鐘

/*----------------------------
初始化ADC
----------------------------*/
void InitADC(void)
{
    //P1M0 &= ~0x10;
    //P1M1 |= 0x10;        
    P1ASF = 0x07;                   //設(shè)置P1口為AD口
    ADC_RES = 0;                    //清除結(jié)果寄存器
        ADC_RESL = 0;
        CLK_DIV |= 0x20;                //ADRJ=1,ADC_RES[1:0]存放高2位ADC結(jié)果,ADC_RESL[7:0]存放低8位結(jié)果
    ADC_CONTR = ADC_POWER | ADC_SPEEDL; //開啟ADC電源,配置ADC轉(zhuǎn)換速度為180個(gè)時(shí)鐘
    //Delay(2);                       //ADC上電并延時(shí)
}

unsigned int GetADCResult(unsigned char ch)
{
        //unsigned int a=0;
    ADC_CONTR =   ADC_POWER | ADC_SPEEDL | ch | ADC_START;
    _nop_();                        //等待4個(gè)NOP
    _nop_();
    _nop_();
    _nop_();
    while (!(ADC_CONTR & ADC_FLAG));//等待ADC轉(zhuǎn)換完成
    ADC_CONTR &= ~ADC_FLAG;         //Close ADC
        //a=ADC_RES;
        //a=a<<8|ADC_RESL;
    return (unsigned int)ADC_RES<<8|ADC_RESL;                 //返回ADC結(jié)果
}

測量出來的ADC都非常正常的啊!切換通道后必須等待四個(gè)空周期才能進(jìn)行測量,另外這型號對于IO口不用設(shè)置為高阻輸入的,只管P1ASF設(shè)置對應(yīng)為模擬口即可,不過手冊上也說最好把ADC對應(yīng)的測量IO配置為高阻輸入為好樓主的代碼:發(fā)現(xiàn)合成10位有問題,如下:
AD_Dat = (ADC_RES<<2)|(ADC_RESL&0x03);        //高低字節(jié)拼接成一個(gè)10位數(shù)。
修改為AD_Dat =(int)(ADC_RES<<2)|(ADC_RESL&0x03);        //高低字節(jié)拼接成一個(gè)10位數(shù)。
這里(int)(ADC_RES<<2)因?yàn)樽笠?位后,超出來寄存器的8位寬度,8位機(jī)只能默認(rèn)R0-R7寄存器組都為8位的,必須得強(qiáng)制轉(zhuǎn)換為16位,
編譯器才會把ADC_RES<<2放在兩個(gè)臨時(shí)的R0-R7寄存器組里頭再進(jìn)行運(yùn)算,得到的最終結(jié)果才是正確的值

比如ADC_RES=11111111的二進(jìn)制值,執(zhí)行ADC_RES<<2后=11111100,但是如果(int)(ADC_RES<<2)就會不一樣了,它會換成16位進(jìn)行運(yùn)算
得到的會是0000 0011 1111 1100的16位值再位或|(ADC_RESL&0x03)這部分的結(jié)果送給予6位變量AD_Dat

作者: 188610329    時(shí)間: 2021-8-29 22:36
你把b端,值接到單片機(jī)VCC引腳嘗試一下,(即和單片機(jī)同一基準(zhǔn))看看a的讀數(shù)是不是512左右。
或者,你把b端接到P3.7口, 把P3.7設(shè)置為推挽輸出,高電平。然后再測a端讀數(shù),我懷疑你之所以a端700多,是因?yàn)槟鉨端超過量程了,只能顯示1023,其實(shí)1400了……
作者: chanmk    時(shí)間: 2021-10-5 17:57
AD_Dat = (ADC_RES<<2)|(ADC_RESL&0x03);        //高低字節(jié)拼接成一個(gè)10位數(shù)。
關(guān)于這句代碼,是不需要強(qiáng)制轉(zhuǎn)換為int的, 因?yàn)锳D_Dat是int類型,2個(gè)字節(jié)16位的,式子右邊的高位是不會丟失的。




歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1