PDA

View Full Version : hỏi cách tính cycle time và duty!


lequocbao
28-05-2009, 01:50 PM
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?

lequocbao
30-05-2009, 11:59 AM
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?

namqn
30-05-2009, 02:27 PM
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,

lequocbao
30-05-2009, 04:31 PM
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.

namqn
30-05-2009, 05:20 PM
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,

lequocbao
01-06-2009, 07:13 PM
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?

namqn
01-06-2009, 08:26 PM
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?
Bạn xem lại định nghĩa của duty cycle. Bạn dùng tần số dao động cao hơn thì tần số điều chế tín hiệu sẽ cao hơn (giả sử vẫn dùng cùng giá trị nạp vào Timer 2). Duty cycle là một đại lượng tương đối, do đó không phụ thuộc vào tần số điều chế.

Thân,

lequocbao
03-06-2009, 07:11 PM
Vậy anh Namqn có thể cho e hỏi là băm xung ở tần số thấp và cao thì cái nào chính xác hơn?
chứ em băm xung ở tần số 1.2kHz nhưng sao không chính xác anh Namqn ơi?tỉ lệ tính ra không như mình tính toán.

namqn
04-06-2009, 01:30 PM
Vậy anh Namqn có thể cho e hỏi là băm xung ở tần số thấp và cao thì cái nào chính xác hơn?
chứ em băm xung ở tần số 1.2kHz nhưng sao không chính xác anh Namqn ơi?tỉ lệ tính ra không như mình tính toán.
Với cùng một tần số thực thi lệnh, nếu bạn dùng tần số thấp hơn thì sẽ có độ phân giải cho duty cycle cao hơn, do đó bạn có thể mô tả các duty cycle một cách chính xác hơn.

Bạn kiểm tra xung kết quả như thế nào mà nói rằng nó không chính xác? Liệu có phải do mạch động lực của bạn có vấn đề không? Nếu bạn là sinh viên khoa Điện, ĐHBK HCM thì có thể gặp trực tiếp tôi (tôi đã về VN, và đang giảng dạy tại khoa Điện, ĐHBK HCM).

Thân,

lequocbao
04-06-2009, 05:48 PM
Với cùng một tần số thực thi lệnh, nếu bạn dùng tần số thấp hơn thì sẽ có độ phân giải cho duty cycle cao hơn, do đó bạn có thể mô tả các duty cycle một cách chính xác hơn.

Bạn kiểm tra xung kết quả như thế nào mà nói rằng nó không chính xác? Liệu có phải do mạch động lực của bạn có vấn đề không? Nếu bạn là sinh viên khoa Điện, ĐHBK HCM thì có thể gặp trực tiếp tôi (tôi đã về VN, và đang giảng dạy tại khoa Điện, ĐHBK HCM).

Thân,
Thì em đo tốc độ từ encoder phản hồi về (tính ra tốc độ vòng / phút).tốc độ dc luôn cao hơn giá trị mình tính toán.
mạch động lực em dùng 02 IRF9540 và 02 IRF540 tạo thành cầu H,cách ly wa 4 opto521 .khi kích thì 02 opto được mắc nối tiếp nên sẽ dẫn cùng lúc cho động cơ quay(em không dùng các ic lái, chỉ dùng các C1815 để kích đóng /mở thui).Em có tham khảo ý kiến của thầy HV Kiểm thì thầy nói cái mạch đó hơi "cùi bắp" nên chắc có lẽ sai số nằm ở phần mạch động lực.
Để em post cái sơ đồ mạch lên anh xem giúp(à mà mình mún post hình lên thì làm như thế nào vậy anh?)

anh Namqn ở khoa Điện hả, khi nào "bí rợ hết đường" chắc chắn em sẽ cầu cứu !!!!!!

lequocbao
06-06-2009, 04:17 PM
mạch cầu H:

lequocbao
09-06-2009, 07:15 PM
cho e xin chút í kiến đi anh Namqn!

namqn
09-06-2009, 08:09 PM
cho e xin chút í kiến đi anh Namqn!
Ý kiến là mạch nguyên lý của bạn mờ quá. Nếu các giá trị linh kiện đúng như trong mạch thực của bạn thì thời gian nạp/xả các tụ ngõ vào của MOSFET sẽ đáng kể so với chu kỳ bằng khoảng vài mươi us mà bạn đang định sử dụng. Cũng chú ý là các optocoupler TLP521 (vỏ nhựa màu trắng) có thời gian trì hoãn cỡ vài us!

Thân,

lequocbao
10-06-2009, 07:13 PM
Ý kiến là mạch nguyên lý của bạn mờ quá. Nếu các giá trị linh kiện đúng như trong mạch thực của bạn thì thời gian nạp/xả các tụ ngõ vào của MOSFET sẽ đáng kể so với chu kỳ bằng khoảng vài mươi us mà bạn đang định sử dụng. Cũng chú ý là các optocoupler TLP521 (vỏ nhựa màu trắng) có thời gian trì hoãn cỡ vài us!

Thân,
í tần số băm xung là 1.2kHz (833us)lận mà anh?thì trể vài us chắc là không " ci nhê" đúng không anh?
sẳn anh cho e hỏi thêm 01 vấn đề mới phát sinh thêm nữa là:
Hiện e đang băm xung ở 2.4khZ --> trị nạp cho timer2 là 127. Vì băm xung ở 1.2kHz (trị nạp cho timer2 là 255) mừ speed là int8 dể bị tràn phải không anh?
- biến speed nạp cho set_pwm1_duty(speed); là int8.
- nhưng tốc độ phản hồi về là rpm là int16.
vấn đề là chương trình của e tính toán sẽ có biểu thức liên quan giữa speed(int8) và rpm(int16) [speed=f(rpm)] tạm gọi là khác kiểu, nên kết quả hình như là bị sai.

e đã thử tách thằng rpm(int16) ra thành 02 giá trị int8 rùi nhưng mà vẫn chưa được anh àh!

mình có cách nào khác để thực hiện phép toán giữa số 8bit và 16bit không anh?

namqn
11-06-2009, 11:22 PM
í tần số băm xung là 1.2kHz (833us)lận mà anh?thì trể vài us chắc là không " ci nhê" đúng không anh?
sẳn anh cho e hỏi thêm 01 vấn đề mới phát sinh thêm nữa là:
Hiện e đang băm xung ở 2.4khZ --> trị nạp cho timer2 là 127. Vì băm xung ở 1.2kHz (trị nạp cho timer2 là 255) mừ speed là int8 dể bị tràn phải không anh?
- biến speed nạp cho set_pwm1_duty(speed); là int8.
- nhưng tốc độ phản hồi về là rpm là int16.
vấn đề là chương trình của e tính toán sẽ có biểu thức liên quan giữa speed(int8) và rpm(int16) [speed=f(rpm)] tạm gọi là khác kiểu, nên kết quả hình như là bị sai.

e đã thử tách thằng rpm(int16) ra thành 02 giá trị int8 rùi nhưng mà vẫn chưa được anh àh!

mình có cách nào khác để thực hiện phép toán giữa số 8bit và 16bit không anh?
Cụ thể là bạn tính speed theo rpm như thế nào? Liệu có làm cho kết quả bị cắt xén do chuyển kiểu dữ liệu hay không?

Bạn muốn thực hiện phép toán cụ thể gì giữa các số 8-bit và 16-bit?

Thân,

lequocbao
12-06-2009, 12:48 PM
Cụ thể là bạn tính speed theo rpm như thế nào? Liệu có làm cho kết quả bị cắt xén do chuyển kiểu dữ liệu hay không?

Bạn muốn thực hiện phép toán cụ thể gì giữa các số 8-bit và 16-bit?

Thân,

Em đã giải quyết được rùi anh ơi !hì hì
nhưng mà em vẫn chưa hiểu là:
động cơ khi 100% tốc độ 1580 vòng /phút (duty=128).nên khi qui đổi từ rpm sang speed thì e thiết lập công thức theo quan hệ:
speed=128*rpm/1580;//tam suất ra thôi chứ không có gì to tát hết
nhưng khi để nguyên công thức như vậy thì thằng ku speed nó chạy toán loạn hết.khi rút gọn lại là:
speed=0.081*rpm;//0.081=128/1580
thì chính xác.
không bít là em đã đọc ở luồng nào đó có khuyên là khi mình đã biết trước các kết quả trong biểu thức thì nên ghi trực tiếp ra lun nên em thử đại.hì hì!!!!

anh Namqn ơi vậy mạch cầu H của em(thực ra là copy của người ta) mún chính xác thì phải làm sao hả anh?

saoxathu
10-05-2010, 11:50 PM
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?

stargreen1001
25-05-2010, 02:48 AM
Em đã giải quyết được rùi anh ơi !hì hì
nhưng mà em vẫn chưa hiểu là:
động cơ khi 100% tốc độ 1580 vòng /phút (duty=128).nên khi qui đổi từ rpm sang speed thì e thiết lập công thức theo quan hệ:
speed=128*rpm/1580;//tam suất ra thôi chứ không có gì to tát hết
nhưng khi để nguyên công thức như vậy thì thằng ku speed nó chạy toán loạn hết.khi rút gọn lại là:
speed=0.081*rpm;//0.081=128/1580
thì chính xác.
không bít là em đã đọc ở luồng nào đó có khuyên là khi mình đã biết trước các kết quả trong biểu thức thì nên ghi trực tiếp ra lun nên em thử đại.hì hì!!!!

anh Namqn ơi vậy mạch cầu H của em(thực ra là copy của người ta) mún chính xác thì phải làm sao hả anh?
vậy là encoder của anh có 128 xung đúng ko ??? và hai encoder được nối vào một cổng or ??? cho em hỏi thời gian lấy mẫu có phải là càng ngắn thì càng chính xác, nhưng phải tránh cho vi xử lý bị tràn (có lẽ là nên lớn hơn một vòng quét)