اطلاعیه

Collapse
No announcement yet.

چگونه همه پایه های میکروکنترلر AVR را PWM کنیم ؟؟

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

  • Mohammad_2007
    replied
    پاسخ : چگونه همه پایه های میکروکنترلر AVR را PWM کنیم ؟؟

    ممنون ار پیگیریت سامان جان
    ببین منظور من اینه
    مثلا این افکت رو چطور باید توی برنامه شما بنویسم؟
    درضمن نمیخوام خاموش داشته باشم میخوام جای خاموش شدن کم نور بشن ، مثلا 1/3 نور اصلی

    کد:
    for(i=1;i<=128;i*=2)
    {
    PORTB=i;
    }
    ممنون از لطفت

    یک دیدگاه بنویسید:


  • SAMAN.ASADI
    replied
    پاسخ : چگونه همه پایه های میکروکنترلر AVR را PWM کن

    درود بر دوستان
    نوشته اصلی توسط soltanfarid

    میخام خودم بنویسم

    با کدویژن

    الگوریتم ش دست تم بیاد کافی برام

    خودم ننویسم سودی نداره برام

    با تشکر از حسن نیت شما که بدون چشم داشتی پاسخ میدید
    دوست عزیز همانطور که پیش از این هم گفته شد باید عدد را از ADC بخوانید و عدد را مساوی با PWM مورد نظر را مقدار دهی کنید
    نمونه کد :
    [code=c]/************************************************** ***
    This program was produced by the
    CodeWizardAVR V2.05.3 Standard
    Automatic Program Generator
    © Copyright 1998-2011 Pavel Haiduc, HP InfoTech s.r.l.
    http://www.hpinfotech.com
    Project : 32-channel PWM (Rain LED)
    Version : 2.1
    Date : 2/27/2014
    Author : Saman.Asadi
    www.ECA.ir
    Chip type : ATmega16
    Program type : Application
    AVR Core Clock frequency: 8.000000 MHz
    Memory model : Small
    External RAM size : 0
    Data Stack size : 256
    ************************************************** ***/
    #include <mega16a.h>
    #include <delay.h>

    #define ADC_VREF_TYPE 0x60
    // Read the 8 most significant bits
    // of the AD conversion result
    unsigned char read_adc(unsigned char adc_input)
    {
    ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
    // Delay needed for the stabilization of the ADC input voltage
    delay_us(10);
    // Start the AD conversion
    ADCSRA|=0x40;
    // Wait for the AD conversion to complete
    while ((ADCSRA & 0x10)==0);
    ADCSRA|=0x10;
    return ADCH;
    }

    #define led PORTB.0
    #define max_var_PWM 100
    unsigned char a = max_var_PWM;
    unsigned char pwm[35];

    // Timer 0 output compare interrupt service routine
    interrupt [TIM0_COMP] void timer0_comp_isr(void)
    {
    if(a == pwm[1])led=1;
    if(--a == 255)
    {
    a = max_var_PWM;
    PORTB = 0;
    }
    }

    void main(void)
    {
    unsigned char x;
    //Config all
    {
    //Config PORTS
    DDRB = 0xFF;

    //Config timers
    // Timer/Counter 0 initialization
    // Clock source: System Clock
    // Clock value: 1000.000 kHz
    // Mode: CTC top=OCR0
    // OC0 output: Disconnected
    TCCR0=0x0A;
    OCR0=150;
    // Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK=0x02;
    // Global enable interrupts
    #asm("sei&quot

    //Config ADC
    // ADC initialization
    // ADC Clock frequency: 62.500 kHz
    // ADC Voltage Reference: AVCC pin
    // ADC Auto Trigger Source: ADC Stopped
    // Only the 8 most significant bits of
    // the AD conversion result are used
    ADMUX=ADC_VREF_TYPE & 0xff;
    ADCSRA=0x87;
    }
    //End Config ......
    while(1)
    {
    x = read_adc(0) / 2.55;
    pwm[1] = x ;
    delay_ms(50);
    }
    }
    [/code]
    توضیحات پایین هم بخوانید بهتر متوجه خواهید شد ...

    نوشته اصلی توسط Mohammad_2007
    با تشکر از دوستان عزیز و مخصوصا جناب مهندس اسدی که واقعا زحمت کشیدند
    ممنون از ابراز لطفتون

    نوشته اصلی توسط Mohammad_2007
    تایپک رو کامل خوندم همه چیز اینجا خوب هست ، فقط کاش زحمت میکشیدید و روش کار با این کدهارو یاد میدادین که

    -چطور باید باهاش کار کرد
    اگر واقعا تنها یک بار با دقت کامل خوانده باشید خیلی راحت می توانید با آن کار کنید ...
    دقیقا پست اول :
    نوشته اصلی توسط سامان اسدی
    ================================================== ==================
    یک توضیح مختصر در مورد برنامه :
    برنامه طوری طراحی شده که با استفاده از آرایه میتوانیم مقدار تک تک PWM ها را تغییر بدهیم
    آرایه ای که []pwm نام دارد را میتوانید اندیس آن را برای PWM دلخواهتان تنظیم کنید
    بازه مقدار آرایه PWM از 0 تا 99 است که نشانگر دیوتی سایکل است :biggrin:
    این آرایه یه جورایی میشه گفت که مثل رجیستر عمل میکنه . یعنی اینکه تا مقدار به آن بدهیم PWM تنظیم میشود .
    ================================================== ==================
    من واقعا در تعجبم که چرا دوستان میگن که ما تاپیک رو خواندیم ولی یاد نگرفتیم !!!!

    نوشته اصلی توسط Mohammad_2007
    -چطور میشه افکت نوشت
    اون دیگه مشکل از من نیست
    خودتون باید برنامه نویسی رو خوب بلد بشوید و بدونید که اعداد رو چطوری جایگزین کنید و با اعداد چطوری بازی کنید... !!!

    نوشته اصلی توسط Mohammad_2007
    -چطور میشه تغییرات ایجاد کرد
    http://www.eca.ir/forum2/index.php?topic=90246.msg604568#msg604568
    این پست رو نگاه کن ...

    نوشته اصلی توسط Mohammad_2007
    -آیا میشه جوری کد رقص نور نوشت ک توی یک سری از جاها از این PWM استفاده کنیم و یک جاهایی نه؟
    بله میشه
    مثلا عدد بالاترین حد را به اسم مستعار روشن و عدد 0 را به اسم مستعار خاموش شدن تعریف کنید ...
    توی زبان سی :
    کد:
    #define	on_LED	max_var_PWM
    #define	off_LED	0
    و در قسمت کد نویسی توی حلقه اصلی باید نوشت ...
    کد:
    while(1)
    {
    	pwm[1] = on_LED;
    	delay_ms(500);
    	pwm[1] = off_LED;
    	delay_ms(500);
    }
    همین ...
    حالا اگر خواستیم که به عنوان pwm استفاده کنیم ...
    کد:
    while(1)
    {
    	for(x=0;x<100;x++)
    	{
    		pwm[1] = x;
    		delay_ms(10);	
    	}
    }
    تنها کافی هست که به آرایه مورد نظر (مثلا [pwm[1 ) مقدار صفر تا 99 بدهیم ... که این میزان شدت نور (از خاموشی تا روشنایی کامل) را تعیین میکند ...

    موفق باشید

    یک دیدگاه بنویسید:


  • zamanimahdi
    replied
    پاسخ : چگونه همه پایه های میکروکنترلر AVR را PWM کنیم ؟؟

    نوشته اصلی توسط Mohammad_2007
    با تشکر از دوستان عزیز و مخصوصا جناب مهندس اسدی که واقعا زحمت کشیدند

    تایپک رو کامل خوندم همه چیز اینجا خوب هست ، فقط کاش زحمت میکشیدید و روش کار با این کدهارو یاد میدادین که

    -چطور باید باهاش کار کرد
    -چطور میشه افکت نوشت
    -چطور میشه تغییرات ایجاد کرد
    -آیا میشه جوری کد رقص نور نوشت ک توی یک سری از جاها از این PWM استفاده کنیم و یک جاهایی نه؟

    و سوالاتی از این قبیل ! اگر لطف بفرمایید آموزش کاملی بدید واقعا ممنون میشم ...
    به ارایه ها مقدار بده
    کترین مقدار = کمترین نور یا خاموش
    بیشترین مقدار = بیشترین نور کاملا روشن
    اینطوری برنامه فلاشر خودتو بنویس حالا هر جا که خواستی pwmبزاری نقدار ارایه ها رو عوض کن

    یک دیدگاه بنویسید:


  • Mohammad_2007
    replied
    پاسخ : چگونه همه پایه های میکروکنترلر AVR را PWM کنیم ؟؟

    با تشکر از دوستان عزیز و مخصوصا جناب مهندس اسدی که واقعا زحمت کشیدند

    تایپک رو کامل خوندم همه چیز اینجا خوب هست ، فقط کاش زحمت میکشیدید و روش کار با این کدهارو یاد میدادین که

    -چطور باید باهاش کار کرد
    -چطور میشه افکت نوشت
    -چطور میشه تغییرات ایجاد کرد
    -آیا میشه جوری کد رقص نور نوشت ک توی یک سری از جاها از این PWM استفاده کنیم و یک جاهایی نه؟

    و سوالاتی از این قبیل ! اگر لطف بفرمایید آموزش کاملی بدید واقعا ممنون میشم ...

    یک دیدگاه بنویسید:


  • soltanfarid
    replied
    پاسخ : چگونه همه پایه های میکروکنترلر AVR را PWM کنیم ؟؟

    نوشته اصلی توسط سامان اسدی
    با بسکام میخوای یا کدویژن؟

    میخام خودم بنویسم

    با کدویژن

    الگوریتم ش دست تم بیاد کافی برام

    خودم ننویسم سودی نداره برام

    با تشکر از حسن نیت شما که بدون چشم داشتی پاسخ میدید

    یک دیدگاه بنویسید:


  • SAMAN.ASADI
    replied
    پاسخ : پاسخ : چگونه همه پایه های میکروکنترلر AVR &#

    نوشته اصلی توسط mobin-m
    سلام

    وقتی برنامه ی به زبان بیسیک رو خوندم این سوال برام پیش اومد که دوستان چرا از دستور pulseout استفاده نکردن ؟؟؟!؟!!!!؟؟ :eek:
    اگه در یه حلقه با دستور pulseout رو پین هایی پالس ایجاد کنیم مثل اینه که رو همه ی اون پین ها pwm داریم!


    مثلا :
    کد:
    do
    pulseout porta,0,a
    pulseout porta,1,b
    pulseout porta,2,c
    pulseout porta,3,d
    pulseout porta,4,e
    pulseout porta,5,f
    pulseout porta,6,g
    pulseout porta,7,h
    
    loop
    حالا تمام پین های پورت a دارن pwm ایجاد میکنن!
    خیر جانم ...
    اگر میشد که ، این همه فکر خرج نمیکردم ...
    بعدش هم این دستور برای زمانی به کار میره که یک تک پالس بخواهید با مدت زمانی که برای آن تعریف میکنید ...
    تازه با فرض این که موج PWM را ایجاد کنه همه با هم اجرا نمیکنه ... یعنی اینکه خط به خط ایجاد میشه ....
    اون برنامه ای که نوشتم تمام پایه ها با هم PWM ایجاد میکنه ... و تمام پایه ها مستقل از همدیگر ... !!!
    البته نه اینکه فرکانسهاشون با هم فرق کنه ... منظور این است که دیوتی سایکل ها از هم مستقل هستند ...

    موفق باشید

    یک دیدگاه بنویسید:


  • mobin-m
    replied
    پاسخ : چگونه همه پایه های میکروکنترلر AVR را PWM کن

    سلام

    وقتی برنامه ی به زبان بیسیک رو خوندم این سوال برام پیش اومد که دوستان چرا از دستور pulseout استفاده نکردن ؟؟؟!؟!!!!؟؟ :eek:
    اگه در یه حلقه با دستور pulseout رو پین هایی پالس ایجاد کنیم مثل اینه که رو همه ی اون پین ها pwm داریم!


    مثلا :
    کد:
    do
    pulseout porta,0,a
    pulseout porta,1,b
    pulseout porta,2,c
    pulseout porta,3,d
    pulseout porta,4,e
    pulseout porta,5,f
    pulseout porta,6,g
    pulseout porta,7,h
    
    loop
    حالا تمام پین های پورت a دارن pwm ایجاد میکنن!




    یک دیدگاه بنویسید:


  • SAMAN.ASADI
    replied
    پاسخ : چگونه همه پایه های میکروکنترلر AVR را PWM کنیم ؟؟

    نوشته اصلی توسط soltanfarid
    با سلام و تشکر

    تعداد آرایه باید 255 تای باشه؟
    با بسکام میخوای یا کدویژن؟

    یک دیدگاه بنویسید:


  • soltanfarid
    replied
    پاسخ : چگونه همه پایه های میکروکنترلر AVR را PWM کنیم ؟؟

    نوشته اصلی توسط سامان اسدی
    سلام
    کار سختی نیست
    شما میتوانید عدد را از ADC بخوانید و آن را مساوی با یکی از خانه های(اندیس) مورد نظر آرایه مقدار دهی کنید ...

    موفق باشید
    با سلام و تشکر

    تعداد آرایه باید 255 تای باشه؟

    یک دیدگاه بنویسید:


  • SAMAN.ASADI
    replied
    پاسخ : چگونه همه پایه های میکروکنترلر AVR را PWM کنیم ؟؟

    نوشته اصلی توسط amin tal
    سلام بر دوستان عزیز...
    ایجاد یک موج مربعی با طول موج کوتاه (زیر کیلو هرتز)بسیار دقیق که در اسکیلوپ هم دقیق باشه و میزان صدم هرتز خطا داشته باشه با میکرو Avr امکانپذیره؟
    و از طری نرم افزاری موج دقیقتری بدست میاد یا از طریق سخت افزاری؟
    سلام

    پاسخ پرسش یک:
    بله ... امکان پذیر است ...

    پاسخ پرسش دو:
    تردیدی نکنید که نرم افزار هیچوقت به پای سخت افزار نمی رسه ...
    امکانات سخت افزاری بسیار دقیقتر و با پردازش بسیار کمتر در اختیار است ... یا در بعضی از مواقع بدون پردازش آن کار را انجام خواهند داد ...

    موفق باشید

    یک دیدگاه بنویسید:

لطفا صبر کنید...
X