PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > Cơ bản về vi điều khiển và PIC

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

Cơ bản về vi điều khiển và PIC Những bài hướng dẫn cơ bản nhất để làm quen với vi điều khiển PIC

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 07-07-2009, 04:51 PM   #31
Mr.Bi
Đệ tử 7 túi
 
Tham gia ngày: Jul 2007
Nơi Cư Ngụ: Đà Nẵng
Bài gửi: 188
:
thêm vào dòng #byte PORTB=0x06
Mr.Bi vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 07-07-2009, 05:38 PM   #32
vagabondtt1503
Đệ tử 2 túi
 
Tham gia ngày: Dec 2008
Bài gửi: 33
:
Trích:
Nguyên văn bởi namqn View Post
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
vagabondtt1503 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 07-07-2009, 09:56 PM   #33
nhamdtk4
Đệ tử 3 túi
 
nhamdtk4's Avatar
 
Tham gia ngày: Feb 2009
Bài gửi: 47
:
Trích:
Nguyên văn bởi hoangtanduong13 View Post
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).
nhamdtk4 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 09-07-2009, 11:33 PM   #34
xuanhiendk2
Đệ tử 3 túi
 
Tham gia ngày: Jan 2009
Bài gửi: 52
:
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!

thay đổi nội dung bởi: xuanhiendk2, 10-07-2009 lúc 09:31 PM.
xuanhiendk2 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 10-07-2009, 04:29 AM   #35
vagabondtt1503
Đệ tử 2 túi
 
Tham gia ngày: Dec 2008
Bài gửi: 33
:
Trích:
Nguyên văn bởi xuanhiendk2 View Post
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 View Post
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,
vagabondtt1503 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 10-07-2009, 09:35 PM   #36
xuanhiendk2
Đệ tử 3 túi
 
Tham gia ngày: Jan 2009
Bài gửi: 52
:
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 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 12-07-2009, 12:15 PM   #37
xuanhiendk2
Đệ tử 3 túi
 
Tham gia ngày: Jan 2009
Bài gửi: 52
:
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.
xuanhiendk2 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 12-07-2009, 05:57 PM   #38
dung h
Đệ tử 4 túi
 
Tham gia ngày: May 2009
Bài gửi: 74
:
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);
}
}
}]
dung h vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


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


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam