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)

gong05sk 18-07-2008 11:02 PM

Vấn đề PWM của PIC 18F4331
 
Quả thật em đã đọc rất nhiều những bào hướng dẫn của các bác về PWM nhưng một điều rút ra là: không biết thế nào cả!
Em không biết vì sao:
Một người mới tiếp xúc như em chưa nắm được những thứ mà các bác thảo luận. Giống như kiểu đàn gảy tai trâu ấy. EM có cảm tưởng các bác nói cho những người đã biết. nói qua nói lại cho vui còn những người mới vào ngồi ngó lơ như vịt nghe sấm chả hiểu đang nói cái gì. Lục datasheet ra căng mắt mà đọc thấy toàn những thanh ghi và cấu trúc. cũng có vẻ hơi hiêu hiểu. lôi mấy bài các bác viết ra lại mù tịt. hic hic.
Có bác nào rộng lượng làm ơn viết cụ thể một chút đc không? Cụ thể như vầy nè:
- Thanh ghi nào trong PIC đảm nhận việc điều khiển chế độ PWM
- Phải thiết lập giá trị cho chúng như thế nào để có các chế độ PWM tương ứng và mỗi chế độ như vậy có công dụng gì.
- Cuối cùng là viết chương trình như thế nào. Em dùng CSS, nó có một lô thư viện. tìm nát nước cũng không thấy mấy cái định nghĩa của mấy bác. kiểu như
Trích:

setup_power_pwm_pins(PWM_OFF,PWM_OFF, PWM_OFF,PWM_OFF);
Em thực mơ hồ với những bài hướng dẫn như vậy.
Có ai có thể chỉ em bắt đầu như thế nào không vậy.

namqn 18-07-2008 11:25 PM

Trích:

Nguyên văn bởi gong05sk (Post 17513)
Quả thật em đã đọc rất nhiều những bào hướng dẫn của các bác về PWM nhưng một điều rút ra là: không biết thế nào cả!
Em không biết vì sao:
Một người mới tiếp xúc như em chưa nắm được những thứ mà các bác thảo luận. Giống như kiểu đàn gảy tai trâu ấy. EM có cảm tưởng các bác nói cho những người đã biết. nói qua nói lại cho vui còn những người mới vào ngồi ngó lơ như vịt nghe sấm chả hiểu đang nói cái gì. Lục datasheet ra căng mắt mà đọc thấy toàn những thanh ghi và cấu trúc. cũng có vẻ hơi hiêu hiểu. lôi mấy bài các bác viết ra lại mù tịt. hic hic.
Có bác nào rộng lượng làm ơn viết cụ thể một chút đc không? Cụ thể như vầy nè:
- Thanh ghi nào trong PIC đảm nhận việc điều khiển chế độ PWM
- Phải thiết lập giá trị cho chúng như thế nào để có các chế độ PWM tương ứng và mỗi chế độ như vậy có công dụng gì.
- Cuối cùng là viết chương trình như thế nào. Em dùng CSS, nó có một lô thư viện. tìm nát nước cũng không thấy mấy cái định nghĩa của mấy bác. kiểu như
Em thực mơ hồ với những bài hướng dẫn như vậy.
Có ai có thể chỉ em bắt đầu như thế nào không vậy.

Vì những vấn đề như bạn đang gặp phải, tôi đã khuyến khích việc tránh các hàm thư viện của các trình biên dịch. Không phải tôi không tin tưởng các hàm thư viện, mà tôi tin rằng các hàm thư viện sẽ khiến các bạn ngày càng mù mờ về những gì đang diễn ra bên trong PIC.

Bạn hãy đọc datasheet, quên các hàm thư viện của CCS C đi, tự đặt giá trị cho các thanh ghi của module PCPWM của PIC để tạo tín hiệu PWM, và tìm hiểu kết quả bằng mô phỏng, thực nghiệm. Khi bạn đã nắm được cách dùng module rồi thì mới nên dùng các hàm thư viện.

Thân,

gong05sk 18-07-2008 11:48 PM

Em cũng đã đọc rất nhiều bài viết của bác. Nhưng quả thật em gặp khó khăn trong 2 việc.
Thứ nhất là tiếng anh. Việc dịch datasheet gặp nhiều trắc trở. Có khi còn hiểu nhầm nghĩa.
Thứ 2 là cấu trúc lệnh ASM cho pic quá rắc rối và em không có tài liệu hướng dẫn. Em đến với PIC nhờ một thằng bạn nó làm rồi nó chỉ lại. Nhưng giờ nó về quê mất rồi nên chẳng biết hỏi ai. mà nó toàn chỉ bằng C. Chính bant thân nó cũng chỉ biết ứng dụng thư viện chứ giải thích nguyên lý thì nó cũng ậm àh ậm ờ.
Vậy giờ anh làm ơn chỉ lại cho em đc không. Viết một chương trình băm xung đơn giản nhưng đầy đủ cho em tham khảo đc không? về các thanh ghi em có thể tự tìm hiểu nhưng về cấu trúc lệnh em chịu anh có chỉ hãy viết thật cụ thể. chỉ cần vài bài cụ thể thì em có thể nắm đc phần nào rồi.

Macintosh 19-07-2008 12:05 AM

to anh Nam,
em nghĩ thế mạnh của một trình dịch thể hiện ở chỗ nó có hỗ trợ cho người dùng nhiều hay không.CCS hỗ trợ rất nhiều,em không phủ nhận là phải hiểu gốc gác vấn đề,datasheet tất nhiên phải đọc.Nhưng em thiết nghĩ ,cái gì đã hỗ trợ sao lại không dùng,thời gian để nghiên cứu thứ khác .
chẳng hạn,trong thiết lập PWM,nếu phải set các bit trong các thanh ghi Config PWM,eo ui,sẽ thật khó hiểu,cho bản thân,và cả cho người khác khi đọc chương trình,trong khi trong Help của CCS có hẳn các Built in Funtion, các lệnh C thật dễ hiểu để thiết lập,dễ chỉnh sửa chương trình sau này.

namqn 19-07-2008 12:20 AM

Trích:

Nguyên văn bởi Macintosh (Post 17517)
to anh Nam,
em nghĩ thế mạnh của một trình dịch thể hiện ở chỗ nó có hỗ trợ cho người dùng nhiều hay không.CCS hỗ trợ rất nhiều,em không phủ nhận là phải hiểu gốc gác vấn đề,datasheet tất nhiên phải đọc.Nhưng em thiết nghĩ ,cái gì đã hỗ trợ sao lại không dùng,thời gian để nghiên cứu thứ khác .
chẳng hạn,trong thiết lập PWM,nếu phải set các bit trong các thanh ghi Config PWM,eo ui,sẽ thật khó hiểu,cho bản thân,và cả cho người khác khi đọc chương trình,trong khi trong Help của CCS có hẳn các Built in Funtion, các lệnh C thật dễ hiểu để thiết lập,dễ chỉnh sửa chương trình sau này.

Tùy vào thói quen học tập của mỗi người thôi. Nếu ai đó muốn tìm hiểu tường tận các module ngoại vi, các hàm thư viện sẽ là một rào cản (tâm lý) đối với người đó. Với những người không thích tìm hiểu sâu về những gì xảy ra bên trong PIC, họ có thể dùng những gì trình biên dịch đã cung cấp. Tất nhiên chấp nhận những hay dở của các tài nguyên có sẵn đó.

Quan niệm của tôi về thế mạnh của trình biên dịch lại khác: khả năng biên dịch hiệu quả, và khả năng khai thác tài nguyên giới hạn của chip.

Bạn không thích thiết lập các thanh ghi cho module PCPWM thì cứ dùng các hàm thư viện đã có sẵn, còn tôi thích làm việc đó, và không loại trừ khả năng có một số bạn khác cũng thích.

Nói như bạn thì có lẽ bạn gong05sk nên đọc lại tài liệu hướng dẫn của CCS C, vì có vẻ như bạn ấy chưa hiểu được những hàm thư viện dễ hiểu đó.

Thân,

gong05sk 19-07-2008 12:28 AM

Vâng, cảm ơn 2 bác. Em đã trình bày rõ quan điểm cuả mình rồi mà. em muốn học một cách căn bản cơ. ASM tuy khó và rắc rối nhưng chắc rồi sẽ quen. giống cái thời tập tành 8051 thôi. Về thanh ghi cũng có nắm bắt đôi chút nhưng gần 18 trang nói về PWM trong sách lại toàn tiếng anh. không có đoạn demo nào để có thể nắm bắt đc.
EM chỉ hi vọng các bác có thể hướng dẫn em một chút. EM thiết nghĩ việc viết lại một chút kiến thức cơ bản đâu có gì là khó lắm đối với các bác. chỉ tốn chút thời gian thôi mà.
Một chương trình viết sẵn thì em nghĩ các bác có cả đống sao không copy lấy một cái đơn giản rồi đưa lên làm ví dụ. để em dựa vàp đó mà chỗ nào không hiểu thì hỏi tiếp. Như thế vừa nhanh gọn vừa đỡ mắc công hỏi đi hỏi lại rồi chẳng đc gì cả.
Thôi thế này nhé. EM ví dụ cái mạch sau đây:
- Tần số thạch anh sử dụng là 4MHz.
- Tạm thời không quan tâm tới dòng áp hay các thông số khác. chỉ để tâm tới nguyên lý mà thôi. ânh viết hộ em một chương trình băm xung mẫu để em học tập đc chứ?
http://i332.photobucket.com/albums/m.../gt_dongco.jpg

Macintosh 19-07-2008 12:42 AM

Trích:

Nguyên văn bởi gong05sk (Post 17513)
Quả thật em đã đọc rất nhiều những bào hướng dẫn của các bác về PWM nhưng một điều rút ra là: không biết thế nào cả!
Em không biết vì sao:
Một người mới tiếp xúc như em chưa nắm được những thứ mà các bác thảo luận. Giống như kiểu đàn gảy tai trâu ấy. EM có cảm tưởng các bác nói cho những người đã biết. nói qua nói lại cho vui còn những người mới vào ngồi ngó lơ như vịt nghe sấm chả hiểu đang nói cái gì. Lục datasheet ra căng mắt mà đọc thấy toàn những thanh ghi và cấu trúc. cũng có vẻ hơi hiêu hiểu. lôi mấy bài các bác viết ra lại mù tịt. hic hic.
Có bác nào rộng lượng làm ơn viết cụ thể một chút đc không? Cụ thể như vầy nè:
- Thanh ghi nào trong PIC đảm nhận việc điều khiển chế độ PWM
- Phải thiết lập giá trị cho chúng như thế nào để có các chế độ PWM tương ứng và mỗi chế độ như vậy có công dụng gì.
- Cuối cùng là viết chương trình như thế nào. Em dùng CSS, nó có một lô thư viện. tìm nát nước cũng không thấy mấy cái định nghĩa của mấy bác. kiểu như
Em thực mơ hồ với những bài hướng dẫn như vậy.
Có ai có thể chỉ em bắt đầu như thế nào không vậy.

cái dòng lệnh bác trích đó thực ra có nằm trong Thư viện đâu. Cái wan trọng nhất khi dùng CCS là thường xuyên bấm F1,bấm thử rùi biết!
Tui cũng "bầm dập" với con 4331 rùi nên tui cũng hiểu cái khó của bác bây giờ!
xin trình bày với các bác qui trình làm việc với PWM 18f4331/4431 hồi trước của tui :
- PWM là gì,cái này bác biết rùi nhẩy?
- Giở datasheet 4331 ra,thấy có 8pin power PWM,mừng hớn hở,à phen này là điều được 8 DC motor rùi đây!!!???
- lại còn 2 khối CCP(CAPTURE/COMPARE/PWM) nữa,lại 2 kênh điều xung khác,chẳng lẽ điều được 10 motor????
- Đọc kỹ datasheet lại,tại sao lại là power PWM và PWM trong CCP, có khác biệt gì không?
Thực ra Power PWM chính là điểm khác biệt giữa dòng 18FXX31 so với các Pic 18 khác.Nó là thứ mà những ai cần 1 công cụ mạnh trong điều khiển động cơ DC.
quay lại với vấn đề về 8 pin PWM (PWM0-PWM 7).Đúng là mừng hụt thật, đó là 8 chân output PWM của 4 module PWM .nghĩa là sao,nghĩa là các bác chỉ có thể điều khiên PWM 4 DC motor với 4 module này.thế tại sao lại là 8 chân PWM,đó là nó có thể thiết lập để điều khiển cầu H.Tớ thì lại không dùng cầu H,không lẽ lại bỏ phí 1 chân còn lại của 1 module à?
còn cái CCP PWM,đúng là có thể dùng để đk thêm 2 dc nữa,tổng cộng là có thể đk 6 dc trên PIC 4331.
- Giở CCS,mở help ra,vào built in funtions: CAPTURE/COMPARE/PWM có ngay
SET_POWER_PWM_OVERRIDE( )
SETUP_CCP2( )

SET_POWER_PWMX_DUTY( )
SETUP_CCP3( )

SET_PWM1_DUTY( )
SETUP_CCP4( )

SET_PWM2_DUTY( )
SETUP_CCP5( )

SET_PWM3_DUTY( )
SETUP_CCP6( )

SET_PWM4_DUTY( )
SETUP_POWER_PWM( )

SET_PWM5_DUTY( )
SETUP_POWER_PWM_PINS( )

SETUP_CCP1( )

- cái cần wan tâm chính là SETUP_POWER_PWM_PINS( ) ;SETUP_POWER_PWM( );SET_POWER_PWMX_DUTY( ) để làm việc với Power PWM.

Có vẻ gần được rùi đấy,mày mò xí nữa!!! bác phải làm rùi tớ mới hd tiếp được!

Macintosh 19-07-2008 12:54 AM

gong05sk.
Proteus không thích hợp để mô phỏng đk động cơ,bắt tay vào làm phần cứng đi.Driver fet nối với 1 trog các chân pwm 1,3,5,7 hoặc 2 khối ccp1,ccp2.
đòi hỏi một chương trình điều xung tự viết thì đâu cần dùng tới 4331 làm gì,chẳng qua là gọi một chức năng đã tích hợp sẵn trong chip ra mà dùng thui.

namqn 19-07-2008 01:11 AM

Trích:

Nguyên văn bởi Macintosh (Post 17522)
gong05sk.
Proteus không thích hợp để mô phỏng đk động cơ,bắt tay vào làm phần cứng đi.Driver fet nối với 1 trog các chân pwm 1,3,5,7 hoặc 2 khối ccp1,ccp2.
đòi hỏi một chương trình điều xung tự viết thì đâu cần dùng tới 4331 làm gì,chẳng qua là gọi một chức năng đã tích hợp sẵn trong chip ra mà dùng thui.

Thêm nữa, hạn dòng cho động cơ bằng điện trở 10 k thì không động cơ nào chạy được đâu. Để an toàn cho nguồn thì chỉ cần dùng điện trở đủ nhỏ để giới hạn dòng không quá khả năng của nguồn thôi. Ví dụ, nguồn có thể cấp 1 A ở 5 V thì dùng điện trở 4.7 ohm, công suất vài W nhé (công suất từ 5 W trở lên thì để thoải mái, còn nhỏ hơn thì phải nhanh tay ngắt nguồn khi có sự cố).

Thân,

gong05sk 19-07-2008 01:48 AM

Chài ai. đã bảo là bỏ qua mấy thông số đi mà. Thoáng một chút đi. do vẽ vội quá nên nó mới nhầm tai hại thế. Thông cảm tý đi. Em đã sửa cái hình lại cho đúng rồi đó.
Giờ quay lại vấn đề chính. Cám ơn bác Macintosh đã chỉ. em thấy mấy cái hàm mà bác nói. nhưng chẳng biết để làm gì cả. Nhưng em nghĩ thế này bác xem có đúng không?
Như vậy bên cạnh thư viện của 4331 chúng ta tạo thêm các chương trình con để sử dụng. và trong trường hợp này thì em phải viết chương trình con PWM phải không?
Nhưng vấn đề của em ở đây là quá gà để viết đc cái chương trình con đó. Bác có thể viết hộ không chỉ một ví dụ nhỏ thôi. đơn giản nhất có thể thôi. ^^! please.
---
Ngồi đọc một hồi cũng ngộ ra đc chút chút về cái Setup_ccp.
Phát biểu lên mấy anh xem sai chỗ nào chỉnh hộ với nhé.

setup_ccp1 (mode) -- đặt chế độ time cho module 0 mà cụ thể là chân RB0 và RB1
setup_ccp2 (mode) -- đặt chế độ time cho module 1 mà cụ thể là chân RB2 và RB3
setup_ccp3 (mode) -- đặt chế độ time cho module 2 mà cụ thể là chân RB4 và RB5
setup_ccp4 (mode) -- đặt chế độ time cho module 3 mà cụ thể là chân RB6 va RB7
setup_ccp5 (mode) -- đặt chế độ time cho module 4 mà cụ thể là chân LFTA (RC1)
setup_ccp6 (mode) -- đặt chế độ time cho module 5 mà cụ thể là chân LFTB (RC2)

Các chế độ mode có thể là:
CCP_OFF -- tắt chế độ ccp

CCP_CAPTURE_FE -- cái này không biết
CCP_CAPTURE_RE -- cái này cũng không nốt
CCP_CAPTURE_DIV_4 -- chế độ time = xung clock/4 việc này tương ứng với việc set 2 bit DTPS1 và DTPS0 mức 01 có phải không ạ.
CCP_CAPTURE_DIV_16 -- chế độ time = xung clock/16 việc này tương ứng với việc set 2 bit DTPS1 và DTPS0 mức 11.

CCP_COMPARE_SET_ON_MATCH -- cái này thiết lập mức tích cực ngõ ra là mức 1
CCP_COMPARE_CLR_ON_MATCH -- món này thiết lập mức tích cực ngõ ra là mức 0
CCP_COMPARE_INT --> hẻm biết là giống gì.
CCP_COMPARE_RESET_TIMER --> reset time làm gì cũng không biết nốt.

CCP_PWM -- cho phép chế độ PWM.
------
Như vậy sau khi tìm hiểu, với sơ đồ mạch như em vẽ thì rõ ràng muốn đưa tín hiệu băm xung ra chân RB0 thì phải cho phép PWM tại CCP1. Nhưng vấn đề nảy sinh là cái chế độ time = clock/4 cũng khai báo trong đó. vậy chẳng nhẽ viết 2 câu lệnh như nhau mà giá trị mode khác nhau àh?
Trích:

setup_ccp1(CCP_CAPTURE_DIV_4);
setup_ccp1(ccp_pwm);

Macintosh 19-07-2008 11:48 AM

có vẻ bác đang định dùng PWM của CCP module,thế thì để tui nói về cái này trước:
một đoạn code do tui set nhe:

void pwm_ccp()
{
setup_ccp1(CCP_PWM); // xuất PWM ra chân RC2
setup_ccp2(CCP_PWM); // xuất PWM ra chân RC1
setup_timer_2(T2_DIV_BY_1, 115, 1); // cal đi,trong datasheet phần CCP có cong thức
//đó :115 là giá trị nạp vào timer2---> quyết
//định tần số PWM

}

có một điều,xung xuất ra tích cực mức 1,nghĩa là mức duty max sẽ cho ra mức high luôn.
=>
set_pwm2_duty(duty2); // xuất PWM, duty là biến
set_pwm1_duty(duty1);

chú ý,duty có giới hạn,đến khi duty max thì dù có tăng nữa thì chân output cũng luôn ở mức cao!

Macintosh 19-07-2008 11:51 AM

setup_ccp1 (mode) -- đặt chế độ time cho module 0 mà cụ thể là chân RB0 và RB1
setup_ccp2 (mode) -- đặt chế độ time cho module 1 mà cụ thể là chân RB2 và RB3
setup_ccp3 (mode) -- đặt chế độ time cho module 2 mà cụ thể là chân RB4 và RB5
setup_ccp4 (mode) -- đặt chế độ time cho module 3 mà cụ thể là chân RB6 va RB7
setup_ccp5 (mode) -- đặt chế độ time cho module 4 mà cụ thể là chân LFTA (RC1)
setup_ccp6 (mode) -- đặt chế độ time cho module 5 mà cụ thể là chân LFTB (RC2)

//
sai ,pic 18fxx31 chỉ có 2 module CCP1,CCP2 .tui đã set bên trên rùi.

Macintosh 19-07-2008 11:57 AM

còn về chức năng Power PWM,tui đã config rùi,xem tại đây:
http://picvietnam.com/forum/showthre...ghlight=config

namqn 19-07-2008 08:19 PM

Trích:

Nguyên văn bởi gong05sk (Post 17516)
Em cũng đã đọc rất nhiều bài viết của bác. Nhưng quả thật em gặp khó khăn trong 2 việc.
Thứ nhất là tiếng anh. Việc dịch datasheet gặp nhiều trắc trở. Có khi còn hiểu nhầm nghĩa.
Thứ 2 là cấu trúc lệnh ASM cho pic quá rắc rối và em không có tài liệu hướng dẫn. Em đến với PIC nhờ một thằng bạn nó làm rồi nó chỉ lại. Nhưng giờ nó về quê mất rồi nên chẳng biết hỏi ai. mà nó toàn chỉ bằng C. Chính bant thân nó cũng chỉ biết ứng dụng thư viện chứ giải thích nguyên lý thì nó cũng ậm àh ậm ờ.
Vậy giờ anh làm ơn chỉ lại cho em đc không. Viết một chương trình băm xung đơn giản nhưng đầy đủ cho em tham khảo đc không? về các thanh ghi em có thể tự tìm hiểu nhưng về cấu trúc lệnh em chịu anh có chỉ hãy viết thật cụ thể. chỉ cần vài bài cụ thể thì em có thể nắm đc phần nào rồi.

Bạn tham khảo bài viết sau, nếu muốn tìm hiểu kỹ hơn về hoạt động của các module liên quan đến PWM:
http://www.picvietnam.com/forum/showthread.php?t=2623

Thân,

gong05sk 21-07-2008 12:03 PM

Hic mấy bác nghĩ rằng em đang ở mức nào mà không thèm chỉ vầy trời. Hướng dẫn cho người chưa biết gì khác với nói chuyện với người đã biết chứ. làm ơn viết dùm em một bài tập nhỏ như em đã ví dụ bên trên để em hình dung ra quá trình xử lý công việc cần làm là như thế nào. mấy bác gợi ý, mấy bác hướng dẫn em có thể nắm đc. nhưng cái quan trọng nhất là viết như thế nào thì em lại không biết. vậy nên mới tha thiết yêu cầu các bác viết ví dụ cụ thể từ A->Z hộ với. nếu là ASM thì làm ơn viết hết nguyên một chương trình. Quả thật là cấu trúc bộ nhớ pic em cũng còn chưa nắm đc. Nếu viết bằng C thì bác sử dụng thư viện nào, viết thêm hàm nào thì làm ơn viết hết ra dùm cái. Thiết nghĩ với một Ví dụ đơn giản như trên thì chương trình có là bao đâu sao các bác cứ khó dễ mãi thế.

namqn 21-07-2008 05:03 PM

Trích:

Nguyên văn bởi gong05sk (Post 17575)
Hic mấy bác nghĩ rằng em đang ở mức nào mà không thèm chỉ vầy trời. Hướng dẫn cho người chưa biết gì khác với nói chuyện với người đã biết chứ. làm ơn viết dùm em một bài tập nhỏ như em đã ví dụ bên trên để em hình dung ra quá trình xử lý công việc cần làm là như thế nào. mấy bác gợi ý, mấy bác hướng dẫn em có thể nắm đc. nhưng cái quan trọng nhất là viết như thế nào thì em lại không biết. vậy nên mới tha thiết yêu cầu các bác viết ví dụ cụ thể từ A->Z hộ với. nếu là ASM thì làm ơn viết hết nguyên một chương trình. Quả thật là cấu trúc bộ nhớ pic em cũng còn chưa nắm đc. Nếu viết bằng C thì bác sử dụng thư viện nào, viết thêm hàm nào thì làm ơn viết hết ra dùm cái. Thiết nghĩ với một Ví dụ đơn giản như trên thì chương trình có là bao đâu sao các bác cứ khó dễ mãi thế.

Trong các ví dụ của tôi, tôi không dùng hàm thư viện nào cả, chỉ thiết lập các thanh ghi như trong datasheet. Tôi viết bằng cú pháp của MPLAB C18, còn bạn dùng CCS C. Do đó, bạn phải tự thân vận động một chút.

Luồng này bạn hỏi về PWM chứ không hỏi về cách viết chương trình C ra sao, do đó tôi giả thiết là bạn biết cách đặt đoạn chương trình C mẫu vào chương trình của bạn. Nếu bạn chưa biết cách viết chương trình C, đề nghị bạn tìm một tài liệu hướng dẫn về ngôn ngữ C để đọc, sau đó đọc tài liệu hướng dẫn của trình biên dịch mà bạn đang dùng. Sau đó, làm vài bài tập cơ bản để nắm được cách viết chương trình C trong trình biên dịch của bạn.

Dưới đây là toàn bộ chương trình tôi dùng để test PIC18F4431, viết cho MPLAB C18. Đừng yêu cầu tôi port code sang CCS C.
Code:

#include <p18cxxx.h>

#pragma config OSC = HS
#pragma config FCMEN = OFF
#pragma config IESO = OFF
#pragma config PWRTEN = ON
#pragma config BOREN = ON
#pragma config BORV = 27
#pragma config WDTEN = OFF
#pragma config WINEN = OFF
#pragma config WDPS = 32768
#pragma config T1OSCMX = OFF
#pragma config HPOL = HIGH
#pragma config LPOL = HIGH
#pragma config PWMPIN = ON
#pragma config MCLRE = ON
#pragma config EXCLKMX = RD0
#pragma config PWM4MX = RD5
#pragma config SSPMX = RD1
#pragma config FLTAMX = RD4
#pragma config STVREN = ON
#pragma config LVP = OFF
#pragma config DEBUG = OFF
#pragma config CP0 = OFF
#pragma config CP1 = OFF
#pragma config CP2 = OFF
#pragma config CP3 = OFF
#pragma config CPB = OFF
#pragma config CPD = OFF
#pragma config WRT0 = OFF
#pragma config WRT1 = OFF
#pragma config WRT2 = OFF
#pragma config WRT3 = OFF
#pragma config WRTB = OFF
#pragma config WRTC = OFF
#pragma config WRTD = OFF
#pragma config EBTR0 = OFF
#pragma config EBTR1 = OFF
#pragma config EBTR2 = OFF
#pragma config EBTR3 = OFF
#pragma config EBTRB = OFF

void Init_PCPWM(void);

void main() {
        Init_PCPWM();
        while (1) Nop();
}

void Init_PCPWM() {
        PTCON0 = 0x04;                //postscale 1:1, prescale 1:4, free running
        PTPERL = 0x9B;                //8 kHz @ 20 MHz
        PTPERH = 0x00;
        PWMCON0 = 0x40;                //PWM0..5 are enabled for PWM output
        PWMCON1 = 0x01;                //postscale 1:1, output override are synchronized
                                //to the PWM time base
        DTCON = 0x05;                //0.5 us dead time @ 20 MHz
        OVDCOND = 0xFF;                //output on PWM I/O pin is controlled by duty cycle
                                //and time base
        OVDCONS = 0x00;                //PWM I/O is INACTIVE when POUT is cleared
        FLTCONFIG = 0x00;        //disable all fault pins
        SEVTCMPL = 0;
        SEVTCMPH = 0;
        PDC0H = 0;
        PDC1H = 0;
        PDC2H = 0;
        PDC3H = 0;
        PDC0L = 0x80;                //Duty cycle of 20.5% at PWM1
        PDC1L = 0xA0;                //Duty cycle of 25.6% at PWM3
        PDC2L = 0xC0;                //Duty cycle of 30.8% at PWM3
        PDC3L = 0xE0;                //Duty cycle of 35.9% at PWM7
        PTCON1bits.PTEN = 1;
}

Nếu bạn nghĩ rằng tôi làm khó dễ bạn, lần sau tôi sẽ không trả lời câu hỏi của bạn nữa, để bạn khỏi bị làm khó dễ.

Thân,

ttai 21-07-2008 08:35 PM

Trích:

Nguyên văn bởi Macintosh (Post 17517)
to anh Nam,
em nghĩ thế mạnh của một trình dịch thể hiện ở chỗ nó có hỗ trợ cho người dùng nhiều hay không.CCS hỗ trợ rất nhiều,em không phủ nhận là phải hiểu gốc gác vấn đề,datasheet tất nhiên phải đọc.Nhưng em thiết nghĩ ,cái gì đã hỗ trợ sao lại không dùng,thời gian để nghiên cứu thứ khác .
chẳng hạn,trong thiết lập PWM,nếu phải set các bit trong các thanh ghi Config PWM,eo ui,sẽ thật khó hiểu,cho bản thân,và cả cho người khác khi đọc chương trình,trong khi trong Help của CCS có hẳn các Built in Funtion, các lệnh C thật dễ hiểu để thiết lập,dễ chỉnh sửa chương trình sau này.

Bạn nói cũng có phần đúng, cái gì đã hỗ trợ tốt thì mình cũng nên dùng. Nhưng ...
*thứ nhất CCSC không hỗ trợ tốt cho người dùng. Bạn hãy để ý từ phiên bản đầu tiên đến bản mới nhất, phần Help của CCSC luôn rất khó sử dụng, phần ví dụ trong Help cũng khó tiếp cận. Tôi từng viết ASM cho PIC rất kỹ và hiện đang dùng CCSC nhưng lúc làm luận văn, viết PWM cho con PIC18F4431, dùng hàm của CCSC thì tôi cực kỳ vất vả. Đến lúc tức điên người lên không thèm dùng hàm built in nữa, tôi chuyển sang tự set thanh ghi cho PIC luôn, chạy tốt!
* thứ hai, như tôi đã nói, ít ra cũng phải hiểu cấu trúc PIC, hiểu cách hoạt động của các thanh ghi (và viết ASM chính là để hiểu rõ điều này) thì mới viết C tốt. Khi đó nếu gặp vấn đề gì với C, ta có thể troubleshooting rất nhanh, không được nữa thì quay lại ASM. Vì C thật ra cũng là ASM mà ra.

Tôi nghĩ nếu bạn chỉ là cần code để cho luận văn hay đề tài gì đó không dài hạn, hoặc bạn chỉ "ghé thăm" PIC trong một thời gian ngắn thì bạn cứ dùng C thoải mái mà không cần hiểu thanh ghi. Nhưng nếu đã quyết định sử dụng PIC cho công việc (dài hạn) thì nên tìm hiểu tường tận. Datasheet tuy khó hiểu nhưng hứa với bạn là chỉ trong thời gian đầu, lần thứ 2,3,4... bạn sẽ thấy dễ dần. Có gì khó hiểu bạn cứ post lên đây là ok thôi.
Bye, good luck with PIC!

Macintosh 21-07-2008 10:43 PM

Trích:

Nguyên văn bởi ttai (Post 17586)
Bạn nói cũng có phần đúng, cái gì đã hỗ trợ tốt thì mình cũng nên dùng. Nhưng ...
*thứ nhất CCSC không hỗ trợ tốt cho người dùng. Bạn hãy để ý từ phiên bản đầu tiên đến bản mới nhất, phần Help của CCSC luôn rất khó sử dụng, phần ví dụ trong Help cũng khó tiếp cận. Tôi từng viết ASM cho PIC rất kỹ và hiện đang dùng CCSC nhưng lúc làm luận văn, viết PWM cho con PIC18F4431, dùng hàm của CCSC thì tôi cực kỳ vất vả. Đến lúc tức điên người lên không thèm dùng hàm built in nữa, tôi chuyển sang tự set thanh ghi cho PIC luôn, chạy tốt!
* thứ hai, như tôi đã nói, ít ra cũng phải hiểu cấu trúc PIC, hiểu cách hoạt động của các thanh ghi (và viết ASM chính là để hiểu rõ điều này) thì mới viết C tốt. Khi đó nếu gặp vấn đề gì với C, ta có thể troubleshooting rất nhanh, không được nữa thì quay lại ASM. Vì C thật ra cũng là ASM mà ra.

Tôi nghĩ nếu bạn chỉ là cần code để cho luận văn hay đề tài gì đó không dài hạn, hoặc bạn chỉ "ghé thăm" PIC trong một thời gian ngắn thì bạn cứ dùng C thoải mái mà không cần hiểu thanh ghi. Nhưng nếu đã quyết định sử dụng PIC cho công việc (dài hạn) thì nên tìm hiểu tường tận. Datasheet tuy khó hiểu nhưng hứa với bạn là chỉ trong thời gian đầu, lần thứ 2,3,4... bạn sẽ thấy dễ dần. Có gì khó hiểu bạn cứ post lên đây là ok thôi.
Bye, good luck with PIC!

đã là kỹ thuật thì sao lại ghé thăm hả bạn? còn có những thứ có thể bạn nói khó,tôi lại nói dễ,và ngược lại nữa,đúng ko bạn.còn cấu trúc tất nhiên là phải biết rùi,datasheet cũng phải đọc rùi.đúng là có nhiều tính năng PIC mà CCS ko có hỗ trợ thật.
tôi cũng từng code ASM cho 8051,rùi mới xài PIC.Và tôi nghĩ đa số sv chúng ta cũng thường theo con đường đó nên cũng ko khó khi tìm hiểu cấu trúc PIC.còn C or ASM cũng chỉ là vấn đề về ngôn ngữ thui mà.

gong05sk 21-07-2008 10:46 PM

Vẫn lại là những lời văn vẻ. Thôi tới đây em bức xô em chịu không nổi nữa. cái cảm giác chờ một người biết cách dạy cho mình học thật khó chịu. thôi thì tự tìm hiểu lấy vậy. dù biết rằng như thế sẽ mất đến vài tháng thậm chí cả năm. còn nếu có người chỉ thì chỉ mất vài ngày. Các bác làm em thất vọng quá. Các bác giỏi thì giỏi thật nhưng không biết cách dạy người khác. để khi nào em nắm bắt đc vấn đề em sẽ về và trình bày lại chủ đề này. há miệng chờ sung đúng là không phải cách.

Macintosh 21-07-2008 11:00 PM

Trích:

Nguyên văn bởi gong05sk (Post 17575)
Hic mấy bác nghĩ rằng em đang ở mức nào mà không thèm chỉ vầy trời. Hướng dẫn cho người chưa biết gì khác với nói chuyện với người đã biết chứ. làm ơn viết dùm em một bài tập nhỏ như em đã ví dụ bên trên để em hình dung ra quá trình xử lý công việc cần làm là như thế nào. mấy bác gợi ý, mấy bác hướng dẫn em có thể nắm đc. nhưng cái quan trọng nhất là viết như thế nào thì em lại không biết. vậy nên mới tha thiết yêu cầu các bác viết ví dụ cụ thể từ A->Z hộ với. nếu là ASM thì làm ơn viết hết nguyên một chương trình. Quả thật là cấu trúc bộ nhớ pic em cũng còn chưa nắm đc. Nếu viết bằng C thì bác sử dụng thư viện nào, viết thêm hàm nào thì làm ơn viết hết ra dùm cái. Thiết nghĩ với một Ví dụ đơn giản như trên thì chương trình có là bao đâu sao các bác cứ khó dễ mãi thế.

Vận động đi chứ!chờ ng khác dọn cỗ sẵn luôn ah.
Vấn đề của u chính là ko chịu đọc những cái người khác đã làm,gì chứ ví dụ thì có một đống! Bạn ông bảo học PIC thì chắc chắn hắn đã copy cho ông cả đống tài liệu rùi,đúng ko.
PWM,tôi đã post thiết lập của tôi đó.tôi đã dùng pic8f4331 để PWM cho 6 động cơ ,chạy rùi,robot cũng đã cất rùi,nên ko cần phải băn khoăn j cả.ông ko chịu làm đó thui!

Macintosh 21-07-2008 11:11 PM

Trích:

Nguyên văn bởi gong05sk (Post 17591)
Vẫn lại là những lời văn vẻ. Thôi tới đây em bức xô em chịu không nổi nữa. cái cảm giác chờ một người biết cách dạy cho mình học thật khó chịu. thôi thì tự tìm hiểu lấy vậy. dù biết rằng như thế sẽ mất đến vài tháng thậm chí cả năm. còn nếu có người chỉ thì chỉ mất vài ngày. Các bác làm em thất vọng quá. Các bác giỏi thì giỏi thật nhưng không biết cách dạy người khác. để khi nào em nắm bắt đc vấn đề em sẽ về và trình bày lại chủ đề này. há miệng chờ sung đúng là không phải cách.

Thứ nhất,ông quá nôn nóng.
thứ nhì,ông ko chịu vận động.
Đúng là khi tôi tiếp cận với PIC,con đầu tiên là 4331,mất hơn 2 tháng để đk PWM cái motor đầu tiên.tui biết hoàn cảnh của ông bây giờ.chẳng ai thích dạy đời ông cả và Đừng nói về những người đang muốn giúp ông như vậy.

gong05sk 22-07-2008 12:18 AM

Bác nói thế là oan cho em đấy. Mấy ngày nay em đọc đi đọc ại muốn nát cả cái datasheet. xem tới xem lui không biết bao nhiêu ví dụ trong diễn đàn. và cuối cùng là em nhận ra mình chưa biết gì hết , nên em quay về với bài tập xuất led cơ bản đây. và cũng từ giã con 4331 này mà quay về con 16f877a cho nó bền, đơn giản vì nó có mô phỏng trên proteus. Cứ tưởng có thể học đc kinh nghiệm đi trước từ mấy bác cho rút ngắn bớt thời gian nhưng giờ thấy đó là sai lầm. Có thể em không kịp nắm con pic 4331 trước thời gian làm robot sắp tới. nhưng kệ cùng lắm thì quay về con P98v51 của philip đỡ vậy. còn con này cứ nghiên cứu sau. chứ tình trạng vầy chẳng biết đi về đâu.

const_nos 12-04-2009 07:17 AM

thắc mắc
 
mình đang làm với con 18f4331. tìm hiếu về PWM,nhưng vẫn chưa rõ lắm. Ban đâu mình định tạo xung ra không đổi của cặp PWM0 và PWM1.Mình làm như sau:

#include <18f4331.h>
#fuses NOWDT,PUT,HS,NOPROTECT
#use delay(clock=40000000)

void main()
{
setup_power_pwm_pins(PWM_COMPLEMENTARY,PWM_OFF,PWM _OFF,PWM_OFF);
setup_power_pwm(PWM_CLOCK_DIV_4|PWM_FREE_RUN,1,0,4 00,0,1,0);
set_power_pwm0_duty(100);
}

mình dùng oscilloscope nhưng thấy chan ra chẳng có gì . Còn có hiện tượng thông báo : Processor is in reset.Ai biết giúp mình với.Thank nhiều

wonderkids 17-04-2009 04:48 PM

Đoạn code của bạn có xung nhưng chỉ 1 xung mà thôi,bạn phải dùng lệnh while(1) để tạo vòng lặp,bạn tham khảo thêm nha,^_^

Macintosh 18-04-2009 12:57 AM

Trích:

Nguyên văn bởi const_nos (Post 24679)
mình dùng oscilloscope nhưng thấy chan ra chẳng có gì . Còn có hiện tượng thông báo : Processor is in reset.Ai biết giúp mình với.Thank nhiều

hì, ốt-xì-lô đã báo vậy thì cũng kiểm tra một phát thử có đúng như vậy ko đi bạn. có thể chân MCLR bị nối mass đó.

Macintosh 18-04-2009 12:59 AM

Trích:

Nguyên văn bởi wonderkids (Post 24898)
Đoạn code của bạn có xung nhưng chỉ 1 xung mà thôi,bạn phải dùng lệnh while(1) để tạo vòng lặp,bạn tham khảo thêm nha,^_^

ko phải vậy đâu bạn.

truongqt 19-04-2009 11:11 PM

Pwm pic
 
Trích:

Nguyên văn bởi Macintosh (Post 17521)

- cái cần wan tâm chính là SETUP_POWER_PWM_PINS( ) ;SETUP_POWER_PWM( );SET_POWER_PWMX_DUTY( ) để làm việc với Power PWM.

Có vẻ gần được rùi đấy,mày mò xí nữa!!! bác phải làm rùi tớ mới hd tiếp được!

Bạn cho mình hỏi cách tạo bảng since theo ý muốn, dùng matlab ấy. Mình đang tìm cách tạo bảng sin dùng matlab mà ko biết làm thế nào đây.
Có ai biết ko vậy, giúp tớ với.
À, với lại 1 vấn đề nữa, đó là cách chọn tụ cho mạch lái cầu IGBT, sử dụng IR2101. Tụ này nằm ở phía các khóa cao (high). Bạn nào đã từng làm chưa vậy.

vagabondtt1503 07-07-2009 01:02 AM

Trích:

Nguyên văn bởi namqn (Post 17577)
Trong các ví dụ của tôi, tôi không dùng hàm thư viện nào cả, chỉ thiết lập các thanh ghi như trong datasheet. Tôi viết bằng cú pháp của MPLAB C18, còn bạn dùng CCS C. Do đó, bạn phải tự thân vận động một chút.

Luồng này bạn hỏi về PWM chứ không hỏi về cách viết chương trình C ra sao, do đó tôi giả thiết là bạn biết cách đặt đoạn chương trình C mẫu vào chương trình của bạn. Nếu bạn chưa biết cách viết chương trình C, đề nghị bạn tìm một tài liệu hướng dẫn về ngôn ngữ C để đọc, sau đó đọc tài liệu hướng dẫn của trình biên dịch mà bạn đang dùng. Sau đó, làm vài bài tập cơ bản để nắm được cách viết chương trình C trong trình biên dịch của bạn.

Dưới đây là toàn bộ chương trình tôi dùng để test PIC18F4431, viết cho MPLAB C18. Đừng yêu cầu tôi port code sang CCS C.
Code:

#include <p18cxxx.h>

#pragma config OSC = HS
#pragma config FCMEN = OFF
#pragma config IESO = OFF
#pragma config PWRTEN = ON
#pragma config BOREN = ON
#pragma config BORV = 27
#pragma config WDTEN = OFF
#pragma config WINEN = OFF
#pragma config WDPS = 32768
#pragma config T1OSCMX = OFF
#pragma config HPOL = HIGH
#pragma config LPOL = HIGH
#pragma config PWMPIN = ON
#pragma config MCLRE = ON
#pragma config EXCLKMX = RD0
#pragma config PWM4MX = RD5
#pragma config SSPMX = RD1
#pragma config FLTAMX = RD4
#pragma config STVREN = ON
#pragma config LVP = OFF
#pragma config DEBUG = OFF
#pragma config CP0 = OFF
#pragma config CP1 = OFF
#pragma config CP2 = OFF
#pragma config CP3 = OFF
#pragma config CPB = OFF
#pragma config CPD = OFF
#pragma config WRT0 = OFF
#pragma config WRT1 = OFF
#pragma config WRT2 = OFF
#pragma config WRT3 = OFF
#pragma config WRTB = OFF
#pragma config WRTC = OFF
#pragma config WRTD = OFF
#pragma config EBTR0 = OFF
#pragma config EBTR1 = OFF
#pragma config EBTR2 = OFF
#pragma config EBTR3 = OFF
#pragma config EBTRB = OFF

void Init_PCPWM(void);

void main() {
        Init_PCPWM();
        while (1) Nop();
}

void Init_PCPWM() {
        PTCON0 = 0x04;                //postscale 1:1, prescale 1:4, free running
        PTPERL = 0x9B;                //8 kHz @ 20 MHz
        PTPERH = 0x00;
        PWMCON0 = 0x40;                //PWM0..5 are enabled for PWM output
        PWMCON1 = 0x01;                //postscale 1:1, output override are synchronized
                                //to the PWM time base
        DTCON = 0x05;                //0.5 us dead time @ 20 MHz
        OVDCOND = 0xFF;                //output on PWM I/O pin is controlled by duty cycle
                                //and time base
        OVDCONS = 0x00;                //PWM I/O is INACTIVE when POUT is cleared
        FLTCONFIG = 0x00;        //disable all fault pins
        SEVTCMPL = 0;
        SEVTCMPH = 0;
        PDC0H = 0;
        PDC1H = 0;
        PDC2H = 0;
        PDC3H = 0;
        PDC0L = 0x80;                //Duty cycle of 20.5% at PWM1
        PDC1L = 0xA0;                //Duty cycle of 25.6% at PWM3
        PDC2L = 0xC0;                //Duty cycle of 30.8% at PWM3
        PDC3L = 0xE0;                //Duty cycle of 35.9% at PWM7
        PTCON1bits.PTEN = 1;
}

Nếu bạn nghĩ rằng tôi làm khó dễ bạn, lần sau tôi sẽ không trả lời câu hỏi của bạn nữa, để bạn khỏi bị làm khó dễ.

Thân,

Theo như code của anh thì PDCx = 4 x PTPER thì chu kỳ nhiệm vụ mới đạt 100%,cho em hỏi đây có phải là đặc tính của 18f4431 hay không?Vì trong tutorial 5 của anh viết cho DsPIC thì PDCx = 2 x PTPER ,chu kỳ nhiệm vụ đạt 100%

Cảm ơn anh

namqn 07-07-2009 10:04 AM

Trích:

Nguyên văn bởi vagabondtt1503 (Post 27444)
Theo như code của anh thì PDCx = 4 x PTPER thì chu kỳ nhiệm vụ mới đạt 100%,cho em hỏi đây có phải là đặc tính của 18f4431 hay không?Vì trong tutorial 5 của anh viết cho DsPIC thì PDCx = 2 x PTPER ,chu kỳ nhiệm vụ đạt 100%

Cảm ơn anh

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,

hoangtanduong13 07-07-2009 11:30 AM

pwm cua pic 16f877a
 
ban nao ranh` ve pwm thi giup minh voi.minh vua tim dc cai code viet ve pwm,nhung ma compile no bao loi!de minh gui len cho cac ban!
Code:

#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);
          }
      }
  }

no bao toi 9 loi lan!nhug ma chu yeu la undefined indentifier portb
mog cac pac giup do!thank nhieu!

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à 08:38 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