硬件平台:
M8DK板子,USB和3V供电,板上无其他元件,仅M88和USB取电接口和ISP接口,FLUKE 189真有效值表测量。
第一片M88:
1.0692@5V,1.0746@3V
第二片M88:
1.0924@5V,1.0973@3V
从结果可以发现总体而言M88的ADC REF比M8改进不少,但是从之前的2.5V变成了1.1V,可能会对部分使用场合造成影响,但是精度提高不少,如果每片M88都能想第二片测试样品一样那就比较完美了。
ATMEGA88 is not designed to be a replacement for ATMEGA8, but is pin compatible and has a very similar feature set.
M88并不是设计成用来代替M8的,但是M88和M8的架构比较相象,而且M88有很多新的特性,特别是在功耗控制和IO中断方面比较有优势,还集成了单线JTAG调试接口,并且价格也和M8相差不大,所以在一些对功耗敏感的应用上用M88来代替M8是个不错的选择。
测试代码:
/*THIS IS A SAMPLE OF USING THE ADC INTEGRATED IN MEGA88*/
//Registers:
//ADMUX:
// 7 6 5 4 3 2 1 0
// REFS1 REFS0 ADLAR MUX3 MUX2 MUX1 MUX0
// REFS1:REFS0=1:1,内部1.1V基准,AREF外部并接电容
// ADLAR=0 右对齐;ADLAR=1左对齐
// MUX3..1=ADCX:选择AD通道
//
//ADCSRA:
// 7 6 5 4 3 2 1 0
// ADEN ADSC ADATE ADIF ADIE ADPS2 ADPS1 ADPS0
// ADEN=1,ENABLE ADC
// ADSC=1,置一转换开始,完成后硬件复位
// ADATE=1,ADC AOTO TRIGGER ENABLE,ADC连续转换模式
// ADIF=1,ADC转换数据放入ADCL,ADCH后该位置1
// ADIE=1,ADC中断使能
// ADPS2:ADPS0=预分频选择:0-7=2,2,4,8,16,32,64,128
//
//ADCL,ADCH:
// ADC0-ADC9
// (ADLAR=0)左对齐高两位在ADCH,(ADLAR=1)右对齐高8位在ADCH
//
//ADCSRB:
// 7 6 5 4 3 2 1 0
// - ACME - - - ADTS2 ADTS1 ADTS0
//
// ADTS2-0:ADC AUTO TRIGGER SOURCE
//
//DIDR0:
// 7 6 5 4 3 2 1 0
// - - ADC5D ADC4D ADC3D ADC2D ADC1D ADC0D
// ADC5...0D: DIGITAL INPUT DISABLE
//
//
//
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
uint8_t ADC_MUX=0;
uint16_t ADC_REL;
void adc_init(void)
{
DDRC=0X00;
PORTC=0X00;
ADCSRA=0X00;
ADMUX=((1<<REFS0)(1<<REFS1)(ADC_MUX&0X0F));
ADCSRA=(1<<ADEN)(1<<ADSC)(1<<ADIE)(1<<ADPS2)(1<<ADPS1); //64分频
}
SIGNAL(SIG_ADC)
{
//ADC_REL=(ADCW&0X3FF);
ADC_REL=*( unsigned int *)0x05;
ADMUX=(1<<REFS0)(1<<REFS1)(ADC_MUX&0X0F);
ADCSRA=(1<<ADSC);
//PORTB=0X07;
}
void main(void)
{
DDRB = 0xFF; /* output */
PORTB = 0xFF; /* all off */
adc_init();
sei();
for(;;)
// PORTB=(ADC_REL&0X00FF);
;
}
WINAVR20050214编译通过(需要手动修改MAKEFILE),目的仅是选择内部1.1V 基准,并在21脚进行测试。