PDA

View Full Version : مشکل در مقدار ADC در نرم افزار پروتئوس



Abbas Amiri
پنج شنبه 22 تیر 1391, 14:01 عصر
باسلم در شبیه سازی برنامه Proteus مقادیر بالاتر از 50 را همان 50 نمایش میدهد ولی برای مقدایر 50 به پایین مشکلی ندارد. هرچه با کدها کلنجاررفتم حل نشد. قسمتی ازکدها وتصویر مدار را گذاشتم ، کسی دراین زمینه تجربه دارد؟



temperature=(int)(ADCW>>2);
itoa(temperature,DigitText);
lcd_puts(DigitText);
// Some code
TempF=(int)((temperature*9/5)+32);
itoa(TempF,DigitText);
lcd_puts(DigitText);

89580

hamid-nic
جمعه 23 تیر 1391, 00:16 صبح
سلام
به جای LM35 می توانید از یک پتانسیومتر استفاده کنید. امتحان کنید ببینید که جواب می ده ؟

Abbas Amiri
جمعه 23 تیر 1391, 12:21 عصر
بله امتحان کردم اگر به پروب ولتاژکه درخروجی LM35 است نگاه کنید مقدار 0.71 ولت را نشان میدهد که با توجه به تنظیمات میکرو باید عدد 71 رانشان دهد وهمانطور که عرض کردم تا مقدار 50 را کاملاصحیح عمل میکند.

hamid-nic
جمعه 23 تیر 1391, 18:16 عصر
ولتاژ رفرنس Vref را به چه شکلی مقدار دهی کردید ؟

Abbas Amiri
جمعه 23 تیر 1391, 18:42 عصر
برای اینکه تمام سوالتان احتمالی آینده هم جواب داده شوند کد های مربوطه را در ذیل قرار میدهم. سخت افزار هم خیلی ساده مانند شکل فوق است.


#include <mega16.h>
#include <stdlib.h>
#include <delay.h>
#include <alcd.h>
//#define HOT_VALUE 30
//#define COLD_VALUE 20
//#define HotAlarm PORTC.2
//#define ColdAlarm PORTC.0
// for Display degree sign save in Program code
// because Character map in LCD Different from PC
flash char degree_signC[3]={0xDF,0x43,0},degree_signF[3]={0xDF,0x46,0};
unsigned char display_flag=0;
char *DigitText; //Variable For save numbers to ASCII
int TempF ;
int temperature;
// Timer1 overflow interrupt service routine
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
TCNT1=0xc240;
display_flag=1;
}
#define ADC_VREF_TYPE 0xC0
// ADC interrupt service routine
interrupt [ADC_INT] void adc_isr(void)
{
temperature=(int)(ADCW>>2);
}

void read_adc(void)
{
delay_us(20);
#asm
in r30,mcucr
cbr r30,__sm_mask
sbr r30,__se_bit | __sm_adc_noise_red
out mcucr,r30
sleep
cbr r30,__se_bit
out mcucr,r30
#endasm
}

void main(void)
{

PORTC=0x00;
DDRC=0x07;
TCCR1A=0x00;
TCCR1B=0x03;
TCNT1H=0xc2;
TCNT1L=0x40;
TIMSK=0x04;
UCSRB=0x00;
ACSR=0x80;
// ADC initialization
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x8A;

lcd_init(16);
delay_ms(50);
lcd_putsf(" Wait");
// Global enable interrupts
#asm("sei")
ADCSRA|=0x40;
while (1)
{
if(display_flag){
lcd_clear();
// ***** *****
lcd_gotoxy(0,1);
lcd_putsf("Temp: ");
itoa(temperature,DigitText);
lcd_puts(DigitText);
lcd_putsf(degree_signC);
// *******************
/*if (temperature < COLD_VALUE)
ColdAlarm=1;
else if (temperature > HOT_VALUE)
HotAlarm=1;
else {
HotAlarm=0;
ColdAlarm=0;
} */
lcd_gotoxy(6,0);
TempF=(int)((temperature*9/5)+32);
itoa(TempF,DigitText);
lcd_puts(DigitText);
lcd_putsf(degree_signF);
display_flag=0;
read_adc();
}
};
}

shoghal1989
جمعه 10 آذر 1391, 22:58 عصر
منم همین مشکلو داشتم که طی 7 ساعت کار مداوم و زل زدن به صفحه مانیتور بالاخره به این نتیجه رسیدم که باید پایه های avcc و avref رو به vcc وصل کنی