PIC Vietnam

Go Back   PIC Vietnam > Robotics > Cơ cấu chấp hành (Actuator)

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ơ cấu chấp hành (Actuator) Động cơ DC, AC, động cơ không chổi than, động cơ không cảm biến...

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 28-05-2009, 01:50 PM   #1
lequocbao
Đệ tử 6 túi
 
lequocbao's Avatar
 
Tham gia ngày: Oct 2008
Nơi Cư Ngụ: HCM
Bài gửi: 137
:
hỏi cách tính cycle time và duty!

khi set cpp1 và cpp2 là pwm thì mình cần làm như sau:
setup_ccp1(CCP_PWM);
setup_ccp2(CCP_PWM);
setup_timer_2 (mode, period, postscale);
set_pwm1_duty(value);
set_pwm2_duty(value);

vd:
setup_timer_2(T2_DIV_BY_1,127,1);//cycle time=(1/20000000)*4*1*(127+1)=25.6us.
set_pwm1_duty(value);

cái mình cần hỏi là cái value phải tính như thế nào ?và đơn vị của value là gì?(có phải us không?)và theo như vd trên thì cycle time là 25.05us thì mình nhập value=25.05/2=12.53 là mình có duty là 50% phải không các bạn?
__________________
A&A

thay đổi nội dung bởi: lequocbao, 30-05-2009 lúc 12:00 PM.
lequocbao vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 30-05-2009, 11:59 AM   #2
lequocbao
Đệ tử 6 túi
 
lequocbao's Avatar
 
Tham gia ngày: Oct 2008
Nơi Cư Ngụ: HCM
Bài gửi: 137
:
Unhappy đã tìm được cách tình value nhưng vẫn chưa băm xung được các bác ơi!

khi set cpp1 và cpp2 là pwm thì mình cần làm như sau:
setup_ccp1(CCP_PWM);
setup_ccp2(CCP_PWM);
setup_timer_2 (mode, period, postscale);
set_pwm1_duty(value);
set_pwm2_duty(value);

vd:
setup_timer_2(T2_DIV_BY_1,127,1);//cycle time=(1/20000000)*4*1*(127+1)=25.6us.
khi muốn động cơ chạy với 50% tốc độ thì:
set_pwm1_duty(250);//duty 50%=12.53us=250*1/20000000;


nhưng động cơ vẫn chạy ào ào như lúc kích trực tiếp không hiểu tại sao nữa?
__________________
A&A
lequocbao vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 30-05-2009, 02:27 PM   #3
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Trích:
Nguyên văn bởi lequocbao View Post
khi set cpp1 và cpp2 là pwm thì mình cần làm như sau:
setup_ccp1(CCP_PWM);
setup_ccp2(CCP_PWM);
setup_timer_2 (mode, period, postscale);
set_pwm1_duty(value);
set_pwm2_duty(value);

vd:
setup_timer_2(T2_DIV_BY_1,127,1);//cycle time=(1/20000000)*4*1*(127+1)=25.6us.
khi muốn động cơ chạy với 50% tốc độ thì:
set_pwm1_duty(250);//duty 50%=12.53us=250*1/20000000;


nhưng động cơ vẫn chạy ào ào như lúc kích trực tiếp không hiểu tại sao nữa?
Bạn đọc kỹ lại hướng dẫn của CCS C cho hàm set_pwm1_duty(). Nếu giá trị thiết lập duty cycle là 8-bit (là trường hợp hiện có của bạn), nó sẽ được dịch trái 2 bit để tạo ra giá trị 10-bit. Do đó, giá trị thiết lập bằng 250 sẽ dẫn đến duty cycle = 100 %. Với thiết lập của bạn như trên, duty cycle = 50 % sẽ ứng với giá trị thiết lập là 64.

Thân,
__________________
Biển học mênh mông, sức người có hạn.

Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
http://www.picvietnam.com/forum/showthread.php?t=1263
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 30-05-2009, 04:31 PM   #4
lequocbao
Đệ tử 6 túi
 
lequocbao's Avatar
 
Tham gia ngày: Oct 2008
Nơi Cư Ngụ: HCM
Bài gửi: 137
:
Trích:
Nguyên văn bởi namqn View Post
Bạn đọc kỹ lại hướng dẫn của CCS C cho hàm set_pwm1_duty(). Nếu giá trị thiết lập duty cycle là 8-bit (là trường hợp hiện có của bạn), nó sẽ được dịch trái 2 bit để tạo ra giá trị 10-bit. Do đó, giá trị thiết lập bằng 250 sẽ dẫn đến duty cycle = 100 %. Với thiết lập của bạn như trên, duty cycle = 50 % sẽ ứng với giá trị thiết lập là 64.

Thân,
thì em theo đúng hướng dẫn của CCS đó anh:
// For a 20 mhz clock, 1.2 khz frequency,
// t2DIV set to 16
// the following sets the duty to 50% (or 416 us).
long duty;
duty = 520; // .000416/(16*(1/20000000))
set_pwm1_duty(duty);

con số 240 em tính ở trên là dựa vào cách tính số 520 như hướng dẫn.
hướng dẫn chỉ nói là sẽ thêm 2 bit 0 vào phía lsb chứ không nói rõ là thêm 2 bit 0 vào thì duty phải tính lại như thế nào?
sẳn anh Namqn cho em hỏi lun là phải tính như thế nào để ra được con số 64 vậy anh?loay quay mấy ngày rùi mà vẫn chưa mò ra được.
__________________
A&A
lequocbao vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 30-05-2009, 05:20 PM   #5
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Trích:
Nguyên văn bởi lequocbao View Post
thì em theo đúng hướng dẫn của CCS đó anh:
// For a 20 mhz clock, 1.2 khz frequency,
// t2DIV set to 16
// the following sets the duty to 50% (or 416 us).
long duty;
duty = 520; // .000416/(16*(1/20000000))
set_pwm1_duty(duty);

con số 240 em tính ở trên là dựa vào cách tính số 520 như hướng dẫn.
hướng dẫn chỉ nói là sẽ thêm 2 bit 0 vào phía lsb chứ không nói rõ là thêm 2 bit 0 vào thì duty phải tính lại như thế nào?
sẳn anh Namqn cho em hỏi lun là phải tính như thế nào để ra được con số 64 vậy anh?loay quay mấy ngày rùi mà vẫn chưa mò ra được.
Đây là một cái bẫy của CCS C mà ít ai để ý.

Nếu bạn khai báo một biến để chứa duty cycle, trình biên dịch sẽ theo kiểu dữ liệu của biến mà xác định giá trị duty cycle là 8-bit hay 16-bit. Nhưng nếu bạn chỉ đưa một giá trị hằng 250 thì trình biên dịch sẽ tự hiểu là giá trị 8-bit (trong khi có thể bạn đang muốn mô tả một giá trị 16-bit). Chú ý là nếu bạn đưa giá trị hằng 520 vào thì trình biên dịch vẫn hiểu rằng đó là một giá trị 16-bit, vì 520 không thể chứa trong 8-bit.

Còn cách tính ra số 64 thì rất đơn giản. Nếu giá trị duty cycle là 8-bit, giá trị ứng với duty cycle = 100 % sẽ bằng giá trị thiết lập của timer cộng với 1 (127 + 1 = 128 trong ví dụ ở post #2 của bạn). Do đó duty cycle = 50 % sẽ ứng với giá trị thiết lập = 128/2 = 64.

Thêm 2 bit '0' vào LSB của duty cycle có nghĩa là giá trị mà bạn mô tả cho duty cycle sẽ được dịch trái 2 vị trí, do đó nó (giá trị mà bạn mô tả) sẽ được so sánh với thanh ghi TMR2, chứ không còn so sánh với tổ hợp thanh ghi TMR2 và 2 Q-bit. Nói cách khác, độ phân giải duty cycle mà bạn có thể dùng sẽ bằng với độ phân giải của tần số, chứ không còn là 4 lần của độ phân giải đó như bình thường.

Thân,
__________________
Biển học mênh mông, sức người có hạn.

Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
http://www.picvietnam.com/forum/showthread.php?t=1263

thay đổi nội dung bởi: namqn, 30-05-2009 lúc 05:25 PM.
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 01-06-2009, 07:13 PM   #6
lequocbao
Đệ tử 6 túi
 
lequocbao's Avatar
 
Tham gia ngày: Oct 2008
Nơi Cư Ngụ: HCM
Bài gửi: 137
:
Trích:
Nguyên văn bởi namqn View Post

Còn cách tính ra số 64 thì rất đơn giản. Nếu giá trị duty cycle là 8-bit, giá trị ứng với duty cycle = 100 % sẽ bằng giá trị thiết lập của timer cộng với 1 (127 + 1 = 128 trong ví dụ ở post #2 của bạn). Do đó duty cycle = 50 % sẽ ứng với giá trị thiết lập = 128/2 = 64.

Thêm 2 bit '0' vào LSB của duty cycle có nghĩa là giá trị mà bạn mô tả cho duty cycle sẽ được dịch trái 2 vị trí, do đó nó (giá trị mà bạn mô tả) sẽ được so sánh với thanh ghi TMR2, chứ không còn so sánh với tổ hợp thanh ghi TMR2 và 2 Q-bit. Nói cách khác, độ phân giải duty cycle mà bạn có thể dùng sẽ bằng với độ phân giải của tần số, chứ không còn là 4 lần của độ phân giải đó như bình thường.

Thân,
anh Namqn có thể chỉ rõ hơn cách tính duty cycle, chứ theo như anh chỉ thì duty cycle chỉ phụ thuộc vào giá trị nạp vào timer2 chứ không xem xét đến tần số băm xung và thạch anh ngoài.Có công thức tổng quát nào không anh?
__________________
A&A
lequocbao vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 10-05-2010, 11:50 PM   #7
saoxathu
Đệ tử 1 túi
 
Tham gia ngày: Aug 2007
Bài gửi: 15
:
Có ai biết thời điểm nào có thể set lại giá trị này không, nếu theo lý thuyết thì phải hết chu kì mới được phép xét lại. Nhưng không hiểu xác định thời điểm đó thế nào?
saoxathu 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à 10:16 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