با سلام و خسته نباشید به دوستان.ocr2 موج 8بیتی pwm تولید میکنه(0 تا 255) .اما ocr1a و ocr1b موج 16بیتی pwm تولید میکنه.(0تا1024)اونم به صورت منفی. نمیشه یکاری کرد که این دوتا هم 8 بیتی تولید کنن؟
اطلاعیه
Collapse
No announcement yet.
کمک در تولید موج pwm توسط mega8
Collapse
X
-
پاسخ : کمک در تولید موج pwm توسط mega8
چرا که نه.
البته در صورت درک درست از سوالت.
می تونی فقط به رجیستر OCR1AL مقدار بدی تا بشه 8 بیت.البته این در صورتیه که با بسکام کار نکنی و اگه بسکام کار باشی باید بری سراغ رجیسترها.
موفق باشیچرا ناراحتی پاتریک!
+ امروز ی بچه دیدم سرچهارراه گل میفروخت
- از دیدنش ناراحت شدی؟
+ نه
پس چی ناراحتت کرده
+ اینکه دیدن اینجور بچه ها انقدر واسم عادی شده که دیگه ناراحتم نمیکنه
------------------------------------------------------------------------------------------------------
تاحالا فکر کردی بیسواد کیه؟- بی سواد یعنی کسی که نمیتونه ذهنیاتش رو عملی کنه!
------------------------------------------------------------------------------------------------------
محصولات
-
پاسخ : کمک در تولید موج pwm توسط mega8
چرا با سی میشه ولی گفتم اگه بسکام کار باشی شاید برات درکش سخت باشه.
با سی مشکلی نیست. حالا چه کدویژن چه IAR یا Atmel studioچرا ناراحتی پاتریک!
+ امروز ی بچه دیدم سرچهارراه گل میفروخت
- از دیدنش ناراحت شدی؟
+ نه
پس چی ناراحتت کرده
+ اینکه دیدن اینجور بچه ها انقدر واسم عادی شده که دیگه ناراحتم نمیکنه
------------------------------------------------------------------------------------------------------
تاحالا فکر کردی بیسواد کیه؟- بی سواد یعنی کسی که نمیتونه ذهنیاتش رو عملی کنه!
------------------------------------------------------------------------------------------------------
محصولات
دیدگاه
-
پاسخ : کمک در تولید موج pwm توسط mega8
ببین دوست من
این سوال جوابش خیلی اسونه
و جوابشو خیلی راحت توی توضیحات تایمر ها میشه پیدا کنید
وقتی شما این سوال میپرسید یعنی هنوز یه بار درست حسابی تایمر ها رو نخوندی عزیزم
اما اشکالی نداره
ببین دوست من اولا که کار خوبی کردی رفتی سراغ زبان c چون جامع و استاندارد
خب عزیزم تو اگه 2تا خروجی 8 بیتی میخوای همون تایمر 1 نیازتو براورده میکنه
تایمر یک و دیگر تایمر ها مد های متفاوتی دارند
بستگی به این داره تو از چه مدی استفاده کنی و چی مد نظرت باشه
هر چند برای تعیین برخی زمان های دقیق به مشکل شاید بخوری و نتونی دقیق دقیق عمل کنی
اما میشه خیلی مانور داشته باشی
خب تو چرا 8 بیتی میخوای؟
این تورو محدو میکنه برای تولید زمان های دقیق
بگذریم
تو بیا از 8 بیت تایمر 1 استفاده کن
از مد فست pwm 8 بیتی که خودش یکی از مدهای تایمر یک استفاده کن
واینجوری توپ تو میشه 8 بیت پایین
و به تعیین ocr ها 2 تا خروجی 8 بیت داشته باشی
و توی سریز تایمر ocr ها رو مقدار دهی کنی
پیشنهاد میکنم تایمر یک رو بشین بخون دقیق
دیدگاه
-
پاسخ : کمک در تولید موج pwm توسط mega8
بیا دوست من
من برنامه شو در طول 42 ثانیه نوشتم
با فرکانس 4k
و اختلاف فاز 180 درجه بین ocr a , b
حالا خوب دقیق نگاش کن
و اون فرکانس و موج pwm دلخواه خودتو انجام بده
برو جانم برو حالشو ببر
درضمن فرکانس 8 مگا اینترنال داخلیبرای میکرو انتخاب کن
________________________________________________
#include <mega16.h>
// Timer 1 overflow interrupt service routine
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
if(OCR1A>0) OCR1A--;
else OCR1A=255 ;
if(OCR1B<255) OCR1B++;
else OCR1B=0;
}
// 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=Out Func4=Out Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=0 State4=0 State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;
// 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=Out Func4=Out Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=0 State4=0 State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x30;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 1000.000 kHz
// Mode: Fast PWM top=00FFh
// OC1A output: Non-Inv.
// OC1B output: Non-Inv.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: On
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0xA1;
TCCR1B=0x0A;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0xff;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x04;
// Global enable interrupts
#asm("sei"
while (1);
}
دیدگاه
-
پاسخ : کمک در تولید موج pwm توسط mega8
اره چرا نشه:
به قول ندا : چرا که نه چرا که نه >> ده ری ده دیت دری ده ره
گفتم که مد های مختلفی داره و خودت باید انتخاب کنی 8 بیتی و 9 بیتی و 10 بیتی
و اندازه دلخواه با ریجحستر ocra , کاپتر
و نه تنها اینها تو با مقدار دهی اولیه میتونی هر مقداری داشته باشی
بشین تایمر 1 بخون همه چی دستت میاد دوست من
دیدگاه
-
پاسخ : کمک در تولید موج pwm توسط mega8
نوشته اصلی توسط sahel2013بیا دوست من
من برنامه شو در طول 42 ثانیه نوشتم
با فرکانس 4k
و اختلاف فاز 180 درجه بین ocr a , b
حالا خوب دقیق نگاش کن
و اون فرکانس و موج pwm دلخواه خودتو انجام بده
برو جانم برو حالشو ببر
درضمن فرکانس 8 مگا اینترنال داخلیبرای میکرو انتخاب کن
________________________________________________
#include <mega16.h>
// Timer 1 overflow interrupt service routine
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
if(OCR1A>0) OCR1A--;
else OCR1A=255 ;
if(OCR1B<255) OCR1B++;
else OCR1B=0;
}
// 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=Out Func4=Out Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=0 State4=0 State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;
// 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=Out Func4=Out Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=0 State4=0 State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x30;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 1000.000 kHz
// Mode: Fast PWM top=00FFh
// OC1A output: Non-Inv.
// OC1B output: Non-Inv.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: On
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0xA1;
TCCR1B=0x0A;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0xff;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x04;
// Global enable interrupts
#asm("sei"
while (1);
}
میشه یه توضیح بدین که چرا این رجیستر ها رو ست کردین ؟؟ ممنون
کد:TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0xff; OCR1BH=0x00; OCR1BL=0x00;
دیدگاه
-
پاسخ : کمک در تولید موج pwm توسط mega8
سلام :
چون 2 تا موج pwm داریم که مخالف هم حرکت میکنن
180 درجه اختلاف فاز دارن
اونا ریجستر که 255 دادم برای اینکه یکی از صفر شروع میکنه و دیگری از 255
تا بتونن مخالف هم باشن و توی وقفه تایمر که داریم مقدار ocr ها رو تغییر میدیم یکی ازش کم میشه یکی اضافه
فقط برای اینکه مخالف هم باشن 2 موج خروجی
پس مقدار هاشونم باید عکس هم باشه
اون مقدار هم که دادم توی تعریف ریجستر ها فقط یکبار انجام میشه و بعد اون همه کار ها توی وقفه انجام میشه
دیدگاه
دیدگاه