سلام و وقت بخیر
من در حال کار با میکروکنترلر PIC18F67K40 و کامپایلر XC8 هستم و میخواهم با استفاده از CCP1 در حالت PWM، یک PWM ساده روی پایه RE5 ایجاد کنم.
در حال حاضر هدف فقط این است که بدون ADC و بدون هیچ ورودی، یک PWM ثابت با Duty Cycle = 50% روی RE5 داشته باشم.
طبق دیتاشیت:
CCP1CON برای انتخاب Mode مربوط به CCP1 استفاده میشود.
در CCPTMRS0، بیتهای C1TSEL[1:0] مشخص میکنند CCP1 از کدام Timer استفاده کند.
برای PWM میتوان Timer2 را انتخاب کرد.
طبق جدول PPS، مقدار خروجی CCP1OUT برابر 001001 است؛ بنابراین برای RE5 از RE5PPS استفاده میشود.
مشکل این است که با وجود تنظیمات PWM، روی پایه RE5 خروجی قابلمشاهدهای ندارم و اندازهگیری با اسیلوسکوپ حدود 1 mV نشان میدهد.
نکته مهم: در آزمایشهای قبلی، یک برنامه بسیار ساده برای تست سختافزار اجرا کردم و عملکرد میکرو و پایه موردنظر تأیید شد. بنابراین احتمال میدهم مشکل از تنظیمات CCP1 / Timer2 / PPS باشد.
من بخشهای مربوط به دیتاشیت را نیز بررسی کردهام، از جمله:
CCP1CON
CCPTMRS0
T2CLKCON
T2PR
T2CON
RE5PPS
اما هنوز نتوانستهام PWM را روی RE5 مشاهده کنم.
لطفاً اگر امکان دارد ایراد کد زیر و ترتیب صحیح تنظیم رجیسترهای PIC18F67K40 را بررسی کنید.
کد آزمایشی موردنظر من:
include <xc.h>
include <stdint.h>
define _XTAL_FREQ 64000000UL
// Configuration Bits
pragma config FEXTOSC = OFF
pragma config RSTOSC = HFINTOSC_64MHZ
pragma config WDTE = OFF
pragma config LVP = OFF
void main(void)
{
// -----------------------------
// Digital I/O
// -----------------------------
ANSELE = 0x00;
TRISE5 = 0;
// -----------------------------
// PPS
// CCP1OUT -> RE5
// -----------------------------
RE5PPS = 0x09;
// -----------------------------
// CCP1 Timer Selection
// CCP1 -> Timer2 for PWM
// C1TSEL[1:0] = 00
// -----------------------------
CCPTMRS0 &= 0xFC;
// -----------------------------
// Timer2
// -----------------------------
T2CLKCON = 0x01; // Fosc/4
T2PR = 0xFF;
T2TMR = 0x00;
// Prescaler 1:1
// Postscaler 1:1
// Timer2 ON
T2CON = 0x80;
// -----------------------------
// CCP1 PWM
// -----------------------------
CCP1CON = 0x8C;
// Duty cycle
CCPR1H = 0x00;
CCPR1L = 0x80;
while(1)
{
}
}
سؤالات من از متخصصان محترم انجمن:
آیا ترتیب تنظیم رجیسترها صحیح است؟
آیا مقدار RE5PPS = 0x09 برای اتصال CCP1OUT به RE5 صحیح است؟
آیا انتخاب Timer2 در CCPTMRS0 به شکل صحیح انجام شده است؟
مقدار صحیح CCP1CON برای PWM در PIC18F67K40 چیست؟
برای Duty Cycle 50% مقدار صحیح CCPR1H:CCPR1L چگونه باید محاسبه شود؟
آیا برای RE5 تنظیم دیگری مانند ANSELE، TRISE یا رجیستر دیگری لازم است؟
اگر اشکال از کد است، لطفاً یک کد حداقلی و کامل برای تولید PWM روی RE5 با CCP1 و Timer2 ارائه فرمایید.
هدف فعلاً فقط این است:
PIC18F67K40
↓
CCP1 PWM
↓
Timer2
↓
PPS
↓
RE5
↓
PWM 50%
ممنون میشوم اگر کد را بر اساس دیتاشیت PIC18F67K40 بررسی فرمایید.
من در حال کار با میکروکنترلر PIC18F67K40 و کامپایلر XC8 هستم و میخواهم با استفاده از CCP1 در حالت PWM، یک PWM ساده روی پایه RE5 ایجاد کنم.
در حال حاضر هدف فقط این است که بدون ADC و بدون هیچ ورودی، یک PWM ثابت با Duty Cycle = 50% روی RE5 داشته باشم.
طبق دیتاشیت:
CCP1CON برای انتخاب Mode مربوط به CCP1 استفاده میشود.
در CCPTMRS0، بیتهای C1TSEL[1:0] مشخص میکنند CCP1 از کدام Timer استفاده کند.
برای PWM میتوان Timer2 را انتخاب کرد.
طبق جدول PPS، مقدار خروجی CCP1OUT برابر 001001 است؛ بنابراین برای RE5 از RE5PPS استفاده میشود.
مشکل این است که با وجود تنظیمات PWM، روی پایه RE5 خروجی قابلمشاهدهای ندارم و اندازهگیری با اسیلوسکوپ حدود 1 mV نشان میدهد.
نکته مهم: در آزمایشهای قبلی، یک برنامه بسیار ساده برای تست سختافزار اجرا کردم و عملکرد میکرو و پایه موردنظر تأیید شد. بنابراین احتمال میدهم مشکل از تنظیمات CCP1 / Timer2 / PPS باشد.
من بخشهای مربوط به دیتاشیت را نیز بررسی کردهام، از جمله:
CCP1CON
CCPTMRS0
T2CLKCON
T2PR
T2CON
RE5PPS
اما هنوز نتوانستهام PWM را روی RE5 مشاهده کنم.
لطفاً اگر امکان دارد ایراد کد زیر و ترتیب صحیح تنظیم رجیسترهای PIC18F67K40 را بررسی کنید.
کد آزمایشی موردنظر من:
include <xc.h>
include <stdint.h>
define _XTAL_FREQ 64000000UL
// Configuration Bits
pragma config FEXTOSC = OFF
pragma config RSTOSC = HFINTOSC_64MHZ
pragma config WDTE = OFF
pragma config LVP = OFF
void main(void)
{
// -----------------------------
// Digital I/O
// -----------------------------
ANSELE = 0x00;
TRISE5 = 0;
// -----------------------------
// PPS
// CCP1OUT -> RE5
// -----------------------------
RE5PPS = 0x09;
// -----------------------------
// CCP1 Timer Selection
// CCP1 -> Timer2 for PWM
// C1TSEL[1:0] = 00
// -----------------------------
CCPTMRS0 &= 0xFC;
// -----------------------------
// Timer2
// -----------------------------
T2CLKCON = 0x01; // Fosc/4
T2PR = 0xFF;
T2TMR = 0x00;
// Prescaler 1:1
// Postscaler 1:1
// Timer2 ON
T2CON = 0x80;
// -----------------------------
// CCP1 PWM
// -----------------------------
CCP1CON = 0x8C;
// Duty cycle
CCPR1H = 0x00;
CCPR1L = 0x80;
while(1)
{
}
}
سؤالات من از متخصصان محترم انجمن:
آیا ترتیب تنظیم رجیسترها صحیح است؟
آیا مقدار RE5PPS = 0x09 برای اتصال CCP1OUT به RE5 صحیح است؟
آیا انتخاب Timer2 در CCPTMRS0 به شکل صحیح انجام شده است؟
مقدار صحیح CCP1CON برای PWM در PIC18F67K40 چیست؟
برای Duty Cycle 50% مقدار صحیح CCPR1H:CCPR1L چگونه باید محاسبه شود؟
آیا برای RE5 تنظیم دیگری مانند ANSELE، TRISE یا رجیستر دیگری لازم است؟
اگر اشکال از کد است، لطفاً یک کد حداقلی و کامل برای تولید PWM روی RE5 با CCP1 و Timer2 ارائه فرمایید.
هدف فعلاً فقط این است:
PIC18F67K40
↓
CCP1 PWM
↓
Timer2
↓
PPS
↓
RE5
↓
PWM 50%
ممنون میشوم اگر کد را بر اساس دیتاشیت PIC18F67K40 بررسی فرمایید.




دیدگاه