魏太勇 发表于 2014-6-4 17:43:41

关于AD转化量化精度的问题,以下代码看出量化精度是多少

关于AD转化量化精度的问题,以下代码看出量化精度是多少,哪句话设置了该精度(AVR单片机)

void a2dInit(void){ sbi(ADCSRA, ADEN);    // enable ADC (turn on ADC power) cbi(ADCSRA, ADIF);    // default to single sample convert modesbi(SFIOR,ADTS1),sbi(SFIOR,ADTS0);//定时器/ 计数器0 比较匹配 a2dSetPrescaler(ADC_PRESCALE); // 设置分频 a2dSetReference(ADC_REFERENCE); // 设置参考电压 a2dSetChannel(ADC_CH_ADC0);//预先设置通道0 sbi(ADMUX, ADLAR);    // set to left-adjustedresult 左对齐,只要8位精度仅需读ADCH sbi(ADCSRA, ADIE);    // enable ADC interrupts sbi(ADCSRA,ADATE);    //自动触发使能 //a2dCompleteFlag = FALSE;// clear conversion complete flag sei();       // turn on interrupts (if not already on)}// turn off a2d convertervoid a2dOff(void){ cbi(ADCSRA, ADIE);    // disable ADC interrupts cbi(ADCSRA, ADEN);    // disable ADC (turn off ADC power)}// configure A2D converter clock division (prescaling)void a2dSetPrescaler(unsigned char prescale){ outb(ADCSRA, ((inb(ADCSRA) & ~ADC_PRESCALE_MASK) | prescale));}// configure A2D converter voltage referencevoid a2dSetReference(unsigned char ref){ outb(ADMUX, ((inb(ADMUX) & ~ADC_REFERENCE_MASK) | (ref<<6)));}// sets the a2d input channelvoid a2dSetChannel(unsigned char ch){ //关闭内部上拉电阻,设置端口为输入 cbi(PORTA,ch); cbi(DDRA,ch); outb(ADMUX, (inb(ADMUX) & ~ADC_MUX_MASK) | (ch & ADC_MUX_MASK)); // set channel}uint8_t a2dConvert8bit(void){ sbi(ADCSRA, ADIF);      // clear hardware "conversion complete" flagsbi(ADCSRA, ADSC);      // start conversion while(!(ADCSRA&(1<<ADSC)));    //等待转换完成 uint8_t i=ADCH; return (i);   // 因初始化时已设置结果左对齐,只读ADCH即可}

魏太勇 发表于 2014-6-4 17:47:20

/*
* adc.c
*
* Created: 2011-8-18 13:09:27
*Author: Administrator
*/
#include <avr/io.h>
#include <avr/interrupt.h>

#include "config.h"
#include "adc.h"

// global variables

//! Software flag used to indicate when
/// the a2d conversion is complete.
//volatile unsigned char a2dCompleteFlag;

// functions

// initialize a2d converter因所用程序需快速采样所以预先设置好通道
void a2dInit(void)
{
        sbi(ADCSRA, ADEN);                                // enable ADC (turn on ADC power)
        cbi(ADCSRA, ADIF);                                // default to single sample convert mode
       
        sbi(SFIOR,ADTS1),sbi(SFIOR,ADTS0);//定时器/ 计数器0 比较匹配
        a2dSetPrescaler(ADC_PRESCALE);        // 设置分频
        a2dSetReference(ADC_REFERENCE);        // 设置参考电压
        a2dSetChannel(ADC_CH_ADC0);                //预先设置通道0
        sbi(ADMUX, ADLAR);                                // set to left-adjustedresult 左对齐,只要8位精度仅需读ADCH

        sbi(ADCSRA, ADIE);                                // enable ADC interrupts
        sbi(ADCSRA,ADATE);                                //自动触发使能
        //a2dCompleteFlag = FALSE;                // clear conversion complete flag
        sei();                                                        // turn on interrupts (if not already on)
}

// turn off a2d converter
void a2dOff(void)
{
        cbi(ADCSRA, ADIE);                                // disable ADC interrupts
        cbi(ADCSRA, ADEN);                                // disable ADC (turn off ADC power)
}

// configure A2D converter clock division (prescaling)
void a2dSetPrescaler(unsigned char prescale)
{
        outb(ADCSRA, ((inb(ADCSRA) & ~ADC_PRESCALE_MASK) | prescale));
}

// configure A2D converter voltage reference
void a2dSetReference(unsigned char ref)
{
        outb(ADMUX, ((inb(ADMUX) & ~ADC_REFERENCE_MASK) | (ref<<6)));
}

// sets the a2d input channel
void a2dSetChannel(unsigned char ch)
{
        //关闭内部上拉电阻,设置端口为输入
        cbi(PORTA,ch);
        cbi(DDRA,ch);
        outb(ADMUX, (inb(ADMUX) & ~ADC_MUX_MASK) | (ch & ADC_MUX_MASK));        // set channel
}
//// start a conversion on the current a2d input channel
//void a2dStartConvert(void)
//{
        //sbi(ADCSR, ADIF);        // clear hardware "conversion complete" flag
        //sbi(ADCSR, ADSC);        // start conversion
//}
//
//// return TRUE if conversion is complete
//u08 a2dIsComplete(void)
//{
        //return bit_is_set(ADCSR, ADSC);
//}
//
//// Perform a 10-bit conversion
//// starts conversion, waits until conversion is done, and returns result
//unsigned short a2dConvert10bit(unsigned char ch)
//{
        //a2dCompleteFlag = FALSE;                                // clear conversion complete flag
        //outb(ADMUX, (inb(ADMUX) & ~ADC_MUX_MASK) | (ch & ADC_MUX_MASK));        // set channel
        //sbi(ADCSR, ADIF);                                                // clear hardware "conversion complete" flag
        //sbi(ADCSR, ADSC);                                                // start conversion
        ////while(!a2dCompleteFlag);                                // wait until conversion complete
        ////while( bit_is_clear(ADCSR, ADIF) );                // wait until conversion complete
        //while( bit_is_set(ADCSR, ADSC) );                // wait until conversion complete
//
        //// CAUTION: MUST READ ADCL BEFORE ADCH!!!
        //return (inb(ADCL) | (inb(ADCH)<<8));        // read ADC (full 10 bits);
//}
// Perform a 8-bit conversion.
// starts conversion, waits until conversion is done, and returns result
uint8_t a2dConvert8bit(void)
{
        sbi(ADCSRA, ADIF);                                                // clear hardware "conversion complete" flag
        sbi(ADCSRA, ADSC);                                                // start conversion
        while(!(ADCSRA&(1<<ADSC)));                                //等待转换完成
        uint8_t i=ADCH;
        return (i);                        // 因初始化时已设置结果左对齐,只读ADCH即可
}

//! Interrupt handler for ADC complete interrupt.
//ISR(ADC_vect)
//{
        //// set the a2d conversion flag to indicate "complete"
        //a2dCompleteFlag = TRUE;
//}

prow 发表于 2014-6-4 18:41:39

注释里都有。。。。
sbi(ADMUX, ADLAR);                              // set to left-adjustedresult 左对齐,只要8位精度仅需读ADCH
8位的ADC

魏太勇 发表于 2014-6-4 19:53:16

prow 发表于 2014-6-4 18:41
注释里都有。。。。
sbi(ADMUX, ADLAR);                              // set to left-adjustedresult ...

256级量化吗?

prow 发表于 2014-6-4 17:43:42

Vref/(2^8)量化误差         

squall45 发表于 2014-6-5 17:09:23

AVR的ADC是10bit的,可根据实际场合需要自己的精度,一般的模拟电路可以采用左对齐,直接读取8bit数据。

ld476461889 发表于 2014-6-24 20:48:40

看看
{:smile:}
页: [1]
查看完整版本: 关于AD转化量化精度的问题,以下代码看出量化精度是多少