會員登陸
帳號:

密碼:

記住我



忘記密碼?

現在註冊!
網站導航
最新下載
訪問統計 (自2012/5/3)


正在流覽:   1 名訪客



(1) 2 »


PIC18F4520 ADC問題
新會員
註冊日期:
2月06日 19:34:11
所屬群組:
註冊會員
文章: 6
等級: 1; EXP: 47
HP : 0 / 11
MP : 2 / 21
離線
你好,各位大大,小弟目前使用PIC18F4520,最近在研究ADC轉換,想將input的電壓顯示在LCD上,輸入腳位為RA0,解析度算出5/1023=0.00488,在input為5V時應顯示D=1023,但顯示出的數值卻是64,想請問一下各位大大,這是為什麼,及如何解決這問題,
謝謝。

以下是我的程式:

#include "p18f4520.h"
#include "delays.h"
#include "evm_lcd.h"
#include "adc.h"
#include <stdlib.h>
#include <stdio.h>
#pragma config OSC=HS,BOREN=OFF,BORV=2,PWRT=ON,WDT=OFF,LVP=OFF
#define OSC_CLOCK 10

void main()
{
char LCD_name[] = "Chicken Test 123";
float adc0_volt;
int adc0_dec;
int adc0_volt1;
int adc0_volt2;
char Buf[16];


TRISA = 0b00000001; // Setup RA0=Input RA1=Output


// Initialise LCD
OpenLCD();
WriteCmdLCD(0*01);
LCD_Set_Cursor(0,0);
putsLCD(LCD_name);
Delay10KTCYx(21);


OpenADC(
ADC_FOSC_16 & // A/D clock source set to 32Tosc
ADC_LEFT_JUST & // ADRESH:ADRESL from roght
ADC_20_TAD, // A/D Acquisition time: 20TAD
ADC_CH0 & // Analog Channel0 AN0
ADC_INT_OFF & // ADC Interrupt off
ADC_VREFPLUS_VDD & // Vref+ = VDD
ADC_VREFMINUS_VSS, // Vref- = VSS
0b1110 //ADCON1 AN0=Analog
);

while(1)
{
ConvertADC(); // Start an A/D Conversion
while(BusyADC()); // Wait for Conversion Finished
adc0_dec=ReadADC(); // Read A/D Result

// Convert Floating Point to Decimal
adc0_volt=0.0048875855327468*adc0_dec;
adc0_volt1=(unsigned int)adc0_volt;
adc0_volt2=(unsigned int)((adc0_volt-adc0_volt1)*10);

sprintf(Buf,"D=%4u V=%u.%uV",adc0_dec,adc0_volt1,adc0_volt2);
WriteCmdLCD(0*01);
LCD_Set_Cursor(1,0);
putsLCD(Buf);


Delay10KTCYx(125);

} // End While
}

2月07日 11:22:45
轉換PDF檔 列印


Re: PIC18F4520 ADC問題
資深會員
註冊日期:
2010/07/12 16:45
來自 台灣的某一個角落
所屬群組:
註冊會員
文章: 261
等級: 15; EXP: 11
HP : 0 / 352
MP : 87 / 8459
離線
引用:

ssnow1314 寫道:
你好,各位大大,小弟目前使用PIC18F4520,最近在研究ADC轉換,想將input的電壓顯示在LCD上,輸入腳位為RA0,解析度算出5/1023=0.00488,在input為5V時應顯示D=1023,但顯示出的數值卻是64,想請問一下各位大大,這是為什麼,及如何解決這問題,
謝謝。

以下是我的程式:

#include "p18f4520.h"
#include "delays.h"
#include "evm_lcd.h"
#include "adc.h"
#include <stdlib.h>
#include <stdio.h>
#pragma config OSC=HS,BOREN=OFF,BORV=2,PWRT=ON,WDT=OFF,LVP=OFF
#define OSC_CLOCK 10

void main()
{
char LCD_name[] = "Chicken Test 123";
float adc0_volt;
int adc0_dec;
int adc0_volt1;
int adc0_volt2;
char Buf[16];


TRISA = 0b00000001; // Setup RA0=Input RA1=Output


// Initialise LCD
OpenLCD();
WriteCmdLCD(0*01);
LCD_Set_Cursor(0,0);
putsLCD(LCD_name);
Delay10KTCYx(21);


OpenADC(
ADC_FOSC_16 & // A/D clock source set to 32Tosc
ADC_LEFT_JUST & // ADRESH:ADRESL from roght
ADC_20_TAD, // A/D Acquisition time: 20TAD
ADC_CH0 & // Analog Channel0 AN0
ADC_INT_OFF & // ADC Interrupt off
ADC_VREFPLUS_VDD & // Vref+ = VDD
ADC_VREFMINUS_VSS, // Vref- = VSS
0b1110 //ADCON1 AN0=Analog
);

while(1)
{
ConvertADC(); // Start an A/D Conversion
while(BusyADC()); // Wait for Conversion Finished
adc0_dec=ReadADC(); // Read A/D Result

// Convert Floating Point to Decimal
adc0_volt=0.0048875855327468*adc0_dec;
adc0_volt1=(unsigned int)adc0_volt;
adc0_volt2=(unsigned int)((adc0_volt-adc0_volt1)*10);

sprintf(Buf,"D=%4u V=%u.%uV",adc0_dec,adc0_volt1,adc0_volt2);
WriteCmdLCD(0*01);
LCD_Set_Cursor(1,0);
putsLCD(Buf);


Delay10KTCYx(125);

} // End While
}


請問你adc0_dec=ReadADC(); adc0_dec的值是多少?
拿電表量量AN0腳位的電是多少V?

2月07日 12:06:55
轉換PDF檔 列印


Re: PIC18F4520 ADC問題
新會員
註冊日期:
2月06日 19:34:11
所屬群組:
註冊會員
文章: 6
等級: 1; EXP: 47
HP : 0 / 11
MP : 2 / 21
離線
AN0是打一個0~5V的方波
adc0_dec顯示分別為0和64

2月07日 12:26:57
轉換PDF檔 列印


Re: PIC18F4520 ADC問題
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 14480
等級: 73; EXP: 3
HP : 1080 / 1800
MP : 4826 / 75805
離線
我想這除錯要分兩階段來看:

1. ADC 轉換是否有到全範圍。ADC 輸入 Ov ~ 5V 時,底下的 adc0_dec 的轉換值是否有從 0x0000 ~ 0x03FF 呢?

ConvertADC(); // Start an A/D Conversion
while(BusyADC()); // Wait for Conversion Finished
adc0_dec=ReadADC(); // Read A/D Result

2. 轉換用浮點數運算? 這對 8-bit MCU 是件很耗損的事。建議使用 itoa( ) 函數做 Hex to Decimal to ASCII 的轉換 (0 ~ 1023)

3. 一個轉換bit值對應到電壓值為 4.88mV。所以將直放達 100 倍來做整數運算即可。如果轉換電壓為 1V :

(1V /5V) x 1024 = 205
205 x 488 = 100040 = 1000.40mV

所以以整數方式算出來的電壓值記住小數點的位置即可。

2月07日 12:39:40
轉換PDF檔 列印


Re: PIC18F4520 ADC問題
新會員
註冊日期:
2月06日 19:34:11
所屬群組:
註冊會員
文章: 6
等級: 1; EXP: 47
HP : 0 / 11
MP : 2 / 21
離線
引用:

Ryang 寫道:
我想這除錯要分兩階段來看:

1. ADC 轉換是否有到全範圍。ADC 輸入 Ov ~ 5V 時,底下的 adc0_dec 的轉換值是否有從 0x0000 ~ 0x03FF 呢?

ConvertADC(); // Start an A/D Conversion
while(BusyADC()); // Wait for Conversion Finished
adc0_dec=ReadADC(); // Read A/D Result

2. 轉換用浮點數運算? 這對 8-bit MCU 是件很耗損的事。建議使用 itoa( ) 函數做 Hex to Decimal to ASCII 的轉換 (0 ~ 1023)

3. 一個轉換bit值對應到電壓值為 4.88mV。所以將直放達 100 倍來做整數運算即可。如果轉換電壓為 1V :

(1V /5V) x 1024 = 205
205 x 488 = 100040 = 1000.40mV

所以以整數方式算出來的電壓值記住小數點的位置即可。


我想在第一點發生了問題,ADC輸入0~5V時,adc0_dec的轉換值只有0x0000和0x0040兩個數值,中間數值並沒有顯示
想請問這個問題該怎麼處裡呢?

2月07日 13:09:17
轉換PDF檔 列印


Re: PIC18F4520 ADC問題
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 14480
等級: 73; EXP: 3
HP : 1080 / 1800
MP : 4826 / 75805
離線
ADC 轉換參數:

ADC_LEFT_JUST & // ADRESH:ADRESL from roght

請改用 ADC_RIGHT_JUST 向右調整


底下是 W401 Lab 3-1 做 ADC 的設定範例:

//************************************************
//* PIC18F4520 在 ADC Peripheral Library 的歸類  *
//* 為 V5 , 在使用 OpenADC() 時要參考              *
//* Function: InitializeAD                       *
//*        - Fosc/32 clock source                *
//*        - Left justified                      *
//*        - 1 analog channels, 0 references     *
//*        - Channel 0                           *
//*        - Disable A/D interrupt               *
//************************************************
void InitializeAD(void)
{
    
OpenADC(  ADC_FOSC_32
            
& ADC_LEFT_JUST
            
& ADC_4_TAD,
              
ADC_CH0
            
& ADC_INT_OFF
            
& ADC_REF_VDD_VSS,
              
ADC_1ANA);
}

2月07日 13:22:06
轉換PDF檔 列印


Re: PIC18F4520 ADC問題
新會員
註冊日期:
2月06日 19:34:11
所屬群組:
註冊會員
文章: 6
等級: 1; EXP: 47
HP : 0 / 11
MP : 2 / 21
離線
剛剛嘗試改為ADC_RIGHT_JUST及上述的設定範例

adc0_dec的轉換結果變成了0和1

另外想到忘記說明使用的開發版為APP025

2月07日 13:42:58
轉換PDF檔 列印


Re: PIC18F4520 ADC問題
資深會員
註冊日期:
2010/07/12 16:45
來自 台灣的某一個角落
所屬群組:
註冊會員
文章: 261
等級: 15; EXP: 11
HP : 0 / 352
MP : 87 / 8459
離線
一開始只跑這段程式碼,
ConvertADC(); // Start an A/D Conversion
while(BusyADC()); // Wait for Conversion Finished
adc0_dec=ReadADC(); // Read A/D Result
Nop(); //斷點停在這
用watch看adc0_dec
你可以試著把AN0只接5V
看adc0_dec轉換的值是不是1023
然後把AN0接地
看adc0_dec轉換的值是不是0

如果不是,ADC有錯。
拿電表直接量MCU AN0的PIN,說不定你灌5V進去的位子錯誤電壓被分掉了。
若是正常,換其他的AN1 or AN2 在去轉換看看
*******************************************************
如果以上都是正確

你可以故意把adc0_dec=ReadADC();這行改成
adc0_dec=0x3FF;

看你LCM的顯示是否為1023,
若不是,你計算與顯示有錯誤,請自行修改。
*******************************************************
若以上都正確,那就是你輸入5V方波那邊來源有問題。

我就想到這些簡易的除錯方法,請參考。

2月07日 15:54:00
轉換PDF檔 列印


Re: PIC18F4520 ADC問題
新會員
註冊日期:
2月06日 19:34:11
所屬群組:
註冊會員
文章: 6
等級: 1; EXP: 47
HP : 0 / 11
MP : 2 / 21
離線
引用:

linwangco 寫道:
一開始只跑這段程式碼,
ConvertADC(); // Start an A/D Conversion
while(BusyADC()); // Wait for Conversion Finished
adc0_dec=ReadADC(); // Read A/D Result
Nop(); //斷點停在這
用watch看adc0_dec
你可以試著把AN0只接5V
看adc0_dec轉換的值是不是1023
然後把AN0接地
看adc0_dec轉換的值是不是0

如果不是,ADC有錯。
拿電表直接量MCU AN0的PIN,說不定你灌5V進去的位子錯誤電壓被分掉了。
若是正常,換其他的AN1 or AN2 在去轉換看看
*******************************************************
如果以上都是正確

你可以故意把adc0_dec=ReadADC();這行改成
adc0_dec=0x3FF;

看你LCM的顯示是否為1023,
若不是,你計算與顯示有錯誤,請自行修改。
*******************************************************
若以上都正確,那就是你輸入5V方波那邊來源有問題。

我就想到這些簡易的除錯方法,請參考。


剛剛確認之後確定是電壓被分掉了,腳位換過AN0、AN1、AN2,結果都一樣,adc0_dec的數值都不正確,想再請問要怎麼解決電壓被分掉的問題呢?

2月07日 17:53:35
轉換PDF檔 列印


Re: PIC18F4520 ADC問題
新會員
註冊日期:
2月06日 19:34:11
所屬群組:
註冊會員
文章: 6
等級: 1; EXP: 47
HP : 0 / 11
MP : 2 / 21
離線
問題解決了!!!!
照各位的建議修改後就差不多完成了!!
感謝各位高手的幫忙,第一次碰這個真的好多都不懂XD

2月08日 14:46:52
轉換PDF檔 列印



(1) 2 »



無法在此發表文章
可以在此觀看文章
無法回覆文章
無法編輯自己的文章
無法刪除自己的文章
無法發起投票調查
無法在此投票
無法上傳附加檔案
無法不經審核直接發表文章

[進階搜尋]


搜尋
Microchip連結

網頁捷徑
2018 Winter Elite 報名
教育訓練
其它網站連結
電話: 02-25000405
產品技術問題產品技術支援專線:0800-717718 台北02-25088600 新竹03-5778366 Ext. 8600 高雄07-2137830 MicrochipDIRECT 專線: 07-2137830
Powered by XOOPS © 2001-2012 The XOOPS Project