ايران ويج

نسخه‌ی کامل: نیاز به کمک فوری برای حل مشکل ADC Mega32
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
صفحه‌ها: 1 2
با سلام.
برای پروژم مدار فرستنده و گیرنده صوتی با AVR در نظر گرفتم.
کدهای برنامه های ارسال و دریافت و شماتیک مدار رو براتون میذارم.امیدوارم بتونید کمکم کنید.
مشکلم اینه که مدار توی فرکانسهای خیلی پایین خروجی مناسبی داره اما نمیدونم کجای مدار یا برنامه ها ایراد داره که با افزایش فرکانس خروجی دیگه از وردی پیروی نمیکنه و بهم میریزه. انگار یه جورایی نمونه بردای توی فرکانس بالا مشکل پیدا میکنه. چراش رو نمیدونم.
اگه سوالی داشتید یا جاییش مبهم بود بپرسید تا جواب بدم.
عمل کرد کلی مدار هم به این صورته که سیگنال آنالوگ یا همون صوت وارد پبن ورودی میکرویی که با برنامه ارسال پروگرم شده میشه. بعد توسط ADC میکرو، دیجیتالی میشه و با استفاده از پروتکل UART به پین خروجی ارسال میشه. پین خروجی به پین ورودی میکرویی که با برنامه دریافت صوت پروگرم شده وصله و در نهایت به پورت خوجی فرستاده میشه. خروجی دیجیتال هم با DAC آنالوگ مشه.
خیلی خیلی از شما تشکر میکنم.
(توی شماتیک مدار همه چی مشخصه)
http://mypoem.persiangig.com/Project.zip

برنامه ارسال:

#include <mega32.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <delay.h>

//set baud for 27.7 kbps
#define baudnum 36
#define halfbaudnum 18

//set ADC reference to AREF
#define ADC_VREF_TYPE 0x20

//timeout value for task1 voice sampler
//a value of 1 ensures the task executes at
//every overflow
#define t1 1

//global variables
char bitcnt; // bit counter
char Txbyte; // data to be transmitted
char sb; // number of stop bits (1, 2, ...)
char carry; // carry bit
unsigned char reload; // timer 0 reload
int time1; // timeout counter
unsigned char temp; // temporary data holder

//the task subroutine
void task1(void);

//the data transmit subroutine
void put(void);

//************************************************** ********
//timer 0 overflow ISR
interrupt [TIM0_OVF] void timer0_overflow(void)
{
//reload to force overflow period
TCNT0=reload;

//decrement the time if not zero
if (time1>0) --time1;
}

// ADC interrupt service routine
interrupt [ADC_INT] void adc_isr(void)
{
// Read the 8 most significant bits
// of the AD conversion result and
// transfer to the transmit byte
Txbyte=ADCH;
temp=Txbyte;
put();
}

//************************************************** ********
//Task 1
void task1(void)
{
time1=t1; //reset the task timer
ADCSR.6=1; //initiate ADC conversion
PORTB=temp; //send result to PORTB for debugging
}

//Transmit Byte
void put(void)
{
bitcnt=9+sb; //initiate bit counter

Txbyte=~Txbyte; //invert byte for easier handling

carry=1; //set carry to 1 for start bit

//while loop transmits the data bits using delay
while(bitcnt>0)
{
//transmit opposite of what is in carry
if (carry)
{
PORTD.1=0;
}
else
{
PORTD.1=1;
#asm("nop")
}

delay_us(baudnum); //1 bit delay

carry=(Txbyte&0b00000001); //move LSB to carry1

Txbyte=Txbyte>>1; //shift transmit byte right

bitcnt--; //decrement bitcnt, 1 bit sent
}
}

void main(void)
{
//set up timer 0
reload=256-21; //value for about 1/3 Msec at 16 MHz
TCNT0=reload; //initial reload
TIMSK=1; //turn on timer 0 overflow ISR
TCCR0=4; //prescalar to 256

//init the task timers
time1=t1;

DDRB=0xff; //direction for debugging port
DDRD=0b00000010; //direction for UART pins

sb=1; // set to 1 stop bit

// ADC initialization
// ADC Clock frequency: 125.000 kHz
// ADC Voltage Reference: AREF pin
// Only the 8 most significant bits of
// the AD conversion result are used
ADMUX=ADC_VREF_TYPE;
ADCSR=0x8F;

// Global enable interrupts
#asm("sei")

//infinite loop ensures task1 executes at evey overflow
//ISRs do the rest of the work
while (1)
{
//execute task1 when time1 is 0
if (time1==0) task1();
}
}


برنامه دریافت:


#include <mega32.h>
#include <stdio.h>
#include <delay.h>

//set baud to 27.7 kbps
#define baudnum 36
#define halfbaudnum 18

//global variables
char bitcnt; // bit counter
char Rxbyte; // received data
char sb; // number of stop bits (1, 2, ...)
char k; // debugging counter

//the data receive subroutine
void get(void);

//Receive Byte
void get(void)
{
Rxbyte = 0x00; //clear receive byte

bitcnt=9+sb; //initialize bit counter

k=0; //initialize debug counter

//while loop waits for start bit
while(PIND.0 != 0)
{
k=k+1;// hang out
}

//delay to middle of start bit
delay_us(halfbaudnum);

//while loop samples at middle of bits
//stops at bitcnt of 2 to avoid shifting
//in stop bit
while(bitcnt>2)
{
delay_us(baudnum); //1 bit delay

Rxbyte=Rxbyte>>1; //shift receive byte right 1

//sample bit
//move value to MSB of receive byte
if (PIND.0)
{
Rxbyte=Rxbyte | 0b10000000;
}
else
{
Rxbyte=Rxbyte & 0b01111111;
}

bitcnt--; //decrement bitcnt, 1 bit received
}

//blast received byte out PORTB
PORTB = Rxbyte;
}

void main(void)
{
DDRD=0b00000010; //direction for UART pins
DDRB=0xff; //direction for output port

sb=1; // set to 1 stop bit

//infinite loop constantly calls get() to receive bytes
while (1)
{
//receive bytes
get();

//delay 1 bit to get past stop bit
delay_us(baudnum);
}
}
فایل دانلود نمیشه
شما چی رو دارین اندازه میگیرین؟!
فرکانس؟ولتاژ؟ac یا dc ؟
(۱۸-شهریور-۱۳۹۱, ۱۵:۰۴:۱۱)abbasalifix نوشته است: [ -> ]فایل دانلود نمیشه
شما چی رو دارین اندازه میگیرین؟!
فرکانس؟ولتاژ؟ac یا dc ؟
اما دوست عزیز دانلود میشه!
دوباره امتحان کنید، اگه مشکل داشتید بفرمایید تا جای دیگه اپلود کنم.
توی شبیه سازی وردوی ولتاژ سینوسی هستش. الیته در عمل ورودی صدا خواهد بود.

تشکر از شما
دانلود نشد
شما نمیتونید ولتاژ های ac رو با میکرو اندازه بگیرین
مگر اینکه اول اون رو به dc تبدیل کنید و نویز های اون رو با خازن کم کنید
(۱۸-شهریور-۱۳۹۱, ۱۵:۵۳:۰۳)abbasalifix نوشته است: [ -> ]دانلود نشد
شما نمیتونید ولتاژ های ac رو با میکرو اندازه بگیرین
مگر اینکه اول اون رو به dc تبدیل کنید و نویز های اون رو با خازن کم کنید

بفرمایید
دانلود شبیه سازی و فایل برنامه ها
میشه بپشتر راهنمایی کنید؟ البته فکر میکنم بعد از دیدن شبیه سازی بهتر بتونید کمکم کنید. ممنونم از شما.
ارسال اطلاعات تون رو نمیدونم دارین چی میفرستین و چطور اما دارین به میکرو فرکانس میدین اونم ac اگه هدف اندازه گیری ولتاژ ac بوده که یه مدار میخواد و فرمول های مدارتون هم یه کوچولو تغییر میکنه
(۱۸-شهریور-۱۳۹۱, ۱۶:۱۱:۱۶)abbasalifix نوشته است: [ -> ]ارسال اطلاعات تون رو نمیدونم دارین چی میفرستین و چطور اما دارین به میکرو فرکانس میدین اونم ac اگه هدف اندازه گیری ولتاژ ac بوده که یه مدار میخواد و فرمول های مدارتون هم یه کوچولو تغییر میکنه
هدف ارسال سیگنال صوتی هستش. توی شبیه سازی پبن فرستنده مستقیما به پین گیرنده وصل کردم. اما من در عمل میخوام از لیزر استفاده کنم.
اما فعلا که مشکلی که گفتم دارم. طبق گفته شما پس باید برای وردی میکرو یه مدار در نظر بگیرم و سیگنال رو مستقیما به میکرو وصل نکنم. درسته؟ چرا نمیشه به میکرو ورودی AC بدم؟؟ اگه ممکنه یکم بشتر توضیح بدین که چکار کنم. چون واقعا برام مبهمه که چطور مشکل رو حل کنم.
میکرو توانایی اندازه گیری دامنه سیگنال های ac رو نداره برای همین باید اول dc کنید
(۱۸-شهریور-۱۳۹۱, ۱۷:۰۰:۳۹)abbasalifix نوشته است: [ -> ]میکرو توانایی اندازه گیری دامنه سیگنال های ac رو نداره برای همین باید اول dc کنید
مشکل AC بودن ورودی رو حل کردم. الان تنها مشکل من اینه که پاسخ فرکانسی مدار خیلی پایینه. حتی وقتی توی نرم افزار از کریستال 16MHz استفاده میکنم مدار نمیتونه بیشتر از300-200 هرتز رو جواب بده!
دوست عزیز میخوای چیکار کنی؟میخوای فرکانس متر درست کنی؟
(۱۸-شهریور-۱۳۹۱, ۲۰:۵۵:۳۷)h.unique نوشته است: [ -> ]دوست عزیز میخوای چیکار کنی؟میخوای فرکانس متر درست کنی؟
قوربون شکل ماهتTongue
میخوام یه فرستنده/گیرنده بسازم که صدا رو با اون انتقال بدم.
توی یه سایت خارجی پیداش کردم. برنامه های فرستنده و گیرنده نوشته شده اند. فایل پروتئوس و برنامه ها رو ضمیمه کردم.
مشکل مدار رو بالا گفتم. پاسخ فرکانسیش خیلی پایینه Angry
والله دیگه عقلم قد نمیده مشکل از کجاست! آخه برنامه نویسیم زیاد خوب نیست. از لحاظ سخت افزاری هم که مشکلی نمی بینم. اگه برنامه مشکلی داره هم نمیدونم. تنها چیزی که متونم بگم اینه که انگار ADC کند عمل میکنه.
تشکر از شما
صفحه‌ها: 1 2