سلام بر اساتید گرامی. لطفا به برنامه ساده زیر توجه کنید:
در این کد adc روی ولتاژ داخلی 2.56 ولت و دقت 10 بیتی تنظیم شده. انتظار دارم که وقتی ولتاژ روی پایه adc(0) به 2.56 ولت میرسه، تابع adc عدد 1023 رو برگردونه. اما در عمل تقریبا نصف این عدد یعنی 512 رو برمیگردونه. در شبیه ساز پروتئوس مشکلی وجود نداره اما در عمل روی ال سی دی این مشکل وجود داره. به نظر شما چه تنظیماتی از قلم افتاده؟ لطفا راهنمایی کنید.
کد:
[FONT=Yekan]#include <mega16a.h>[/FONT]#include <stdio.h> #include <delay.h> #include <alcd.h> // Declare your global variables here char chrBuffer[32]; int intTemp; // Voltage Reference: Int., cap. on AREF #define ADC_VREF_TYPE ((1<<REFS1) | (1<<REFS0) | (0<<ADLAR)) // Read the AD conversion result unsigned int read_adc(unsigned char adc_input) { ADMUX=adc_input | ADC_VREF_TYPE; // Delay needed for the stabilization of the ADC input voltage delay_us(10); // Start the AD conversion ADCSRA|=(1<<ADSC); // Wait for the AD conversion to complete while ((ADCSRA & (1<<ADIF))==0); ADCSRA|=(1<<ADIF); return ADCW; } void main(void) { // ADC initialization // ADC Clock frequency: 1000.000 kHz // ADC Voltage Reference: Int., cap. on AREF // ADC Auto Trigger Source: Free Running ADMUX=ADC_VREF_TYPE; ADCSRA=(1<<ADEN) | (0<<ADSC) | (1<<ADATE) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (1<<ADPS1) | (1<<ADPS0); SFIOR=(0<<ADTS2) | (0<<ADTS1) | (0<<ADTS0); lcd_init(16); lcd_clear(); while (1) { intTemp=read_adc(0); sprintf(chrBuffer,"%d ",intTemp); lcd_gotoxy(0,0); lcd_puts(chrBuffer); delay_ms(50); } }
دیدگاه