PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : مشكل در مبدل آنالوگ به ديجيتال



ardesheer429
26-06-2013, 18:17
با سلام خدمت دوستان و اساتيد گرامي
خواهشا منو راهنمايي كنيد كه دو روزه خواب ندارمcry::
يه برنامه نوشتم براي اينكه ولتا‍ژ روي پايه c.0 رو ، روي سون سگمنت بصورت عددي بين 0 تا 255 نشون بده .
از كد ويزارد هم استفاده كردم و adc رو فعال كردم
ولي نتيجه همه ي اعداد ممكن هست . از 0 تا 255!!!
انگار هر لحظه يه مقدار روي پايه مي افته !!
فرقي هم نداره كه اون پايه رو چه ولتا‍ژي بدم.
لطفا يك روش سر راست و خواهشا ساده ترين روش معرفي كنيد كه بدونم:
1-توي تنظيمات برنامه ولتاژ مرجع چي باشه ؟
2-توي مدار پايه هاي AVcc, Areff به كجا و چطور بايد وصل شوند .
3- تنظيمات كدويزارد براي قسمت هايي كه لازمه چي باشه؟
من هرچي گشتم براي تبديل آنالوگ به ديجيتال نتونستم اين سه تارو باهم يه جا و با يه زبان و با يه نرم افزار پيدا كنم.
اينم برنامه:


#include <mega8.h>

#include <delay.h>

#define ADC_VREF_TYPE 0xC0

// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}

// Declare your global variables here
flash char digit[16]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,
0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71} ;

void main(void)
{
// Declare your local variables here
unsigned char i,v,y,d,s;

// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=Out Func2=Out Func1=Out Func0=In
// State7=T State6=T State5=T State4=T State3=0 State2=0 State1=0 State0=T
PORTB=0x00;
DDRB=0x0E;

// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTD=0x00;
DDRD=0xFF;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// USART initialization
// USART disabled
UCSRB=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// ADC initialization
// ADC Clock frequency: 62.500 kHz
// ADC Voltage Reference: Int., cap. on AREF
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x87;

// SPI initialization
// SPI disabled
SPCR=0x00;

// TWI initialization
// TWI disabled
TWCR=0x00;

while (1)
{
// Place your code here
v=read_adc(0);


for(i=1;i<100;i++)
{

y=v%10;
d=((v-y)%100)/10;
s=((v-(v%100))%1000)/100;


PORTD=~digit[y];
PORTB.1=1;
delay_ms(3);

PORTD=~digit[d];
PORTB.1=0;
PORTB.2=1;
delay_ms(3);

PORTD=~digit[s];
PORTB.2=0;
PORTB.3=1;
delay_ms(3);
PORTB.3=0;
}

}
}

wantedboy
26-06-2013, 18:51
سلام دوست عزیز هرچی ولتاژ مرجع را بالا تر بگیرید ولتاژی که می خواهید بخوانید بیشتر میشود که تا 5ولت بیشتر نیست.
Avcc هم باید حتما به vcc وصل بشه.
اگه از ولتاژ داخلی استفاده کنید باید vref را با خازن 100 نانو زمین کنی البته برای کاهش نویز همین کار را باید برای avcc هم انجام بدی.
داخل کد ویزارد هم تنظیمات خاصی نداره شما فقط مبدل را فعال سپس فرکانس نمونه برداری را مشخص میکنید و بعد هم ولتاژ مرحع را کلا چیز خاصی نداره.

wantedboy
26-06-2013, 18:52
سلام در ضمن اول با پروتعوس تست کنید وبعد برید سراغ برد

mustafaa
14-07-2013, 00:01
سلام
من چند ماهه اسیر دیوی به نام ADC هستم
هرکاری میکنم جواب نمیده میخام به نسبت ولتاژ ورودی عددی بین 0 تا 1023 رو رو ال سی دی نشون بدم ولی برای ولتاز زیر دو ولت صفر نشون میده واسه بقیه هم 1023
AVcc رو هم به VCC زدم avref روهم با خازن به زمین زدم ولی فرقی نکرد



#include <mega16.h>
#include <delay.h>
#include <stdlib.h>

#asm
.equ __lcd_port=0x18 ;PORTB
#endasm
#include <lcd.h>


//#define ADC_VREF_TYPE 0x00 //Volt.Ref ==> AREF pin
//#define ADC_VREF_TYPE 0x40 //Volt.Ref ==> AVCC pin
#define ADC_VREF_TYPE 0xC0 //Volt.Ref ==> int.cap on AREF 2.56v


float read_adc(unsigned char adc_input){
// float temp;
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
delay_us(10); // Delay needed for the stabilization of the ADC input voltage
ADCSRA|=0x40; // Start the AD conversion
while ((ADCSRA & 0x10)==0); // Wait for the AD conversion to complete
ADCSRA|=0x10;
// temp=(ADCW*5)/1023; // Vin/Vref = ADCW/2^n -1 ==> n=10Bit or 8Bit
return ADCW;
}





void main(void)
{

char s[10];
int a=0,i=0,t=0;

// ADC Clock frequency: 125.000 kHz
// ADC Voltage Reference: Int., cap. on AREF
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x85;

lcd_init(16);

while (1)
{
t=0;
for(i=0;i<5;i++)
{
a=read_adc(0);
t=t+a;
}
t=t/5;
itoa(t,s);
lcd_clear();
lcd_puts(s);
delay_ms(200);
};
}

wantedboy
14-07-2013, 00:22
سلام
شما برنامه را با پروتعوس تست کردید.
ولتاژ مرجع هم روی avcc pin بزار و اون دو تعریف دیگه را پاک کن و پایه ی avcc را هم به vccبه زن.

mustafaa
14-07-2013, 00:41
الان تو پروتئوس امتحان کردم 1 ولت میدم 400 نشون میده

mustafaa
14-07-2013, 00:58
آقا فهمیدم من ولتاژ مرجع رو 2.56 قرار داده بودم که الان عوض کردم رو aref قرار دادم یه 5 ولت هم بهش وصل کردم واسه یه لحظه رو ال سی دی عدد درست رو نشون میده بعد دوباره اشتباه نشون میده ii998)ii998)