关于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即可} /*
* 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;
//} 注释里都有。。。。
sbi(ADMUX, ADLAR); // set to left-adjustedresult 左对齐,只要8位精度仅需读ADCH
8位的ADC prow 发表于 2014-6-4 18:41
注释里都有。。。。
sbi(ADMUX, ADLAR); // set to left-adjustedresult ...
256级量化吗? Vref/(2^8)量化误差 AVR的ADC是10bit的,可根据实际场合需要自己的精度,一般的模拟电路可以采用左对齐,直接读取8bit数据。 看看
{:smile:}
页:
[1]