PDA

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



Feranchesco
01-11-2015, 22:05
سلام ... من میخوام هرقت ولتاژ ورودی بیشتر از یه عددی (مثلا3 ولت) بشه یکی از خروجی ها رو فعال کنم اما مرز مقایسه رو هر عددی بین 0 تا 1024 بزارم میکرو رو ولتاژ حدود 1.3 سوییچ میکنه! با کدویزارد تنظیم کردم و میکرو 16 استفاده کردم ...کسی میدونه مشکل چیه؟

erfanjeddy
02-11-2015, 00:05
رفرنست 2.54 داخلیه، بزارش رو 5 ولت خارجی

MahMahM
02-11-2015, 14:26
سلام وقت بخیر
لایسنس 2015 برای 64بیت رو میخواستم....اگر لطف کنید..ممنون میشم

mrm
02-11-2015, 19:06
احتمال بسیار زیاد متغییری که عدد Adc رو میخونید و داخلش نگه داری میکنید به صورت char تعریف شده.
متغییر به صورت int تعریف کنید درست میشه.

Feranchesco
02-11-2015, 20:23
رفرنسم AVCC هست . متغیرمم از نوع Float ...

erfanjeddy
03-11-2015, 00:43
من متوجه نشدم متفیر چیه، خود رجیستر adc چه عددیو داره میده؟

erfanjeddy
03-11-2015, 01:09
در ضمن مطمین شو که داری adc رو 16 بیتی میخونی نه فقط adcl رو

Feranchesco
03-11-2015, 13:15
در ضمن مطمین شو که داری adc رو 16 بیتی میخونی نه فقط adcl رو

adc که 10 بیتیه ...

Feranchesco
03-11-2015, 13:21
اینم قسمت های مرتبط برنامه :

#include <mega16a.h>


#include <delay.h>


// Declare your global variables here
float adc0=0;


// Voltage Reference: AVCC pin
#define ADC_VREF_TYPE ((0<<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: 125.000 kHz
// ADC Voltage Reference: AVCC pin
// ADC Auto Trigger Source: Free Running
ADMUX=ADC_VREF_TYPE;
ADCSRA=(1<<ADEN) | (0<<ADSC) | (1<<ADATE) | (0<<ADIF) | (0<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (0<<ADPS0);
SFIOR=(0<<ADTS2) | (0<<ADTS1) | (0<<ADTS0);


while (1)
{
// Place your code here
adc0=read_adc(0);
if(adc0 >= 512)
PORTB.0=1;
if(adc0 < 512)
PORTB.0=0;


}
}

erfanjeddy
03-11-2015, 23:03
دیتاااا توووووش 10 بیته دوتا رجیستر 8 بیتیه

erfanjeddy
03-11-2015, 23:25
اینو یه تست بزن ببین درست میشه یا نه


#include <stdint.h>#include <delay.h>
#define F_CPU 8000000UL


// Declare your global variables here
uint16_t adc0=0;




// Voltage Reference: AVCC pin
#define ADC_VREF_TYPE ((0<<REFS1) | (1<<REFS0) | (0<<ADLAR))




// Read the AD conversion result
uint16_t read_adc(uint8_t adc_input)
{
ADMUX |=adc_input;
// 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: 125.000 kHz
// ADC Voltage Reference: AVCC pin
// ADC Auto Trigger Source: Free Running
ADMUX=ADC_VREF_TYPE;
ADCSRA=(1<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (0<<ADPS0);
SFIOR=(0<<ADTS2) | (0<<ADTS1) | (0<<ADTS0);




while (1)
{
// Place your code here
adc0=read_adc(0);
if(adc0 >= 512)
PORTB.0=1;
if(adc0 < 512)
PORTB.0=0;




}
}

Feranchesco
04-11-2015, 21:57
اینو یه تست بزن ببین درست میشه یا نه


#include <stdint.h>#include <delay.h>
#define F_CPU 8000000UL


// Declare your global variables here
uint16_t adc0=0;




// Voltage Reference: AVCC pin
#define ADC_VREF_TYPE ((0<<REFS1) | (1<<REFS0) | (0<<ADLAR))




// Read the AD conversion result
uint16_t read_adc(uint8_t adc_input)
{
ADMUX |=adc_input;
// 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: 125.000 kHz
// ADC Voltage Reference: AVCC pin
// ADC Auto Trigger Source: Free Running
ADMUX=ADC_VREF_TYPE;
ADCSRA=(1<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (0<<ADPS0);
SFIOR=(0<<ADTS2) | (0<<ADTS1) | (0<<ADTS0);




while (1)
{
// Place your code here
adc0=read_adc(0);
if(adc0 >= 512)
PORTB.0=1;
if(adc0 < 512)
PORTB.0=0;




}
}

هیچ تفاوتی نکرد ...

erfanjeddy
04-11-2015, 23:52
:(