專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

AVR單片機(jī)多路ADC轉(zhuǎn)換程序

作者:huqin   來源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2014年04月25日   【字體:

 AVRAD轉(zhuǎn)換使用注意: 絕對的應(yīng)用經(jīng)驗(yàn)!

 
1、注意采樣保持時(shí)間要足夠長 最少62us
2、注意AREF的穩(wěn)定性
3、注意懸空的引腳無意義
4、注意切換通道后首次測量結(jié)果應(yīng)該舍棄
 
AVR各種學(xué)習(xí)開發(fā)工具 搜索 “SHOP AVRVI”
 
給你一個(gè)tiny13寫的多路AD采集的例子。
僅提供思路的主要部分,其余部分暫不方便提供,ICC編寫。
 
程序自動(dòng)采集并放入數(shù)組中,需要使用前調(diào)用GetAD將結(jié)果存到多維數(shù)組搜索的最后,四個(gè)數(shù)取平均。
 
volatile unsigned char time_count=0,AD_datai=0,channer=0;
volatile unsigned char AD_data_buf[3][4];
unsigned char AD_sel[3]={0x00,0x03,0x02}; //對應(yīng)P1 P2 P3 選通為AD輸入
 
#pragma interrupt_handler adc_isr:10
void adc_isr(void)
{
//conversion complete, read value (int) using...
// value=ADCL;         //Read 8 low bits first (important)
// value|=(int)ADCH << 8; //read 2 high bits and shift into top byte
unsigned int value;
value=ADCL;
value|=(int)ADCH << 8;
AD_datai--;
 
if(AD_datai<4) //切換通道后首次結(jié)果拋棄,即=4拋棄
{
  AD_data_buf[channer][AD_datai]=value;
}
if(AD_datai==0)
  {
    AD_datai=5;
    channer++;
    if(channer==3) channer=0;
    ADCMUX = AD_sel[channer];         //切換通道
   }
 
ADCSRA = 0xEE; //再次啟動(dòng)AD
}
 
// ADC initialize
// Conversion time: 86uS
 
void adc_init(void)
{
ADCSRA = 0x00; //disable adc
// ADCMUX = 0x03; //第二腳 ADC3 PB3 作為AD輸入通道,10位精度 右對齊,VCC做參考電壓
ADCMUX = 0x00;
ACSR = 0x80;   //禁用模擬比較器
ADCSRB = 0x00; //自動(dòng)觸發(fā) 連續(xù)轉(zhuǎn)換模式
ADCSRA = 0xEE; //ADC使能,ADC開始轉(zhuǎn)換,ADC自動(dòng)觸發(fā)使能,ADC中斷使能,128預(yù)分頻
DIDR0 = ((1<<ADC1D)| (1<<ADC2D)| (1<<ADC3D)); //禁用ADC123的數(shù)字緩沖功能 以降低功耗
}
 
//將AD結(jié)果放到多維數(shù)組最后
void GetAD(void)
{
unsigned int ADtemp=0;
unsigned char i=0,cha=0;
for(cha=0;cha<3;cha++)
{
    for(i=0;i<4;i++)
    {
    ADtemp+=AD_data_buf[cha][i];
    }
    AD_data_buf[cha][4]=ADtemp>>2; //除以4
}
關(guān)閉窗口

相關(guān)文章