فهرست مطالب:
- مرحله 1: توضیحات
- مرحله 2: تایمرهای AVR - حالت PWM
- مرحله 3: اندازه گیری شدت نور - ADC & LDR
- مرحله 4: کنترل کننده DC موتور و دو درایور موتور H-Bridge Module-L298N
- مرحله 5: نوشتن کد برای یک برنامه در C. بارگذاری فایل HEX در حافظه فلش میکروکنترلر
- مرحله 6: مدار الکتریکی
تصویری: میکروکنترلر AVR مدولاسیون عرض پالس. کنترل کننده موتور DC و شدت نور LED .: 6 مرحله
2024 نویسنده: John Day | [email protected]. آخرین اصلاح شده: 2024-01-30 08:55
سلام به همگی!
مدولاسیون عرض پالس (PWM) یک تکنیک بسیار رایج در مخابرات و کنترل قدرت است. معمولاً برای کنترل توان تغذیه شده به یک دستگاه الکتریکی ، خواه موتور ، LED ، بلندگوها و غیره استفاده می شود. این اساساً یک تکنیک تعدیل است که در آن عرض نبض حامل مطابق با سیگنال پیام آنالوگ متفاوت است به
ما مدار الکتریکی ساده ای برای کنترل سرعت چرخش موتور DC در شدت نور وابسته ایجاد می کنیم. ما قصد داریم از ویژگی های مقاومت وابسته به نور و میکروکنترلر AVR مانند تبدیل آنالوگ به دیجیتال برای اندازه گیری شدت نور استفاده کنیم. همچنین ما قصد داریم از Dual H-Bridge Motor Driver Module-L298N استفاده کنیم. به طور معمول در کنترل سرعت و جهت موتورها استفاده می شود ، اما می تواند برای پروژه های دیگر مانند افزایش روشنایی برخی از پروژه های روشنایی استفاده شود. همچنین ، یک دکمه به مدار ما اضافه کنید تا جهت چرخش موتور را تغییر دهید.
مرحله 1: توضیحات
هر یک از بدنهای این جهان دارای اینرسی هستند. موتور هر زمان که روشن شود می چرخد. به محض خاموش شدن ، متوقف می شود. اما بلافاصله متوقف نمی شود ، مدتی طول می کشد. اما قبل از قطع کامل ، دوباره روشن می شود! بنابراین شروع به حرکت می کند. اما حتی در حال حاضر ، مدتی طول می کشد تا به سرعت کامل خود برسد. اما قبل از وقوع ، خاموش می شود و غیره. بنابراین ، اثر کلی این عمل این است که موتور به طور مداوم می چرخد ، اما با سرعت کمتری.
مدولاسیون پهنای پالس (PWM) یک تکنیک تغییر قدرت نسبتاً اخیر برای تأمین مقادیر متوسط توان الکتریکی بین سطوح کاملا روشن و خاموش است. معمولا ، پالس های دیجیتال دارای دوره زمانی روشن و خاموش یکسانی هستند ، اما در برخی از شرایط ما به پالس دیجیتال نیاز داریم تا بیشتر/کمتر در زمان/خاموش باشد. در تکنیک PWM ، ما پالس های دیجیتالی با مقدار نابرابر حالت روشن و خاموش ایجاد می کنیم تا مقادیر ولتاژ متوسط مورد نیاز را بدست آوریم.
چرخه وظیفه با درصد طول مدت ولتاژ بالا در یک پالس دیجیتال کامل تعریف می شود. می توان آن را محاسبه کرد:
٪ چرخه وظیفه = T روشن /T (زمان دوره) x 100
اجازه دهید بیانیه مشکل را در نظر بگیریم. ما باید یک سیگنال PWM 50 هرتز با 45 درصد چرخه کار تولید کنیم.
فرکانس = 50 هرتز
دوره زمانی ، T = T (روشن) + T (خاموش) = 1/50 = 0.02 ثانیه = 20 میلی ثانیه
چرخه وظیفه = 45
بنابراین ، با توجه به معادله ارائه شده در بالا ، به دست می آوریم
T (روشن) = 9 میلی ثانیه
T (خاموش) = 11 میلی ثانیه
مرحله 2: تایمرهای AVR - حالت PWM
برای ساخت PWM ، AVR حاوی سخت افزار جداگانه است! با استفاده از این ، CPU به سخت افزار دستور می دهد PWM یک چرخه وظیفه خاص را تولید کند. ATmega328 دارای 6 خروجی PWM است ، 2 تایمر/شمارنده 0 (8 بیت) ، 2 تایمر/شمارنده 1 (16 بیت) و 2 تایمر/شمارنده 2 (8 بیت) قرار دارد. Timer/Counter0 ساده ترین دستگاه PWM در ATmega328 است. تایمر/شمارنده 0 می تواند در 3 حالت اجرا شود:
- PWM سریع
- PWM تصحیح فاز و فرکانس
- PWM تصحیح فاز
هر یک از این حالت ها می تواند معکوس یا غیر معکوس باشد.
تایمر 0 را در حالت PWM راه اندازی کنید:
TCCR0A | = (1 << WGM00] | (1 << WGM01] - راه اندازی WGM: سریع PWM
TCCR0A | = (1 << COM0A1] | (1 << COM0B1) - تنظیم حالت خروجی مقایسه A ، B
TCCR0B | = (1 << CS02) - تایمر را با پیش شماره گیری = 256 تنظیم کنید
مرحله 3: اندازه گیری شدت نور - ADC & LDR
مقاومت وابسته به نور (LDR) یک مبدل است که وقتی نور روی سطح آن تغییر می کند ، مقاومت خود را تغییر می دهد.
LDR ها از مواد نیمه هادی ساخته شده اند تا بتوانند خواص حساس به نور خود را داشته باشند. این LDR ها یا PHOTO RESISTORS بر اساس اصل "هدایت عکس" کار می کنند. در حال حاضر آنچه این اصل می گوید این است که هر زمان که نور روی سطح LDR بیفتد (در این مورد) رسانایی عنصر افزایش می یابد یا به عبارت دیگر مقاومت LDR با سقوط نور بر سطح LDR کاهش می یابد. این ویژگی کاهش مقاومت برای LDR بدست می آید زیرا این ویژگی از مواد نیمه هادی است که در سطح استفاده می شود. LDR اغلب برای تشخیص وجود نور یا اندازه گیری شدت نور استفاده می شود.
برای انتقال اطلاعات پیوسته خارجی (اطلاعات آنالوگ) به یک سیستم دیجیتال/محاسباتی ، باید آنها را به مقادیر صحیح (دیجیتال) تبدیل کنیم. این نوع تبدیل توسط مبدل آنالوگ به دیجیتال (ADC) انجام می شود. فرآیند تبدیل مقدار آنالوگ به ارزش دیجیتال به عنوان تبدیل آنالوگ به دیجیتال شناخته می شود. به طور خلاصه ، سیگنالهای آنالوگ سیگنالهای دنیای واقعی در اطراف ما هستند مانند صدا و نور.
سیگنالهای دیجیتال معادلهای آنالوگ در قالب دیجیتال یا عددی هستند که توسط سیستمهای دیجیتالی مانند میکروکنترلرها به خوبی قابل درک هستند. ADC یکی از این سخت افزارها است که سیگنال های آنالوگ را اندازه گیری می کند و معادل دیجیتالی همان سیگنال را تولید می کند. میکروکنترلرهای AVR دارای امکانات ADC برای تبدیل ولتاژ آنالوگ به یک عدد صحیح است. AVR آن را به عدد 10 بیتی از محدوده 0 تا 1023 تبدیل می کند.
برای اندازه گیری شدت نور از تبدیل ولتاژ آنالوگ به دیجیتال از مدار تقسیم کننده با LDR استفاده می کنیم.
راه اندازی ADC:
TADCSRA | = (1 << ADEN] - ADC را فعال کنید
ADCSRA | = (1 << ADPS2) | (1 << ADPS1] | (1ADPS0) - تنظیم پیش فروش ADC = 128
ADMUX = (1 << REFS0] - تنظیم ولتاژ مرجع = AVCC ؛ - راه اندازی کانال ورودی = ADC0
ویدیو را با شرح مفصل میکروکنترلر ADC AVR: میکروکنترلر AVR تماشا کنید. اندازه گیری شدت نور ADC & LDR
مرحله 4: کنترل کننده DC موتور و دو درایور موتور H-Bridge Module-L298N
ما از درایورهای موتور DC استفاده می کنیم زیرا میکروکنترلرها نمی توانند به طور کلی بیش از 100 میلی آمپر جریان تولید کنند. میکروکنترلرها هوشمند هستند اما قوی نیستند. این ماژول برخی از ماهیچه ها را به میکروکنترلرها برای حرکت موتورهای DC با قدرت بالا اضافه می کند. این دستگاه می تواند 2 موتور DC را به طور همزمان تا 2 آمپر در هر یک یا یک موتور پله ای کنترل کند. ما می توانیم سرعت را با استفاده از PWM و همچنین جهت چرخش موتورها کنترل کنیم. همچنین ، برای رانندگی روشنایی نوار LED استفاده می شود.
توضیحات پین:
پورت OUT1 و OUT2 ، که برای اتصال موتور DC است. OUT3 و OUT4 برای اتصال نوار LED.
ENA و ENB پین های فعال هستند: با اتصال ENA به بالا (+5V) پورت OUT1 و OUT2 را فعال می کند.
اگر پین ENA را به کم (GND) وصل کنید ، OUT1 و OUT2 را غیرفعال می کند. به طور مشابه ، برای ENB و OUT3 و OUT4.
IN1 تا IN4 پین های ورودی هستند که به AVR متصل می شوند.
اگر IN1-high (+5V) ، IN2-low (GND) ، OUT1 زیاد می شود و OUT2 کم می شود ، بنابراین می توانیم موتور را هدایت کنیم.
اگر IN3-high (+5V) ، IN4-low (GND) ، OUT4 زیاد می شود و OUT3 کم می شود ، بنابراین چراغ نوار LED روشن است.
اگر می خواهید جهت چرخش موتور را معکوس کنید ، فقط قطبیت IN1 و IN2 را معکوس کنید ، به طور مشابه برای IN3 و IN4.
با اعمال سیگنال PWM به ENA و ENB می توانید سرعت موتورها را بر روی دو پورت خروجی مختلف کنترل کنید.
برد می تواند از 7 ولت تا 12 ولت را به طور اسمی قبول کند.
جامپر: سه پین جهنده وجود دارد. بلوز 1: اگر موتور شما به بیش از 12 ولت نیاز دارد ، باید Jumper 1 را جدا کرده و ولتاژ مورد نظر (حداکثر 35 ولت) را در ترمینال 12 ولت اعمال کنید. منبع و ورودی 5 ولت دیگر در پایانه 5 ولت بیاورید. بله ، در صورت نیاز به اعمال بیش از 12 ولت (هنگام حذف بلوز 1) ، باید 5 ولت وارد کنید.
ورودی 5 ولت برای عملکرد مناسب IC است ، زیرا حذف بلوز تنظیم کننده داخلی 5V را غیرفعال می کند و از ولتاژ ورودی بالاتر از ترمینال 12 ولت محافظت می کند.
اگر منبع تغذیه شما بین 7 ولت تا 12 ولت باشد ، ترمینال 5 ولت به عنوان خروجی عمل می کند و اگر بیش از 12 ولت اعمال کنید و بلوز حذف شود ، به عنوان ورودی عمل می کند.
Jumper 2 و Jumper 3: اگر این دو جامپر را بردارید باید سیگنال فعال و غیرفعال را از میکروکنترلر وارد کنید ، اکثر کاربران ترجیح می دهند دو جامپر را حذف کرده و سیگنال را از میکروکنترلر اعمال کنند.
اگر دو پرش را نگه دارید ، OUT1 تا OUT4 همیشه فعال است. بلوز ENA را برای OUT1 و OUT2 به خاطر بسپارید. بلوز ENB برای OUT3 و OUT4.
مرحله 5: نوشتن کد برای یک برنامه در C. بارگذاری فایل HEX در حافظه فلش میکروکنترلر
نوشتن و ساخت برنامه میکروکنترلر AVR در C Code با استفاده از بستر توسعه یکپارچه - Atmel Studio.
#ifndef F_CPU #define F_CPU 16000000UL // بیان فرکانس کریستال کنترل کننده (16 مگاهرتز AVR ATMega328P) #endif
#include // header برای فعال کردن کنترل جریان داده روی پین ها. پین ها ، پورت ها و … را تعریف می کند #include // header برای فعال کردن عملکرد تاخیری در برنامه
#define BUTTON1 2 // سوئیچ دکمه متصل به پورت B پین 2 #تعریف DEBOUNCE_TIME 25 // زمان منتظر ماندن در حالی که دکمه "رفع گزاف گویی" #تعریف LOCK_INPUT_TIME 300 // زمان منتظر ماندن پس از فشار یک دکمه
// Timer0، PWM Initialization void timer0_init () {// تایمر OC0A ، پین OC0B را در حالت ضامن و حالت CTC TCCR0A | = (1 << COM0A1] | (1 << COM0B1) | (1 << WGM00) | (1 << WGM01] ؛ // تنظیم زمان سنج با پیش شماره گیری = 256 TCCR0B | = (1 << CS02) ؛ // مقداردهی اولیه TCNT0 = 0؛ // مقداردهی اولیه را مقایسه کنید OCR0A = 0؛ }
// ADC Initialization void ADC_init () {// ADC را فعال کنید ، نمونه گیری freq = osc_freq/128 تنظیم پیش فروشنده در حداکثر مقدار ، 128 ADCSRA | = (1 << ADEN] | (1 << ADPS2] | (1 << ADPS1] | (1 << ADPS0] ؛
ADMUX = (1 << REFS0] ؛ // مرجع ولتاژ (AVCC) را انتخاب کنید
// وضعیت تغییر دکمه بدون علامت char button_state () {
/ * وقتی دکمه 1 بیت روشن است فشار داده می شود */
اگر (! (PINB & (1 <
{
_delay_ms (DEBOUNCE_TIME) ؛
اگر (! (PINB & (1 <
}
بازگشت 0 ؛
}
// Ports Initialization void port_init () {DDRB = 0b00011011؛ // PB0-IN1 ، PB1-IN2 ، PB3-IN3 ، PB4-IN4 ، PB2-BUTTON SWITCH DIRECT PORTB = 0b00010110 ؛
DDRD = 0b01100000 ؛ // PD5-ENB (OC0B) ، PD6-ENA (OC0A) PORTD = 0b00000000 ؛
DDRC = 0b00000000 ؛ // PC0-ADC PORTC = 0b00000000؛ // همه پین های PORTC را کم کنید که آن را خاموش می کند. }
// این تابع مقدار تبدیل آنالوگ به دیجیتال را می خواند. uint16_t get_LightLevel () {_delay_ms (10)؛ // مدتی منتظر بمانید تا کانال ADCSRA | = (1 << ADSC]؛ // با تنظیم بیت ADSC تبدیل ADC را شروع کنید. 1 به ADSC بنویسید
در حالی که (ADCSRA & (1 << ADSC))؛ // منتظر بمانید تا تبدیل کامل شود
// تا آن زمان ADSC دوباره 0 می شود ، حلقه را به طور مداوم _delay_ms (10) اجرا کنید. بازگشت (ADC) ؛ // نتیجه 10 بیتی را برگردانید
}
// این تابع یک عدد را از یک محدوده (0-1023) به محدوده دیگر (0-100) دوباره نقشه برداری می کند. نقشه uint32_t (uint32_t x ، uint32_t in_min ، uint32_t in_max ، uint32_t out_min ، uint32_t out_max) {return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min ؛ }
int main (باطل)
{uint16_t i1 = 0؛
port_init ()؛
timer0_init ()؛ ADC_init ()؛ // مقداردهی اولیه ADC
در حالی که (1)
{i1 = نقشه (get_LightLevel () ، 0 ، 1023 ، 0 ، 100) ؛
OCR0A = i1 ؛ // تنظیم خروجی مقایسه کانال ثبت A OCR0B = 100-i1؛ // تنظیم خروجی مقایسه کانال ثبت B (معکوس)
if (button_state ()) // اگر دکمه فشار داده شود ، وضعیت LED را تغییر داده و 300 ثانیه به تأخیر بیندازید (#تعریف LOCK_INPUT_TIME) {PORTB ^= (1 << 0 0] ؛ // تغییر وضعیت فعلی پین IN1. PORTB ^= (1 << 1) ؛ // تغییر وضعیت فعلی پین IN2. جهت چرخش موتور را معکوس کنید
PORTB ^= (1 << 3) ؛ // تغییر وضعیت فعلی پین IN3. PORTB ^= (1 << 4] ؛ // تغییر وضعیت فعلی پین IN4. نوار LED خاموش/روشن می شود. _delay_ms (LOCK_INPUT_TIME) ؛ }}؛ بازگشت (0) ؛ }
برنامه نویسی کامل شده است. در مرحله بعد ، ساخت و کامپایل کد پروژه در فایل hex.
بارگذاری فایل HEX در حافظه فلش میکروکنترلر: در پنجره اعلان DOS دستور زیر را وارد کنید:
avrdude –c [نام برنامه نویس] –p m328p –u –U flash: w: [نام فایل شش ضلعی شما]
در مورد من این است:
avrdude –c ISPProgv1 –p m328p –u –U فلش: w: PWM.hex
این دستور فایل hex را در حافظه میکروکنترلر می نویسد. ویدیو را با شرح مفصل در مورد سوختن فلش حافظه میکروکنترلر مشاهده کنید: در حال سوختن حافظه فلش میکروکنترلر…
خوب! در حال حاضر ، میکروکنترلر مطابق دستورالعمل برنامه ما کار می کند. بگذار چک کنیم!
مرحله 6: مدار الکتریکی
قطعات را مطابق نمودار شماتیک متصل کنید.
توصیه شده:
Visuino نحوه استفاده از مدولاسیون عرض پالس (PWM) برای تغییر روشنایی LED: 7 مرحله
Visuino نحوه استفاده از مدولاسیون عرض پالس (PWM) برای تغییر روشنایی یک LED: در این آموزش ما از LED متصل به Arduino UNO و Visuino برای تغییر روشنایی آن با استفاده از مدولاسیون عرض پالس (PWM) استفاده می کنیم
Visuino RAMPS برای مدولاسیون عرض پالس (PWM) با استفاده از LED: 8 مرحله
Visuino RAMPS for Pulse Width Modulation (PWM) Using LED: در این آموزش ما از LED متصل به Arduino UNO و Visuino برای کم نور کردن LED با استفاده از Pulse Width Modulation (PWM) و Ramps استفاده می کنیم
مدار نور شمع OLED با مقاومت در برابر نور برای کنترل شدت (TfCD): 4 مرحله (همراه با تصاویر)
مدار نور شمع OLED با مقاومت در برابر شدت برای کنترل شدت (TfCD): در این مقاله آموزشی به شما نشان می دهیم که چگونه می توانید مداری را ایجاد کنید که نشان می دهد (O) چراغ مانند یک شمع چشمک می زند و به شدت محیط واکنش نشان می دهد. با شدت نور کمتر ، خروجی نور کمتری از منابع نور مورد نیاز است. با استفاده از این برنامه
مدولاسیون عرض پالس ساده (و کثیف) (PWM) با تایمر 555: 3 مرحله
ساده (و کثیف) مدولاسیون عرض پالس (PWM) با تایمر 555: مدار ساده برای کنترل سرعت موتور DC (کنترل سرعت فن ، کاهش نور / کم نور LED و غیره) با استفاده از تایمر 555. همچنین نقطه شروع خوبی برای مبتدیانی است که مایل به دستیابی به آنها هستند دست ها با آی سی تایمر 555 کثیف شده اند. برخی معتقدند که این بیشترین نیست
مشعل LED مدولاسیون عرض پالس: 8 مرحله
مشعل LED مدولاسیون عرض پالس: از مدولاسیون عرض پالس (PWM) می توان برای تغییر قدرت ، سرعت یا روشنایی بسیاری از دستگاه ها استفاده کرد. با LED ها می توان از PWM برای کم نورتر یا روشن تر ساختن آنها استفاده کرد. من از آنها برای ساخت یک مشعل کوچک دستی استفاده می کنم. با روشن کردن سریع آن می توان LED را کم کرد و