會員登陸
帳號:

密碼:

記住我



忘記密碼?

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


正在流覽:   1 名訪客





pic16f690 ADC UART
新會員
註冊日期:
2012/07/19 02:31
所屬群組:
註冊會員
文章: 20
等級: 3; EXP: 20
HP : 0 / 55
MP : 6 / 1283
離線
請問我要讀電壓0~5V
用uart輸出4 Bytes顯示
ADC讀到4.555318V
輸出0x00 0x45 0x82 0x36
該怎麼處理?
是否有範例參考

5月14日 20:36:59
轉換PDF檔 列印


Re: pic16f690 ADC UART
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 15080
等級: 73; EXP: 95
HP : 1094 / 1823
MP : 5026 / 86330
離線
幾本上 ADC 讀取到的值是 Hex 的格式,需要再轉成 BCD (十進制的格式) 後再轉成 ASCII Code 後經 UART 送出。

前面的轉碼比較辛苦一點,你可以參考一下教育訓練光碟下-- 8-bit MCU 教材下的 : W301 Advance PICC Application

"Lab6 顯示輸入電壓值" 這個章節及範例參考看看是怎樣轉換的。

底下為其中一段讀取 ADC 值再轉成 10 進制的範例。

程式裡顯示電壓值到 mV 是怎樣做到的?
Disp_Temp = (((unsigned long) Temp_Buff ) * 4883 ) / 100 ;
5V / 1024 = 4.883 mV , 要顯示 4.9mV 的精度
不要使用浮點數運算,只要用整數運算即可



void Show_ADC_Voltage
(void )
{
//    Disp_Count = 20;            // 設定每 100mS 顯示電壓一次
    
Clear_LCD( );

    do    
    {
        if (
Disp_Count==0)        // 100mS 到了嗎? 本程式會每 100mS 更新 LCD 上的 VR2 電壓一次
        
{
             
Read_ADC();                                // 讀取 ADC (VR2) 的轉換值
            
Temp_Buff= ADC_Result.Word & 0x3FF;        // 將無用位元遮誚 0
            
Disp_Temp=(((unsigned long)Temp_Buff)*4883)/100;     // 10-bit 解析度,1 LSB=4.883mV
                                                      // 算出實際電壓並取到 0.1mV
    
              
DisplayDigit1(Disp_Temp/10000);            // 顯示 V LCD 第一數字上
            
Disp_Temp=Disp_Temp%10000;                // 取出餘數
                
            
DisplayDigit2(Disp_Temp/1000 );            // 顯示 100mV    
            
Disp_Temp=Disp_Temp%1000;                
    
            
DisplayDigit3(Disp_Temp/100);            // 顯示 10mV
            
Disp_Temp=Disp_Temp%100;
    
            
DisplayDigit4(Disp_Temp/10);            // 顯示 mV
            
Disp_Temp=Disp_Temp%10;
    
            
DisplayDigit5(Disp_Temp);                // 顯示 0.1mV
    
             
SEG_4DP=1 ;                                // 點小數點
    
              
SEG_m = !SEG_m;                                // 顯示 mV 的符號
            
SEG_V= !SEG_V;
//            SEG_BAT=!SEG_BAT;

            
Disp_Count = 20;                        // 設定每 100mS 顯示電壓一次
        
}
    } while (
Key_Input == 0);            // 迴圈內檢查是否有新按鍵按下? 若無則繼續顯示電壓                                    //若有則跳出顯示電壓函數
    
    
Clear_LCD( );
}

void Read_ADC(void)
{
    
unsigned char i;

    
GO_nDONE = 1 ;
//    NOP( );
//    while(GO_nDONE);
    
for(i=0;i<30;i++) ;            // Delay 42uS for Conversion

    
ADC_Result.Byte[0] = ADRESL ;  // Get 10-bit ADC Result
    
ADC_Result.Byte[1] = ADRESH ;
}

void Initialize_ADC(void)
{
    
TRISB2 = 1;             // Set RB2 as Input pin
    
ANSB2 = 1;                 // Set RB2/AN8 as Analog input function pin
    
ADCON0 = 0b00100001;      // ADC Enable, Select AN8 for VR2 input (RB2/AN8)
    
ADCON1 = 0b11100000;      // Right Justified, Fosc/64, Vref- to Vss, Vref+ to Vdd
    
ADIF = 0;
}

5月15日 11:22:06
轉換PDF檔 列印






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

[進階搜尋]


搜尋
Microchip連結
產品技術問題產品技術支援專線:0800-717718 台北02-25088600 新竹03-5778366 Ext. 8600 高雄07-2137830 MicrochipDIRECT 專線: 07-2137830
Powered by XOOPS © 2001-2012 The XOOPS Project