PDA

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



ardesheer429
13-07-2013, 13:39
با سلام خدمت سروران گرامي .
يه سوال داشتم :
چطور ميتونم با مگا 8 عددي كه توي برنامه دارم رو بصورت آنالوگ روي يه پايه داشته باشم؟
اين عدد عددي بين 0 تا 5 هستش ميخوام نظير همين عدد ، ولتاژ روي خروجي داشته باشم .
توي پي دي اف ها برعكسش هست كه آنالوگ به ديجيتال توضيح داده شده !

Ma3ood
13-07-2013, 14:08
با روش های نظیر r2r و یا نردبانی میتونی این کار را انجا بدی

esisafa
13-07-2013, 15:09
با pwm هم میتونید

ardesheer429
13-07-2013, 23:28
با pwm هم میتونید

دوست عزيز لطفا راهنمايي بيشتر بفرماييد .
خروجي پيوسته با pwm به دست مي آد؟
اگه با ميكرو ميشه كه جچه بهتر . وگرنه اگه آيسي براي اينكار هستش خواهش ميكنم برام توضيح بدين.
با تشكر از شما

wantedboy
13-07-2013, 23:42
سلام.
همون طور که دوستان گفتند به روش های مختلفی میتوان این کارو کرد.
شما یک تامیر روی مد pwm قرار می دهید و بعد برای بدست آوردن دامنه مختلف باید دیوتی سایکل آن را تغییر بدید که مقدار متوسط ولتاژ موج مربعی تغییر میکند. و می توانید از این ویژگی ولتاژ متغیری روی پین خروجی تایمرتون داشته باشید.

ardesheer429
16-07-2013, 08:42
سلام.
همون طور که دوستان گفتند به روش های مختلفی میتوان این کارو کرد.
شما یک تامیر روی مد pwm قرار می دهید و بعد برای بدست آوردن دامنه مختلف باید دیوتی سایکل آن را تغییر بدید که مقدار متوسط ولتاژ موج مربعی تغییر میکند. و می توانید از این ویژگی ولتاژ متغیری روی پین خروجی تایمرتون داشته باشید.

با تشكر از شما دوست عزبز.
توي يه پي دي اف كه آقاي سپاس يار نوشتنهد نحوه توليد يك شكل موج با زمان وظيفه 20 در صد ارائه شده .
راستش اصطلاحاتش برام گنگه و چندبار خوندم ولي بازم چيز زيلدي دستگيرم نشد.
برنامه ش اينه:
#include <mega16.h>
#define xtal 8000000
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
TCNT0=0x06;
}
void main(void)
{
Page| 73
You can see links before reply 
- ٧٣ -PORTB=0x00;
DDRB=0x08;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 1000.000 kHz
// Mode: Fast PWM top=FFh
// OC0 output: Non-Inverted PWM
TCCR0=0x6A; //0x7A for inverted PWM
TCNT0=0x06;
OCR0=0x38; //OCR0 = 56
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x01;
// Global enable interrupts
#asm("sei")
while (1);
}
براي اينكه روي مگا8 بنويسمش
1: توي كد ويزار كدوم پايه رو بايد خروجي تعيين كنم؟ يعني اين موج روي كدوم پايه مي افته؟
2: اين برنامه روي مگا 8 هم همينطوري نوشته ميشه؟
3:زمان وطيفه رو چطور عوض كنم؟

exelance
16-07-2013, 11:34
دوست عزیز شما باید موقعی که از adc نمونه میگیرین مستقیم مقدار اون رو در رجیستر ocrx بنویسین والسلام
با تقسیم فرکانسی فرکانس pwm رو مشخص کن که چقدر می خوای بعد تو روتین adc مقدار adc رو تو رجیستر مقایسه ی ocrx بنویس

ardesheer429
16-07-2013, 18:48
دوست عزیز شما باید موقعی که از adc نمونه میگیرین مستقیم مقدار اون رو در رجیستر ocrx بنویسین والسلام
با تقسیم فرکانسی فرکانس pwm رو مشخص کن که چقدر می خوای بعد تو روتین adc مقدار adc رو تو رجیستر مقایسه ی ocrx بنویس

اين عدد توي خود برنامه توليد ميشه و ربطي به ADC نداره .
مشكل من همين اصطلاحات و ريجستر هاست .
يه جايي هم تا حالا پيدا نكردم كه به زبان ساده توضيح بده كه ]pwm چطور ايجاد ميشه.
شما دوستان لطف كنيد يه برنامه ساده براي مگا هشت بنويسيد كه اين كار رو بكنه و زمان وظيفه هم توي اون مشخص باشه

با تشكر از راهنمايي هاي شما

ardesheer429
17-07-2013, 13:39
آقا ما اين روش pwm رو تحقيق كردم . يه چيزايي دستگيرمون شد . يكي بياد به زبون ساده براي ما بگه كه چيكار كنيم . آخه اين پي دي اف براي مگا 16 نوشته و نميدونم توي مگا هشت چي ميشه .
ين برنامه رو نوشتم ارور ميده:

#include <mega8.h>
#include <delay.h>
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
// Place your code here
TCNT0=0x00;
}

// Declare your global variables here

void main(void)
{
// Declare your local variables here
int i;
// Input/Output Ports initialization
// Port B 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
PORTB=0x00;
DDRB=0xFF;

// 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: 8000.000 kHz
TCCR0=0x01;
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=0x01;

// 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 disabled
ADCSRA=0x00;

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

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

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

while (1)
{
for (i=1;i<=256;i++)
{OCR0=i;
delay_ms(100);
}
}
}

ardesheer429
17-07-2013, 16:40
يكي نيست يه توضيح بده؟
خواهش ميكنم راهنمايي كنيد.
توي تنظيمات كد ويزارد چندين نوع pwm داريم . نميدونم كدومش بايد استفاده كنم .
كدم پايه رو بايد خروجي تعريف كنم و براي ايجاد سيگنال كدوم ريجستر رو مقدار دهي كنم
يكي يباد به زبون ساده به من ياد بده. قربون مرامتون

wantedboy
17-07-2013, 19:26
سلام دوستان اینم یک برنامه.
تایمر صفر روی مد fast pwm تعریف شده و خروجی آن که B.3 هست همون oc0 روی حالت معکوس کردن پین قرار گرفته. حالا زمانی که مقدار tcnt به ocr0 میرسه پین ocr0 را معکوس میکند و بعد دوباره تا به مقدار ماکزیمم رسید دوباره خروجی را معکوس می کند حالا شما با تغییر ocr0 میت وانید دیوتی سایکل موج مربعی تون را تغییر بدید.

#include <mega16a.h>

// Declare your global variables here

void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;

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

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

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

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 8000.000 kHz
// Mode: Fast PWM top=0xFF
// OC0 output: Inverted PWM
TCCR0=0x79;
TCNT0=0x00;
OCR0=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
// INT2: Off
MCUCR=0x00;
MCUCSR=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 disabled
ADCSRA=0x00;

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

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

while (1)
{
// Place your code here
OCR0=127;
}
}

ardesheer429
18-07-2013, 15:38
سلام دوستان اینم یک برنامه.
تایمر صفر روی مد fast pwm تعریف شده و خروجی آن که B.3 هست همون oc0 روی حالت معکوس کردن پین قرار گرفته. حالا زمانی که مقدار tcnt به ocr0 میرسه پین ocr0 را معکوس میکند و بعد دوباره تا به مقدار ماکزیمم رسید دوباره خروجی را معکوس می کند حالا شما با تغییر ocr0 میت وانید دیوتی سایکل موج مربعی تون را تغییر بدید.





دوست عزيز مشكل من همينه كه تو آموزش ها براي مگا 16 توضيح دادن . براي مگا هشت من اين برنامه رو نوشتم ولي ارور داد:
Error: test_pwm.c(57): undefined symbol 'OCR0'
نميدونم چيكار كنم.
يكي نميتونه براي مگا هشت بنويسه؟
.
در ضمن من رفتم دنبال آي سي مبدل ديجيتال به آنالوگ .
يه دونه 8080 گرفتم . ديتا شيت ش هم توي ننت پيدا كردم ولي هرچي وصل ميكنم خروجي ثابته .
يك بياد يه روش درست درمون به من بگه تا من بتونم اين عدد ديجيتال رو آنالوگ كنم .
بيماري عصبي گرفتم از بس مدار بستم و جواب نداد

wantedboy
18-07-2013, 16:32
دوست عزیز کافیه داخل کدویزارت کدویژن میکرو مگا 8 را انتخاب کنی و داخل قسمت یکی از تایمراش تنظیماتی که گفتم را انجام بدید تا یمری که انتخلب میکنید 8 بیتی باشه.
در ضمن در مبحث دیجیتال و آنلوگ آی سی خیلی کم گیر میاد چون داخل ایران مصرف نظامی داره.

ardesheer429
18-07-2013, 17:32
دمت گرم داداش . خيلي لطف داري.

مثلا تايمر يك رو فعال كردم
مد ش رو چي بذارم؟
خب چند تا گزينه داره ديگه !!!
پايه خروجي كه pwm روش ايجاد ميشه كدومه توي مگا 8 ، با تايمر مثلا يك؟
يه سوال ديگه هم هست:
اين موج خروجي رو چطور متوسط گيري كنم؟ يعني دقيقا به يك ولتا‍‍ژ متغيير تبديل بشه؟

ardesheer429
18-07-2013, 21:15
بالاخره با راهنمايي هاي دوستان تونستم اين كار رو انجام بدم و ولتاژ متغيير بسازم .
بر نامه اي كه نوشتم اينه :

#include <mega8.h>
#include <delay.h>

// Declare your global variables here

void main(void)
{
// Declare your local variables here
int i;
// Input/Output Ports initialization
// Port B 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
PORTB=0x00;
DDRB=0xFF;

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

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

// 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: 1000.000 kHz
// Mode: Fast PWM top=0xFF
// OC2 output: Non-Inverted PWM
ASSR=0x00;
TCCR2=0x6A;
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 disabled
ADCSRA=0x00;

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

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

while (1)
{
delay_ms(3000);
for(i=1;i<=256;i++)
{OCR2=i;
delay_ms(10);}



}
}
لازم به ذكر هستش بايد از تايمر 2 كه مگا 8 در حالت fast pwm استفاده كنيم .
حالا يه سوال ديگه :
اين ولتا‍ ژ به وجود اومده رو چطور دقيقا دوبرابر كنم؟

wantedboy
18-07-2013, 22:28
سلام. باید از دو پین استفاده کنید وسپس با هم جعمشون کنید به روش زیر:
میتونی وقفه تایمر را فعال کنی که دو حالت داره وفقه مقایسه و وفقه سرریز حالا شما هر دو را فعال کنیدو دو پین مورد نظر را در هر دو فقه بنوسید که نات شوند با این کار دو موج متقارن با هم تولید می شوند که اگه با هم جمشون کنیم پیک تا پیک 10 ولت میشه

ardesheer429
19-07-2013, 00:35
راهنمايي صحيح و كاملي بود .
مرسي.
اما من از همون زمان كه برنامه نويسي خوندم از وقفه فراري بود م و الان دقيقا هيچي نميدونم.
اين روشي كه شما مي فرمايين هم از هموناست كه من ازش فراري هستم.
الان من يه ولتاز مربعي با زمان وظيفه متغيير دارم .
خواهشا يه مدار ساده معرفي كنيد كه ازش خروجي صفر تا 10 ولت وابسته به زمان وظيفه داشته باشم .
با تشكر از شما دوست عزيز