PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Cơ bản về vi điều khiển và PIC (http://www.picvietnam.com/forum/forumdisplay.php?f=8)
-   -   Vấn đề PWM của PIC 18F4331 (http://www.picvietnam.com/forum/showthread.php?t=2619)

Mr.Bi 07-07-2009 04:51 PM

thêm vào dòng #byte PORTB=0x06

vagabondtt1503 07-07-2009 05:38 PM

Trích:

Nguyên văn bởi namqn (Post 27447)
Module MCPWM của dsPIC hoạt động khác với module PCPWM của PIC18. Với PIC18 thì PDCx = 4 x PTPER sẽ tương ứng với duty cycle = 100 %.

Thân,

Em đã rõ.Cảm ơn sự giúp đỡ của anh

nhamdtk4 07-07-2009 09:56 PM

Trích:

Nguyên văn bởi hoangtanduong13 (Post 27449)
no bao toi 9 loi lan!nhug ma chu yeu la undefined indentifier portb
mog cac pac giup do!thank nhieu!

Copy file DEFS_16F877A.h cho vào thư mục Devices của PICC trong ổ C (file này đã định nghĩa các thanh ghi chức năng đặc biệt mà CCS chưa định nghĩa).

xuanhiendk2 09-07-2009 11:33 PM

Các bạn cho mình hỏi. Ví dụ chương trình viết như sau:
void main()
{ setup_power_pwm(PWM_CLOCK_DIV_4|PWM_FREE_RUN|PWM_D EAD_CLOCK_DIV_4,1,10000,400,0,1,0);
setup_power_pwm_pins(PWM_COMPLEMENTARY,PWM_COMPLEM ENTARY,PWM_COMPLEMENTARY,PWM_OFF);

while(true)
{
set_power_pwm0_duty(200);
//set_power_pwm1_duty(4000);
set_power_pwm2_duty(100);
//set_power_pwm3_duty(4000);
set_power_pwm4_duty(100);
}

}
Theo mình thì chương trình này sẽ tạo ra xung với chu kỳ là 400us và duty(theo mình là chu kỳ xung mức 1) là 200. Tuy nhiên khi mô phỏng mình thấy không phải thế. Giải thích hộ mình các tham số Time base, period, duty
Thanks!

vagabondtt1503 10-07-2009 04:29 AM

Trích:

Nguyên văn bởi xuanhiendk2 (Post 27496)
Các bạn cho mình hỏi. Ví dụ chương trình viết như sau:
void main()
{ setup_power_pwm(PWM_CLOCK_DIV_4|PWM_FREE_RUN|PWM_D EAD_CLOCK_DIV_4,1,10000,400,0,1,0);
setup_power_pwm_pins(PWM_COMPLEMENTARY,PWM_COMPLEM ENTARY,PWM_COMPLEMENTARY,PWM_OFF);

while(true)
{
set_power_pwm0_duty(200);
//set_power_pwm1_duty(4000);
set_power_pwm2_duty(100);
//set_power_pwm3_duty(4000);
set_power_pwm4_duty(100);
}

}
Theo mình thì chương trình này sẽ tạo ra xung với chu kỳ là 400us và duty(theo mình là chu kỳ xung mức 1) là 200. Tuy nhiên khi mô phỏng mình thấy không phải thế. Giải thích hộ mình các tham số Time base, period, duty
Thanks!

bạn dùng phàn mềm nào để mô phỏng?

1.Theo ý kiến chủ quan của mình thì đa số các phần
mềm mô phỏng thường không đúng với thời gian thực,nó còn phụ thuộc vào CPU của máy tính đang sử dụng phần mềm mô phỏng nữa,với các ứng dụng về thời gian(chu kỳ) thì theo lời khuyên hầu hết mọi người trên diễn đàn thì làm mạch thật sẽ kiểm tra chính xác hơn.
2. Giải thích hộ mình các tham số Time base, period, duty . Vấn đề này bạn xem câu trả lời của anh namqn :
Trích:

Nguyên văn bởi namqn (Post 9715)
Bạn hiểu sai rồi. 0 đến 16383 là phạm vi giá trị cho phép đối với giá trị của tham số duty trong cú pháp trên.

Duty cycle của tín hiệu PWM là thời gian tín hiệu ở mức tích cực so với thời gian của toàn bộ chu kỳ. Ở đây, hàm chỉ đặt giá trị vào các thanh ghi PDCL và PDCH của module Power Control PWM trong PIC18Fxx31. Bạn cần phải xác định thời gian của toàn bộ chu kỳ nữa, nó được thiết lập thông qua các thanh ghi PTCON và PTPER (thiết lập prescale, postscale và chế độ chạy của timer dành riêng dùng làm time base cho module, và giá trị ngưỡng trong thanh ghi PTPER để quyết định thời gian của 1 chu kỳ).

Thư viện của CCS C cung cấp cho bạn các hàm để thuận tiện hơn trong việc viết code, nhưng bạn vẫn phải nắm rõ module mình đang dùng để có những thiết lập thích hợp. Trình biên dịch không thể thay bạn quyết định những tham số đó. Tôi đề nghị bạn đọc lại phần hướng dẫn của hàm setup_power_pwm, đảm bảo là bạn nắm rõ ý nghĩa của từng tham số trong hàm. Tôi cũng đề nghị bạn đọc lại phần 17 trong datasheet của PIC18F4431, nói về module Power Control PWM (tôi biết là nó dài, nhưng bạn đọc nó sẽ tốt hơn). Sau đó thử xác định xem với những gì bạn đã viết thì thời gian của 1 chu kỳ là bao nhiêu, và duty cycle tương ứng là bao nhiêu, nó có đúng như bạn đã thấy trong thực tế hay không.

Thân,


xuanhiendk2 10-07-2009 09:35 PM

Mình mô phỏng bằng Proteus mà. Bạn có thể trả lời rõ hơn không? Mình đang cần gấp nên dịch datasheet cũng vội. Nhưng theo mình thì period là chu kỳ của PWM, còn duty_cycle là chu kỳ tích cực. Nhưng không hiếu sao khi khai báo và mô phỏng kết quả lại không chính xác. Liệu có phải khi viết trong CCS vấn phải tính TPWM theo công thức trong datasheet giống như viết bằng ASM sao?

xuanhiendk2 12-07-2009 12:15 PM

Xin lỗi vì đã làm phiền các bạn. Câu hỏi của mình ko cần phải trả lời nữa.

dung h 12-07-2009 05:57 PM

cho mình hỏi là mình đánh chương trình vd pwm (của 1 bạn trên diễn đàn) , mình thấy o có lỗi gì cả,trong ccs c dịch ngon lành o báo lỗi, sau đó mình mô phỏng trên proteus thì o thấy gì cả?????
bác nào biết tại sao thì chỉ cho em với! thanks
[#include <16F877A.h>
#include <DEFS_16F877A.h>
#fuses NOWDT,PUT,HS,NOPROTECT,NOLVP
#use delay(clock=10000000)
#use fast_io(b)


#define tocdo0 0 //toc do bang 0
#define td_macdinh 80 //toc do mac dinh
#define tocdo1 124 //1/5 toc do cuc dai
#define tocdo2 248 //2/5 toc do cuc dai
#define tocdo3 372 //3/5 toc do cuc dai
#define tocdo4 496 //4/5 toc do cuc dai
#define tocdo5 620 //toc do cuc dai

int16 duty1=0;
int16 duty2=0;
int8 bientocdo=0;
int1 bienthuan=0;
int1 biennghich=0;

void main() //bo PMW1 dk dco quay thuan
{ //bo PMW2 dk dco quay nghich
set_tris_b(0x0ff); //khoi tao port B la port nhap
setup_ccp1(CCP_PWM); //khoi tao bo PWM1
setup_ccp2(CCP_PWM); //khoi tao bo PWM2

setup_timer_2(T2_div_by_16,154,1); //tao chu ky xung 1ms
//(1/clock)*4*t2div*(period+1)
//(1/10e6)*4*16*(154+1)=1e-3=1ms

set_pwm1_duty(duty1); //gia tri duty cua PWM duoc tinh
set_pwm2_duty(duty2); //theo cong thuc duty1*t2div/clock
//khoi tao duty=0 ->tat dong co

while(true)
{


if (!bit_test(portb,1)) //neu nhan phim FO : chay thuan
{
duty1=tocdo0;
duty2=tocdo0;
set_pwm1_duty(duty1); //cho duty cua 2 bo PMW=0 de
set_pwm2_duty(duty2); //tat dong co
delay_ms(1000); //delay 1s de giam quan tinh dc
bienthuan=1;
biennghich=0;
goto next;
}


if (!bit_test(portb,2)) //neu nhan phim RE : chay nghich
{
duty1=tocdo0;
duty2=tocdo0;
set_pwm1_duty(duty1); //cho duty cua 2 bo PMW=0 de
set_pwm2_duty(duty2); //tat dong co
delay_ms(1000); //delay 1s de giam quan tinh dc
bienthuan=0;
biennghich=1;
goto next;
}


if (!bit_test(portb,3)) //nhan phim toc do 1
{
bientocdo=1;
goto next;
}

if (!bit_test(portb,4)) //nhan phim toc do 2
{
bientocdo=2;
goto next;
}

if (!bit_test(portb,5)) //nhan phim toc do 3
{
bientocdo=3;
goto next;
}

if (!bit_test(portb,6)) //nhan phim toc do 4
{
bientocdo=4;
goto next;
}

if (!bit_test(portb,7)) //nhan phim toc do 5
bientocdo=5;

next:
if (!bit_test(portb,0)) //neu nhan phim OFF
{
duty1=tocdo0;
duty2=tocdo0;
set_pwm1_duty(duty1); //cho duty cua 2 bo PMW=0 de
set_pwm2_duty(duty2); //tat dong co
bienthuan=0;
biennghich=0;
bientocdo=0; //xoa bien toc do
}

if (bienthuan)
{
duty2 = tocdo0;
switch (bientocdo)
{
case 1: duty1= tocdo1;
break;
case 2: duty1= tocdo2;
break;
case 3: duty1= tocdo3;
break;
case 4: duty1= tocdo4;
break;
case 5: duty1= tocdo5;
break;
default : duty1 = td_macdinh;
break;
}
set_pwm1_duty(duty1); //cho dco chay thuan
set_pwm2_duty(duty2);
}

if (biennghich)
{
duty1 = tocdo0;
switch (bientocdo)
{
case 1: duty2= tocdo1;
break;
case 2: duty2= tocdo2;
break;
case 3: duty2= tocdo3;
break;
case 4: duty2= tocdo4;
break;
case 5: duty2= tocdo5;
break;
default : duty2 = td_macdinh;
break;
}
set_pwm1_duty(duty1); //cho dco chay nghich
set_pwm2_duty(duty2);
}
}
}]


Múi giờ GMT. Hiện tại là 10:49 PM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam