?? main.c.bak
字號:
/*
AD轉換:
1、做AD轉換時外部的抗干擾電路非常重要。
2、如果要做比較精確的AD,不要使用內部參考電壓,因為內部2.56的參考電壓的漂移比較明顯。
3、AD轉換第一次的結果應舍棄
*/
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <util/delay.h>
#define uint unsigned int
#define uchar unsigned char
uint RESULT_BUFF[8];
void delayMS(uint t)
{
uint m=0;
for(;m<t;t++)
_delay_loop_2(250*4);
}
unsigned int AdcConvert(void)
{
unsigned int i;
unsigned int ret;
/// ADMUX=0xc0; ///內部2.56v參考電壓,通道0
ADCSRA|=_BV(ADEN); //使能ADC,單次轉換模式
///連續轉換8次
for(i=0;i<8;i++)
{
ADCSRA|=_BV(ADSC);
_delay_loop_1(60);
ret=(uint)ADCL;
ret|=(uint)(ADCH<<8);
RESULT_BUFF[i]=ret;
}
ret=0;
for(i=1;i<8;i++)
{
ret+=RESULT_BUFF[i];
}
ret=ret/8;
return(ret);
}
int main(void)
{
DDRB=0xff;
ADMUX=(1<<REFS1)|(1<<REFS0)|(0<<MUX3)|(0<<MUX2)|(0<<MUX1)|(1<<MUX0)/*|(1<<ADLAR)*/;
///基準電壓為內部基準電壓 選通ADC0
///置位ADLAR, 轉換結果為左對齊
ADCSRA=(1<<ADEN)|(1<<ADSC)|(0<<ADFR)|(0<<ADIF)|(0<<ADIE)|(0<<ADPS2)|(0<<ADPS1)|(0<<ADPS0);
ADCSRA|=_BV(ADEN);
_delay_loop_2(20);
_delay_loop_2(10);
while(1)
{
uint temp;
temp=AdcConvert();
PORTB=(temp*2.56)/1024;
}
}
/*10 位 精度
0.5 LSB 的非線性度
± 2 LSB 的絕對精度
13 - 260 μs 的轉換時間
最高分辨率時采樣率高達15 kSPS
6 路復用的單端輸入通道
2 路附加復用的單端輸入通道 (TQFP 與MLF 封裝)
可選的左對齊ADC 讀數
0 - VCC 的 ADC 輸入電壓范圍
可選的2.56V ADC 參考電壓
連續轉換或單次轉換模式
ADC 轉換結束中斷
基于睡眠模式的噪聲抑制器
*/
/*
向 ADC 啟動轉換位ADSC 位寫"1” 可以啟動單次轉換。在轉換過程中此位保持為高,直
到轉換結束,然后被硬件清零。如果在轉換過程中選擇了另一個通道,那么ADC 會在改
變通道前完成這一次轉換。
Table 73. ADC 轉換時間
條件
采樣& 保持( 啟動轉換后的時鐘周期數) 轉換時間( 周期)
第一次轉換 13.5 25
正常轉換,單端 1.5 13
ADC 轉換結果轉換結束后(ADIF 為高),轉換結果被存入ADC 結果寄存器(ADCL, ADCH)。
單次轉換的結果如下:
ADC=V(in)*1024/V(REF)
*/
/*
ADC 多工選擇寄存器- ADMUX
Bit 7 6 5 4 3 2 1 0
REFS1 REFS0 ADLAR – MUX3 MUX2 MUX1 MUX0
讀/ 寫 R/W R/W R/W R R/W R/W R/W R/W
初始值 0 0 0 0 0 0 0 0
Bit 7:6 – REFS1:0: 參考電壓選擇
Table 74. ADC 參考電壓選擇
REFS1 REFS0 參考電壓選擇
0 0 AREF, 內部Vref 關閉
0 1 AVCC, AREF 引腳外加濾波電容
1 0 保留
1 1 2.56V 的片內基準電壓源, AREF 引腳外加濾波電容
Bit 5 – ADLAR: ADC 轉換結果左對齊
Bits 3:0 – MUX3:0: 模擬通道選擇位
ADC 控制和狀態寄存器A -ADCSRA
Bit 7 6 5 4 3 2 1 0
ADEN ADSC ADFR ADIF ADIE ADPS2 ADPS1 ADPS0
讀/ 寫 R/W R/W R/W R/W R/W R/W R/W R/W
初始值 0 0 0 0 0 0 0 0
Bit 7 – ADEN: ADC 使能
ADEN置位即啟動ADC,否則ADC功能關閉。在轉換過程中關閉ADC將立即終止正在進行的轉換。
Bit 6 – ADSC: ADC 開始轉換
在單次轉換模式下,ADSC 置位將啟動一次ADC 轉換。在連續轉換模式下,ADSC 置位將啟動首次
轉換。第一次轉換( 在ADC 啟動之后置位ADSC,或者在使能ADC 的同時置位ADSC) 需要25 個ADC
時鐘周期,而不是正常情況下的13 個。第一次轉換執行ADC初始化的工作。
在轉換進行過程中讀取ADSC 的返回值為"1”,直到轉換結束。ADSC 清零不產生任何動作。
Bit 5 – ADFR: ADC 連續轉換選擇
該位置位時,運行在連續轉換模式。該模式下,ADC 不斷對數據寄存器進行采樣與更新。該位清零,
終止連續轉換模式。
Bit 4 – ADIF: ADC 中斷標志
在ADC 轉換結束,且數據寄存器被更新后, ADIF 置位。如果ADIE 及SREG 中的全局中斷使能位I
也置位,ADC 轉換結束中斷服務程序即得以執行,同時ADIF 硬件清零。此外,還可以通過向此標
志寫1 來清ADIF。要注意的是,如果對ADCSRA 進行讀-修改-寫操作,那么待處理的中斷會被禁
止。這也適用于SBI 及CBI 指令。
Bit 3 – ADIE: ADC 中斷使能
若ADIE 及SREG 的位I 置位, ADC 轉換結束中斷即被使能。
Bits 2:0 – ADPS2:0: ADC 預分頻器選擇位
Table 76. ADC 預分頻選擇
ADPS2 ADPS1 ADPS0 分頻因子
0 0 0 2
0 0 1 2
0 1 0 4
0 1 1 8
1 0 0 16
1 0 1 32
1 1 0 64
1 1 1 128
ADC 數據寄存器- ADCL 及ADCH
讀取ADCL 之后,ADC 數據寄存器一直要等到ADCH 也被讀出才可以進行數據更新。因此,如果轉換
結果為左對齊,且要求的精度不高于8 比特,那么僅需讀取ADCH 就足夠了。否則必須先讀出ADCL
再讀ADCH。
*/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -