PDA

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



soodi
14-03-2012, 22:12
با سلام

من می خواهم واحد PWM رو در میکروکنترلر AT91SAM7X256 فعال کنم و در کنترل نور یک LED یا سرعت یک موتور یا اعمال به L298 یا ... استفاده کنم
دیتاشیت رو مطالعه کردم و جدول زیر که مربوط به رجیستر ها است رو در زیر آپلود کردم ، 8 تا رجیستر اول که مربوط به فعال یا غیر فعال کردن PWM و وقفه داخلی می باشد ولی رجیستر های بعدی رو اگر لطف فرمایید و توضیح دهید خیلی خیلی ممنون میشوم
توی Bascom-AVR یک مقدار رو داخل PWM قرار می دادم و نور LED یا سرعت موتور نسبت به این مقدار تغییر می کردم ولی حالا توی ARM و Keil چطوریه ؟

تا جایی که فهمیدم ، پایه ای رو که می خواهیم PWM رو روی آن فعال کنید باید ابتدا واحد PIO روی پایه رو غیر فعال کنید و سپس حالت Multi-Driver رو فعال می کنیم تا تمامی امکانات روی پایه از قبیل مقاومت Pull-Up یا ... غیر فعال شود و سپس رجیستر واحد همزمان سازی داده ها روی پورت های مختلف رو فعال می کنیم

لطفا من رو کمک و راهنمایی فرمایید

You can see links before reply


با سپاس

__________________________________________________ ________________________

سلام

دوستان کسی نیست این PWM رو به زبون ساده برای ما بگه ؟؟؟ حق الزحمت رو هم میدم
2 تا کتاب ARM دیگه هم خریدم و قسمت PWM رو خوندم ولی باز هم چیزی دستگیرم نشد ، یعنی یه چیزهایی فهمیدم ولی نمیدونم چرا جواب نمیگیرم ، خدایا دیگه دارم دیوانه میشم ، به خدا اگر یه نفر یه طوری این PWM رو برای من بگه که یاد بگیرم و بتونم یه LED رو نورش رو کنترل کنم یا سروو موتور رو روشن کنم ، با پیغام خصوصی با هم حساب میکنیم

الان این برنامه منه ولی هیچی به هیچی :


#include <AT91SAM7X256.h>
#include <lib_AT91SAM7X256.h>
#include <delay.h>

#define LCD_PORT_B
#define LCD_RS 20
#define LCD_E 21
#define LCD_DB4 22
#define LCD_DB5 23
#define LCD_DB6 24
#define LCD_DB7 25
#include <lcd.h>

int main (void)
{
int A;
A=0;

AT91C_BASE_PIOA->PIO_PDR=100000;
AT91C_BASE_PIOA->PIO_ASR=100000;
AT91C_BASE_PMC->PMC_PCER=(1<<AT91C_ID_PWMC);
AT91C_BASE_PWMC->PWMC_DIS=0xF;
AT91C_BASE_PWMC->PWMC_MR=0;
AT91C_BASE_PWMC_CH0->PWMC_CMR=(0x208);
AT91C_BASE_PWMC_CH0->PWMC_CPRDR=150;
AT91C_BASE_PWMC_CH0->PWMC_CDTYR=A;
AT91C_BASE_PWMC->PWMC_ENA=0x1;

lcd_init();

while(1)
{
AT91C_BASE_PWMC_CH0->PWMC_CDTYR=A;
cursor_off();
lcd_clear();
lcd_gotoxy(1,1);
lcd_puts(AT91C_BASE_PWMC_CH0->PWMC_CDTYR);
A++;
delay_ms(50);
}
}
ممنون

soodi
17-03-2012, 12:15
با سلام

من به تازگی شروع به کار با ARM کرده ام و با میکرو SAM7X256 و Keil کار میکنم و چند وقتی است که روی راه اندازی PWM وقت گزاشته ام ولی هیچی به هیچی ، چندتا کتاب هم در این رابطه خواندم ولی چیزی نفهمیدم ، تا این که به کتابخانه موجود در لینک زیر برخوردم و برنامه ام رو به صورت زیر نوشتم :
کلیه آموزش ها و نکات مهم برد eke2sam7x v2.0 کویرالکترونیک - ایـــــــــران میـــــــکرو ™ (You can see links before reply)



#include <at91sam7x256.h>
#include <lib_at91sam7x256.h>
#include <delay.h>
#include <PWM.h>

#define LCD_PORT_B
#define LCD_RS 20
#define LCD_E 21
#define LCD_DB4 22
#define LCD_DB5 23
#define LCD_DB6 24
#define LCD_DB7 25
#include <lcd.h>

int main(void){
int i;
i=0;

AT91C_BASE_PMC->PMC_PCER|=1<<AT91C_ID_PWMC;
PWMC_Configure_PIO(AT91C_BASE_PIOB,19);
PWMC_ConfigureClocks(500000,0,48000000);
PWMC_ConfigureChannel(0,AT91C_PWMC_CPRE_MCKA,0,0);
PWMC_SetPeriod(0,0xFFF);
PWMC_SetDutyCycle(0,240);
PWMC_EnableChannel(0);

lcd_init();
while(1)
{
i++;
PWMC_SetPeriod(0,i);
cursor_off();
lcd_clear();
lcd_gotoxy(1,1);
lcd_puts(i);
}
return 0;
}



1 . من برای کنترل نور یک LED و یا کنترل سرعت موتور باید الان چی رو تغییر بدهم ؟

2 . برای ایجاد PWM با مشخصات زیر باید چکار کنم یعنی کمترین مقدار DutyCycle و بیشترین مقدار DutyCycle رو باید چه مقداری قرار بدهم و Period رو چطوری تغییر بدهم ؟
فرکانس 50 هرتز (پریود 20 میلی ثانیه) و DutyCycle بین 5% تا 10% به ازای کمترین و بیشترین سرعت موتور یعنی 1 تا 2 میلی ثانیه است

3 . در رجیستر PWMC_ConfigureChannel برای منبع کلاک باید چه مقداری رو قرار بدهم چون clka و mck رو قبول نمیکند !!! و لطفا یه توضیحی در این مورد بدهید

الان یک LED به پورت B پین 19 متصل کردم ولی با برنامه مذکور هیچ تغییری نمیکند !!! من کدوم مقادیر رو باید تغییر بدهم ؟

خیلی خیلی ممنون می شوم اگر من رو کمک و راهنمایی کنید ، خیلی گیر کرده ام
سپاس بسیار بسیار فراوان

agape
17-03-2012, 14:25
دایی جان شما باید فرکانس کریری رو رو تنظیم کنی هر فرکانسی که دوست داری با استفاده از تابع PWMC_SetPeriod و بعد درصد دیوتی سایکل رو تنظیم میکنی با فرمان PWMC_SetDutyCycle و در ضمن قبلش باید کانال رو کانفیگ کنی - یعنی این که مشخص کنی از کدام منبع کلاک قراره استفاده کنی.
همون مثال کار میکنه دایی جان - من قبلا تستش کردم

1nafar
17-03-2012, 14:32
سلام
مطالب پست زیر رو بخونید :
Pwm - ایـــــــــران میـــــــکرو ™ (You can see links before reply)
اگه سوال داشتید مطرح کنید.

soodi
17-03-2012, 15:18
آقا خیلی ممنون از پاسختون

طبق فرمول زیر :
MCK/X*CPRD مقدار Period برابر است با 48000000/4*50000=240
:پس

PWMC_SetPeriod(0,240);
و سپس تنظیم DutyCycle :
پس :

PWMC_SetDutyCycle(0,i);
و مقدار متغیر i باید بین اعداد 0 تا 240 تغییر کند
برای تایین منبع کلاک هم باید مقدار دوم رجیستر زیر تغییر کند که می تواند clka , clkb , mck باشد
ولی چرا کامپایلر هنگام قرار دادن mck در این رجیستر Error می دهد ؟؟؟

PWMC_ConfigureChannel(0,AT91C_PWMC_CPRE_MCKA,0,0);
2. برای ایجاد PWM با مشخصات زیر باید چکار کنم ؟
فرکانس 50 هرتز (پریود 20 میلی ثانیه) و DutyCycle بین 5% تا 10% به ازای کمترین و بیشترین سرعت موتور یعنی 1 تا 2 میلی ثانیه است

تاپیکی که معرفی نمودید رو مطالعه کردم ولی مثل کتاب توضیح داده شده است ، من چیز زیادی نفهمیدم
من آموزش به زبان ساده و مرحله به مرحله می خواهم cry::cry::cry::

من الان این تغییرات رو اعمال می کنم و نتیجه رو اعلام میکنم

سپاس بسیار فراوان

soodi
17-03-2012, 16:37
سلام

مشکل حل شد
اشکال از lcd بود که به پورت b وصل شده بود و کل پورت b رو ریخته بود به هم
فکر کنم هدرش مشکل داره !!!!