امتیاز موضوع:
  • 1 رأی - میانگین امتیازات: 5
  • 1
  • 2
  • 3
  • 4
  • 5
سوال درباره نحوه تولید پالس مربعی
نویسنده پیام
sinohe آفلاین
كاربر دو ستاره
**

ارسال‌ها: 86
موضوع‌ها: 13
تاریخ عضویت: آذر ۱۳۹۰

تشکرها : 88
( 23 تشکر در 14 ارسال )
ارسال: #1
سوال درباره نحوه تولید پالس مربعی
سلام دوستان
امیدوارم حالتون خوب باشه
من میخوام فرکانسی رو تولید بکنم ولی مشکلم اینه که نمی دونم فرکانس رو چطور محاسبه کنم؟ مثلا اگر بخوام فرکانس 10 کیلو هرتز درست کنم توی این دستور باید از چه عددی به جای x استفاده کنم؟ و این فرکانس چقدر دقیقه و چقدر خطا داره؟ مثلا ممکنه چند هرتز بالا یا پایین بزنه؟
کد:
Pulseout Portc , 0 , X
(آخرین ویرایش در این ارسال: ۲۰-دى-۱۳۹۰, ۲۰:۳۳:۰۵، توسط sinohe.)
۲۰-دى-۱۳۹۰, ۱۷:۴۲:۱۸
ارسال‌ها
پاسخ
sharin آفلاین
مدیر بازنشسته
*****

ارسال‌ها: 2,053
موضوع‌ها: 28
تاریخ عضویت: مرداد ۱۳۸۹

تشکرها : 3714
( 8171 تشکر در 2772 ارسال )
ارسال: #2
RE: سوال درباره نحوه تولید پالس مربعی
سلام.

اگر فركانس دقيق مي خواي بايد با استفاده از تايمرها توليدش كني ...
f=1/T
زمان T رو با تايمر درست كن و هر وقت رفت به وقفه پين مربوطه رو toggle كن ...
البته اينطوري فركانس f/2 بدست مي آيد ...

موفق باشي.
يا علي.

(آخرین ویرایش در این ارسال: ۲۰-دى-۱۳۹۰, ۲۳:۲۶:۰۵، توسط sharin.)
۲۰-دى-۱۳۹۰, ۲۳:۱۳:۳۱
وب سایت ارسال‌ها
پاسخ
تشکر شده توسط : h0x00i, sinohe, fabienmartin
sinohe آفلاین
كاربر دو ستاره
**

ارسال‌ها: 86
موضوع‌ها: 13
تاریخ عضویت: آذر ۱۳۹۰

تشکرها : 88
( 23 تشکر در 14 ارسال )
ارسال: #3
RE: سوال درباره نحوه تولید پالس مربعی
(۲۰-دى-۱۳۹۰, ۲۳:۱۳:۳۱)sharin نوشته است: سلام.

اگر فركانس دقيق مي خواي بايد با استفاده از تايمرها توليدش كني ...
f=1/T
زمان T رو با تايمر درست كن و هر وقت رفت به وقفه پين مربوطه رو toggle كن ...
البته اينطوري فركانس f/2 بدست مي آيد ...

موفق باشي.
يا علي.

سلام
ممنون میشم یه مثال از کد برام بزنی، مخصوصا تایمر. از کدوم تایمر استفاده کنم؟ اگر با کد مثال بزنی زودتر متوجه میشم.
ممنون
۲۱-دى-۱۳۹۰, ۱۱:۵۷:۵۵
ارسال‌ها
پاسخ
parniaan آفلاین
تازه وارد

ارسال‌ها: 9
موضوع‌ها: 1
تاریخ عضویت: دى ۱۳۹۰

تشکرها : 0
( 13 تشکر در 4 ارسال )
ارسال: #4
RE: سوال درباره نحوه تولید پالس مربعی
توی میکرو AVR ما سه تا تایمر داریم تایمر 0 و 2 و 1
که 0و2 هشت بیتی هستن و 1 تایمر 16 بیتی هست
هر کدومشونم بخوای می تونی توی یکی از چهار تا مد (normal، ctc،PWM،correct phase pwm) استفاده کنی.
هر کدوم این تایمرها سه تا رجیستر اصلی دارن
مثلا تایمر صفر سه تا رجیستر 8 بیتی داره به اسم (TCNT0 ـ TCCR0 ـ OCR0)
تایمر دو هم به همین ترتیب فقط شماره هاش تبدیل میشه به 2 مثلا TCCR0
تایمر یک چون 16 بیتی هست رجیسترهاش اینطوری نامگذاری میشه: TCCR1A برای هشت بیت بالایی و TCCR1B برای هشت بیت پایینی OCR1AH و OCR1AL و OCR1BH و OCRB1L
حالا دو تا رجیستر هم هستن که بین این سه تا تایمر مشترک هستن که برای کار کردن با سرریز وقفه های تایمرها و بیت های فلگ یا همون پرچم تایمرهاست بنام های TIFR و TIMSK
رجیستر TCCR برای پیکیر بندی تایمر هست یعنی با تنظیم کردن بیتهاش میتونی مشخص کنی تایمر توی چه مدی کارکنه با چه تقسیم کلاکی و در حالت مقایسه تغییر وضعیت بده یا نه.
رجیستر TCNT برای ذخیره عددی تایمرت هست که مثلا با توجه به فرکانسی که داری باید محاسبه کنی و عددی که میخوای اگه تایمر به اون عدد رسید شروع به شمارش کنه توی این رجیستر میریزی.
رجیستر OCR هم زمانی استفاده میکنی که بخواهی از مقایسه تایمرت استفاده کنی.
مثلا به ما گفتن یه برنامه بنویسید که موج مربعی با دوره تناوب T=512us روی پورت A تولید کنه؟
خوب ما میخواهیم با تایمر کانتر 0 اینکارو بکنیم. میدونیم که 8 بیتی هشت یعنی 2 به توان 8 که میشه 256 یعنی تایمر ما از 0 تا 256 باید بشمره بعد که به 255 رسید اینجا برنامه ما باید یکبار اجرا بشه.
حالا دوره تناوب ما 512 میکرو ثانیه است پس باتوجه به عدد بالا چون موج مربعی میخواهی باید مدت 256 میلی ثانیه صفر باشه و 256 میلی ثانیه 1 باشه تا یه موج مربعی 512 را تولید کنه. حالا برنامه زیر را ببین.
کد:
[align=left]
void delay(){
TCCR0=0b00000010; // fclk/8
while (!TIFR & 0x01); // تاوقتیکه بیت TOV0 یک نشده باشه اینجا وایمیسته
TIFR = TIFR | 0b00000001;
TCCR0=0x00;
}
DDRA=0xFF;
PORTA=0x00;
TCCR0=0x00; // مقدار اولیه تایمر 0 داده
TCNT0=0x00; // مقدار اولیه تایمر از 0 شروع کنه به شمارش
while(1){
PORTA.0=1;
delay();
PORTA.0=1;
delay();
}
}
[/align]

اما ممکنه دوره تناوبت را کاهش بدن مثلا بگمی با دوره تناوب 200 میکرو ثانیه خوب این از عدد 256 کمتر هست پس باید یه منها بکنی
256-200=56 عدد 56 عددی هست که باید توی TCNT ریخته بشه و تایمر از این عدد فعال میشه و شروع به شمارش میکنه پس میبریش به هگز میشه 0x38 و برنامت میشه این:
کد:
[align=left]
voide delay()
{
TCNT0=0x38;
TCCR0=0b00000010;
while (! TIFR & 0x01);
TIFR = TIFR | 0b00000001;
TCCR0=0x00;
}
[/align]

حالا اگه بهت فرکانس را بده از روی همون دوره تناوبو را بدست میاری
میدونی که دوره تناوب و فرکانی عکس هم هستن یعنی T=1/F و F=1/T
اگه بخواهی توی مد های دیگه غیر از نرمال استفاده کنی فرمول داره که میتونی فرمولشو از دیتاشیت میکرو پیدا کنی مثلا توی مد CTC فرمولش اینه : Fosc=Fclk/2*N*(1+OCR0
Fosc که همون فرکانس اسیلاتور هست مثلا اگه بگه موج مربعی با فرکانس 5KHZ میشه 5 * 10^3=5000 هرتز
Fclk= معمولا چون کریستالمون 8mhz هست میشه 8 * 10^6
و چون رجیستر OCR0 هشت بیتی هست توی تایمر0 پس N ه میمشه 8
حالا باید با این اطلاعات عددی را بدست بیاری ک هتوی OCR0 ریخته میشه
حالا میخواهی یه موج مربعی بسازی با فرکانس 5khz روی پین OC0 فکرکنم میشه پین PB3 میکرو
طبق فرمول داری :
5*10^3=((8*10^6)/2*8*(1+OCR0))
که حاصل هست عدد 99 دسیمال معادل 0x63 هگز که این عدد OCR هست
برنامه این میشه :
کد:
[align=left][align=left]
void main(void){
DDRB=0xFF;
PORTB=0x00;
TCNT0=0x00[align=left];[/align]
TCCR0=0b00011010;
OCR0=0x63;
while(1);
}
[/align][/align]
وسلام
۲۱-دى-۱۳۹۰, ۱۹:۱۰:۲۴
ارسال‌ها
پاسخ
تشکر شده توسط : sinohe, sharin, soy1345, naseria_1364, vaghari2001, fabienmartin
sinohe آفلاین
كاربر دو ستاره
**

ارسال‌ها: 86
موضوع‌ها: 13
تاریخ عضویت: آذر ۱۳۹۰

تشکرها : 88
( 23 تشکر در 14 ارسال )
ارسال: #5
RE: سوال درباره نحوه تولید پالس مربعی
با سپاس از اینکه اینقدر زحمت کشیدی، دمت گرم
ولی فکر میکنم زبان برنامه نویسی شما فرق داره؟ من با بسکام کار میکنم و کمی بلدم، تا حالا این زبان رو ندیده بودم. یعنی بجز بیسیک با چیز دیگه ای آشنا نیستم.
ممنون میشم اگر با بسکام مثال بزنید.
تشکر فراوان
در ضمن مگه نمیشه با این کد پالس مربعی تولید کرد؟ اگر نمیشه پس این کد برای چیه، اگر میشه دقتش چقدره و آیا ثبات داره یا نه؟ مثلا در 10 کیلو هرتز چند هرتز خطا داره؟
کد:
Pulseout Portc , 0 , X
سوال دوم اینکه چطور میشه در پروتئوس فرکانس رو گرفت؟ آیا ابزاری درش هست؟
ممنون
(آخرین ویرایش در این ارسال: ۲۱-دى-۱۳۹۰, ۲۰:۴۱:۴۱، توسط sinohe.)
۲۱-دى-۱۳۹۰, ۲۰:۳۲:۴۱
ارسال‌ها
پاسخ
apcog آفلاین
در حال پیشرفت
***

ارسال‌ها: 315
موضوع‌ها: 40
تاریخ عضویت: شهریور ۱۳۹۰

تشکرها : 61
( 280 تشکر در 167 ارسال )
ارسال: #6
RE: سوال درباره نحوه تولید پالس مربعی
میشه اما با تایمر هم راحت تره و هم دقیق تر.
در ضمن اون زبون اسمش کد ویژن هست که بر پایه ی سی طراحی شده.مثل بسکام که بر پایه ی بیسیکه.
۲۱-دى-۱۳۹۰, ۲۱:۱۱:۳۵
ارسال‌ها
پاسخ
تشکر شده توسط : sinohe
sinohe آفلاین
كاربر دو ستاره
**

ارسال‌ها: 86
موضوع‌ها: 13
تاریخ عضویت: آذر ۱۳۹۰

تشکرها : 88
( 23 تشکر در 14 ارسال )
ارسال: #7
RE: سوال درباره نحوه تولید پالس مربعی
ممنون
با این کد دقت چقدره؟ برای من دقت چند هرتز تا شاید 200 هرتز اصلا مهم نیست، اگر دقت این کد کمتر از این حد باشه برای من قابل قبوله.
۲۱-دى-۱۳۹۰, ۲۱:۲۱:۲۵
ارسال‌ها
پاسخ
parniaan آفلاین
تازه وارد

ارسال‌ها: 9
موضوع‌ها: 1
تاریخ عضویت: دى ۱۳۹۰

تشکرها : 0
( 13 تشکر در 4 ارسال )
ارسال: #8
RE: سوال درباره نحوه تولید پالس مربعی
نگفتید با بسکام کار میکنید
من با کدویژن براتون نوشتم البته بسکامشم راحته
من خیلی بسکام کار نمیکنم اما چند تا برنامه برات میزارم بخونی متوجه میشی
کلا مکانیزم کار و اندازه گیری فرکانس و کار با تایمرها تفاوتی بین دو زبان نداره فقط نوع تعریفشون توی برنامه ت باتوجه به دستورات زبان برنامه نویسی که باهاش انجام میدی کمی تغییر میکنه. و گرنه رجیسترهایی که استفاده میشه و مفهوم کلی همونه.
این برنامه کنترل دور موتور هست با تایمر بزبان بسکام
http://uploadtak.com/images/cqqkora3re3k3y9tkkya.rar
این برنامه فرکانس متر هست که با استفاده از وقفه تایمر0 نوشته شده که بیت وقفه هم همون OVF0 هست که توی رجیستر TIFR که گفتم قرار گرفته که اگر بخواهی از وقفه سرریز تایمر بعنوان یه اتفاق استفاده کنی که هر موقع رخداد اونموقع تایمرت فعال بشه و برنامت شروع بشه این بیت را باید یک کنی.
http://uploadtak.com/images/5ql1quf4esjstigvnrb3.rar
این ساعت با تایمر 1
http://uploadtak.com/images/4y13sbfxo3a9zes16w.rar
اینم PWM با تایمر یک هست
http://uploadtak.com/images/lv3hmpv37e4j9xodh5r1.rar
اینم یه برنامه ساده برای تولید موج
$regfile ="m32def.dat"
$crystal=1000000
config timer0=timer , prescaler=1024
config portd=output
config portc=output
wait 2
start timer0
do
portd=timer0
portc.0=TIFR.0
waitms 100
if TIFR.0=1 then
TIFR.0=1
end if
loop

درمورد اون کدی که نوشتی حقیقتش من اطلاعاتی ندارم
برای دیدن شکل موج توی پروتئوس هم باید یه اسیلسکوپ از منوی سمت چپ پروتئوس قسمت ویرژوال ترمینال انتخاب کنی و متصل کنی به پورت خروجیت
و برنامه رو اجرا کنی
به همین سادگی به همین خوشمزگی
(آخرین ویرایش در این ارسال: ۲۱-دى-۱۳۹۰, ۲۱:۳۹:۱۳، توسط parniaan.)
۲۱-دى-۱۳۹۰, ۲۱:۳۵:۰۶
ارسال‌ها
پاسخ
تشکر شده توسط : sinohe, fabienmartin
sinohe آفلاین
كاربر دو ستاره
**

ارسال‌ها: 86
موضوع‌ها: 13
تاریخ عضویت: آذر ۱۳۹۰

تشکرها : 88
( 23 تشکر در 14 ارسال )
ارسال: #9
RE: سوال درباره نحوه تولید پالس مربعی
ممنون کمک بزرگی بود.
در رابطه با دیدن فرکانس در پروتئوس من اشتباهی سوال کردم، منظورم این بود که آیا میشه فهمید فرکانسی که تولید میشه چند هرتزه؟ اگه میشه چطور؟
اما در مورد برنامه، اونی که نوشتی فکر میکنم برام زیاد کمک کننده باشه، فقط خواهش دارم اگر امکانش هست برنامه رو توضیح بدی چیکار میکنه، و اینکه این برنامه در این شکل چند هرتز فرکانس تولید میکنه؟
ممنون
۲۱-دى-۱۳۹۰, ۲۱:۴۷:۴۰
ارسال‌ها
پاسخ
sharin آفلاین
مدیر بازنشسته
*****

ارسال‌ها: 2,053
موضوع‌ها: 28
تاریخ عضویت: مرداد ۱۳۸۹

تشکرها : 3714
( 8171 تشکر در 2772 ارسال )
ارسال: #10
RE: سوال درباره نحوه تولید پالس مربعی
توي همون اسكوپ پروتوس دوره تناوب موج رو مي تونيد بدست بياريد و معكوس كنيد مي شه فركانس ...
فكر كنم ابزار هاي ديگه هم داشته باشه كه من كار نكردم ...

برنامه هم واضحه ...

portd=timer0 مقدار تايمر رو روي پورت D نشون مي ده ... ! ( كه اصلا نيازي بهش نيست ... )
portc.0=TIFR.0 بيت صفر ريجستر TIFR رو روي پورت C نشون مي دهه ... ( كه باز هم نيازي بهش نيست )
waitms 100 اين يكي عامل مخل برنامه هست احتمالا ( چون كلا كار تايمر رو مي برهه زير سوال ... )!!
و ... ( شايد هم اشتباه مي كنم ... ! )

حقيقتش تاحالا همچين كدي براي تايمر نديدهه بودم ، بنظرم عملكرد درستي نبايد داشته باشه ...
در ضمن اين برنامه زمان CPU رو هم احتمالا مي گيرهه ...
------------
شما اين وظيفه رو بايد محول كني به تايمر و وقتي تايمر زمان رو ساخت با وقفه CPU رو خبر مي كنه و اينطوري ديگه زمان CPU تلف نمي شه ...
براي اين منظور لازمه كه بعد از كانفيگ تايمر ، enable اش كني و بعد از دستور On timer0 label براي پرش به label در زمان وقوع وقفه استفاده كني و بعد وقفه ي سراسري رو هم فعال كني ، با دستور Enable interrupts
و ...
ديگه داستان مي شه ... ، toggle رو مي توني تو label وقفه بذاري و يا در متن برنامه ي اصلي بنويسيش و ...
در مورد تايمر ها بخون و همينطور وقفه ها ... ، help بسكام خوبه ، مقاله هاي توي NET و بهتر از همش يه كتاب خوبه ...

----------------
در مورد
Pulseout Portc , 0 , X

يه سرچ تو help بسكام بزن و توضيحاتش رو بخون ...
بايد به پايه ي XTAL ميكرو كريستال 4MHz بذاري ...
اين دستور جاي اون X اي كه نوشتي بايد مقدار عددي بدي كه period رو بر حسب ميكرو ثانيه مي گيره ...
در واقع مقدار همون T رو بايد جاي X بنويسي ...
و اين طور كه از اين تابع و توضيحاتش بر مي ياد اين هم فركانس دقيق درست مي كنه ...

موفق باشي.
يا علي.


۲۱-دى-۱۳۹۰, ۲۲:۵۴:۴۲
وب سایت ارسال‌ها
پاسخ
تشکر شده توسط : sinohe
sinohe آفلاین
كاربر دو ستاره
**

ارسال‌ها: 86
موضوع‌ها: 13
تاریخ عضویت: آذر ۱۳۹۰

تشکرها : 88
( 23 تشکر در 14 ارسال )
ارسال: #11
RE: سوال درباره نحوه تولید پالس مربعی
ممنون تصمیم گرفتم با همون کد فرکانس رو درست کنم.
در مورد فرکانس ببین درست متوجه شدم؟
T=1/F که مثلا برای 10 کیلو هرتز اینطوری میشه؛ 1/10000 = 0.0001 ، حالا باید به جای X بزارم 0.0001 ، درسته؟
مثلا برای فرکانس 10 کیلو هرتز این برنامه زیر درسته؟ مقدار کریستالی که برای میکرو تعریف باید کنم هم آیا درسته؟
[/code]
$regfile = "m8def.dat"
$crystal = 1000000
Config Portc.0 = Output
Do
Pulseout Portc , 0 , 0.0001
Loop
End
[code]
سپاس
۲۲-دى-۱۳۹۰, ۱۴:۰۴:۳۳
ارسال‌ها
پاسخ
تشکر شده توسط : fabienmartin


موضوعات مرتبط با این موضوع...
موضوع نویسنده پاسخ بازدید آخرین ارسال
  [فوری] کمک درباره نویز گرفتن میکرو avr عابد مقدسیان 8 3,322 ۱۱-بهمن-۱۳۹۷, ۲۲:۴۱:۰۶
آخرین ارسال: 1نفر
Question [سوال] یه سوال درباره ماژول esp8266 Index1 4 3,150 ۰۴-اردیبهشت-۱۳۹۷, ۲۳:۰۹:۲۶
آخرین ارسال: babyy
  [فوری] ایجاد موج مربعی با دو کلید و نماش فرکانس در ال سی دی mamadr 0 2,041 ۰۹-تير-۱۳۹۶, ۱۶:۲۰:۲۹
آخرین ارسال: mamadr
  شمارش تعداد پالس های یک دستور؟ Ambassador 2 2,996 ۲۷-اردیبهشت-۱۳۹۶, ۱۶:۲۰:۵۶
آخرین ارسال: Ambassador
  درخواست راهنمایی درباره دماسنج و رطوبت سنج fedagh 2 3,195 ۰۳-دى-۱۳۹۵, ۰۱:۲۵:۰۷
آخرین ارسال: omid_phoenix
  [سوال] نحوه تست میکرو atmega32 salexe 0 2,037 ۲۵-مرداد-۱۳۹۵, ۲۱:۲۸:۲۱
آخرین ارسال: salexe
  راهنمایی برای تولید پالس vistac2000 15 17,041 ۰۸-اردیبهشت-۱۳۹۵, ۰۰:۳۹:۴۶
آخرین ارسال: omid_phoenix
  سوال درباره پروگرمر جمشاد alien 1 2,412 ۰۷-دى-۱۳۹۴, ۱۳:۰۰:۲۸
آخرین ارسال: sharin
Wink یک کتاب خیلی باحال و مفید درباره میکروکنترلرها lktra 0 2,320 ۰۵-دى-۱۳۹۴, ۰۱:۴۷:۳۴
آخرین ارسال: lktra
  سوال درباره ی avr با سی++ mahdieh_sh 2 2,693 ۱۸-مهر-۱۳۹۴, ۱۸:۲۳:۰۴
آخرین ارسال: vigraz

پرش به انجمن:


کاربرانِ درحال بازدید از این موضوع: 3 مهمان

صفحه‌ی تماس | IranVig | بازگشت به بالا | | بایگانی | پیوند سایتی RSS