![]() |
dsPIC Tutorial 5-Module ADC và MCPWM
3 Attachment(s)
Đây là tutorial 5 cho dsPIC, giới thiệu các module ADC và MCPWM. Mã nguồn được viết trong ASM30 (tập tin "Vidu5.zip") và C30 (tập tin "Vidu5C30.zip"). Các tập tin .hex đã được đính kèm.
Một ví dụ đọc ngõ vào ADC và điều chỉnh độ rộng xung một cách tương ứng, ví dụ còn lại đọc ngõ vào analog và gửi các ký tự biểu diễn giá trị đọc được(hexadecimal) ra cổng RS-232. Chúc các bạn thành công! Thân, |
Em đọc phần PWM của DSPIC30F4011 mà khó hiểu quá,khác xa so với 16F877A.Em đã test thử PWM cho động cơ mà chưa được,ko hiểu tại sao,mong anh giúp đỡ.
Chương trình của em như sau: Bật chức năng PWM của chân PWM1H và PWM2L, với Fpwm=1khz,tỷ lệ D/t=1/2(chạy 50% công suất).Còn chân PWM1L và PWM2H luôn ở mức thấp.PWM cứ hoạt động cho đến khi bit RB1=1(bình thường thì RB1 ở mức 0) thì dừng PWM và các chân PWM lại vào/ra số như các chân khác. Em dùng thạch anh 8MHZ Chương trình của em như sau: Code:
#include"p30f4011.h" Mong bác chỉ bảo. Em đợi tin của bác thanks |
Nếu bạn chưa đọc tutorial này của tôi thì hãy đọc nó trước đi. Nếu bạn đã thử phần tutorial của tôi rồi thì hãy sửa nó theo cách mà bạn muốn. Như vậy sẽ dễ hơn cho bạn.
Thân, |
Báo cáo về UART của tut4 và tut5 của a Nam :
Đây là board test của em ,em xài dsPic 30F4011 : http://i232.photobucket.com/albums/e...nh/Img0412.jpg http://i232.photobucket.com/albums/e...nh/Img0413.jpg Giao tiếp UART của bài 4-1 và 5-2 : http://i232.photobucket.com/albums/e...enh/tut4-1.jpg http://i232.photobucket.com/albums/e...khenh/tut5.jpg Bài 4-1 ,với ví dụ là "Xin Chao !" em test thì có rất nhiều đoạn đọc sai ,kí tự " " (khoảng trắng) trong character map là 00A0 ,mà em koi watch thì trong pic đọc ra là 0x0020 ,đây có thể là lỗi do font ko ? cái hình trên là em dùng thời gian tràn của TMR1 là 0.5s ,chứ để 1s ,nó ra tùm lum hết T_T . Tut 3 và 4-3 ,4-4 vì ko có LCD và DS1307 nên em chưa test thực tế được ,chỉ coi watch chạy thui .Nên chưa nắm rõ lắm . |
ở bài 4-1 ,nếu muốn chuỗi kí tự khi đọc về xuống dòng và về đầu dòng thì thêm cái này vào sau chuỗi nha :
\n : xuống dòng \r : về đầu dòng ví dụ : Trích:
|
Trích:
Thân, |
bác namqn cho em hỏi, em có thể dùng chân PWM_L cho chức năng PWM, và chân PWM_H cho chức năng port I/O bình thường ko ah, và làm thế nào.
Nếu em muốn PWM1 là PWM, còn PWM2 hoặc 3 là port I/O thường chỉ việc cho LATx= 0 hoặc 1 là dc hả anh. Em lấy ví dụ 5.1 của anh sửa đi để chạy với mạch thật, biến trở em nối vào nguồn 5V, diều khiển động cơ dùng L298, dùng PWM1L và PWM2L để điều khiển, em cho luôn chân PWM2L=0, khi điều chỉnh biến trở thì chỉ 1 nửa là động cơ chạy, 1 nửa là dứng yên, tức là ko điều chỉnh dc toàn dải, mắc dù em cho chân PWM2L=0 rồi nhưng khi em đo áp trên chan này thì dc hơn 1 V, em nghĩ đây là nguyên nhân mà ko điều chỉnh dc toàn dải, có phải ko anh, cho em cách khắc phục _FOSC(CSW_FSCM_OFF & FRC_PLL4); cái này có phải cấu hình dùng dao động nội của chip ? nếu em dùng thach anh 20Mhz thì em cấu hình như này _FOSC(CSW_FSCM_OFF & HS); có đúng ko anh. Nên dùng thạch anh ngoài hay bộ dao động nội, em thấy các ví dụ của anh toàn dùng dao động nội? nếu dùng thạch anh thì fcy (tần số thực thi lệnh) = Fosc/4 đúng ko anh? Nếu em muốn viết 1 hàm trễ 1ms bằng vòng lặp for thì cách tính toán như nào ( anh cho ví dụ luôn nhé),viết hàm delay nên dùng vòng lặp for hay dùng timer ? |
Trích:
Nếu muốn các chân của một kênh PWM nào đó là ngõ vào/ra thông thường thì thiết lập các bit PENxH và PENxL mang giá trị '0'. Nếu bạn dùng L298 thì cần cho biết sơ đồ kết nối giữa dsPIC và L298. Một phần cứng cụ thể sẽ tương ứng với một thuật toán điều khiển cụ thể. Bạn không thể áp ví dụ của tôi vào mạch cầu H, vì tôi không viết phần mềm để điều khiển mạch cầu H. Tôi chỉ xuất ngõ ra PWM với duty cycle được thay đổi theo tín hiệu ADC vào thôi. Bạn tham khảo thêm cách điều khiển được đề xuất cho cầu H ở post #49 của luồng sau: http://www.picvietnam.com/forum/showthread.php?t=1186 _FOSC(CSW_FSCM_OFF & FRC_PLL4); chọn bộ dao động nội với x4 PLL được kích hoạt. Thạch anh ngoài 20 MHz có thể dùng với các cấu hình: _FOSC(CSW_FSCM_OFF & HS); hoặc _FOSC(CSW_FSCM_OFF & XT_PLL4); XT_PLL4 có thể gặp khó khăn trong việc ổn định dao động cho thạch anh. Tôi dùng bộ dao động nội trong các tutorial chỉ để đơn giản hóa phần cứng. Với các bài toán yêu cầu độ chính xác cao đối với xung clock thì nên dùng thạch anh ngoài, hoặc tốt hơn là bộ dao động ngoài. Việc một vòng for nào đó chạy mất bao nhiêu thời gian còn tùy thuộc vào chế độ tối ưu khi biên dịch code. Tôi thường dùng MPLAB SIM để xác định thời gian (hay số chu kỳ máy) cần thiết để thực thi một vòng for. Theo tôi, không nên dùng vòng lặp đếm chu kỳ máy cho các thời gian trễ tương đối dài (cỡ ms). Thân, |
1 Attachment(s)
Em post mạch của lên bác xem, em cho luôn PWM2L =0 (_LATE2=0), còn PWML1 là chân PWM, nhưng em đo áp trên chân E2 vẫn được hơn 1V, em set = 0 rồi, sao nó ko về 0V, bác xem với mạch của em thì điều khiển với tần số tối đa là bao nhiêu, em đã thay 1N4007 bằng diode schotky 1N5819, chương trình em sửa của bác
Code:
#include <p30f4011.h> |
Trích:
Bạn sửa code mà không chú thích lại. Với FRC_PLL4, Fcy không thể là 20 MHz, mà chỉ có thể là 7.37 MHz (với các dsPIC30F4011 sau này, theo các phiên bản datasheet mới nhất). Để có thể dùng phần lớn phạm vi điều chỉnh của biến trở ngõ vào ADC, bạn cần tính toán đôi chút, và có thể cần phải điều chỉnh thiết kế ở phần ngõ vào ADC dùng để đặt duty cycle. Với ví dụ của tôi, tôi đã dùng Fcy = 8 MHz, với tần số ngõ ra là 40 kHz, do đó PTPER của tôi sẽ là 200. Độ phân giải của duty cycle gấp đôi độ phân giải của timer tạo chu kỳ. Do đó, số đếm tương ứng với duty cycle 100% sẽ là 400. Từ đó, tôi mới lấy 9 bit của kết quả ADC để đặt duty cycle, với phạm vi thay đổi là 0 .. 511. Như vậy, biến trở của tôi chạy đến khoảng 80% phạm vi của nó thì duty cycle của tôi sẽ đạt 100%. Bạn cần tính toán lại cho trường hợp của bạn. Bạn cũng chưa cho biết đã nối biến trở đến ngõ vào ADC như thế nào. Theo datasheet của L298 thì tần số điển hình của mạch là 25 kHz, tối đa là 40 kHz. Bạn có thể dùng 20 kHz với các thử nghiệm ban đầu. Mỗi bài viết của một thành viên nào đó đều có nút 'Cảm ơn' để những thành viên khác sử dụng. Nếu bạn thấy bài viết nào có ích cho bạn thì bạn có thể nhấn nút đó, và không cần viết bài cảm ơn. Thân, |
Em đã sửa lại chương trình của em và đã điều chỉnh trên toàn dải, bác cho em hỏi là nếu mình dùng nhiều hơn 1 chân kiểu analog thì mình dùng kiểu quét để đọc giá trị về ah, và các ngắt của nó xảy ra như nào ah. con 30F4011 có 8 chân Analog thì có 16 bộ đệm ADCBUF là như nào hả bác, ví dụ như là đọc giá trị từ chân AN0, AN6 thì mình dùng bộ đếm mấy ah, em chư hiểu kiểu lấy mẫu A hoặc B như nào.
Một vấn đề nưa em muốn hỏi bác luôn là, em dùng QEI và đã được đọc số chính xác, nhưng em đọc datasheet con 30F4011 ko có chế độ VELOCITY MEASUREMENT như con 18F4331, như thế em để suy ra vận tốc, thì em dùng 1 ngắt timer trong 1s để đọc số xung rồi suy ra vận tốc, ví dụ trong 1s đó mà quay dc 5,5 vòng thì em phải dùng thêm ngắt của QEI đẻ xác định số vòng rồi cộng thêm với số vòng dư. Hoặc em chỉ dùng ngắt của QEI ví dụ số vòng đến 5 thì đọc giá trị của 1 timer chạy free run, bác xem 2 cách trên của em có khả thi ko. Nếu em gộp ctr là điều chỉnh và hiện thị tốc độ, hiện thị cả dòng điện phản hồi nữa, như thế em phải dùng nhiều ngắt,em đang rối phần ưu tiên ngắt, bác mách nước cho em đuọc ko ah. Thanks |
Trích:
Đọc số xung encoder trong 1 giây để tính vận tốc chỉ thích hợp cho hiển thị, thường không đủ cho điều khiển (tốc độ cập nhật quá chậm). Cả hai cách bạn nêu đều thích hợp, nhưng áp dụng ở các dải tốc độ khác nhau. Các ngắt thông thường có thể được thiết lập ở một trong bảy mức ưu tiên ngắt. Tôi tin rằng bạn có thể dễ dàng thiết lập mức độ ưu tiên cho vài ngắt mà bạn đang dùng. Việc bố trí các ngắt như thế nào còn tùy vào mức độ quan trọng của ngắt đang được xử lý, thời gian xử lý của một ngắt được dự định gán mức ưu tiên cao hơn ngắt đó, ... Hy vọng bạn có thể dựa vào một vài gợi ý trên để thiết lập việc ưu tiên ngắt cho hiệu quả. Thân, |
bác namqn có thể nói rõ hơn khi mình dùng nhiều hơn 1 chân ADC, bác có thể viết 1 đoặn ví dụ cụ thể dc ko ah.
Ví dụ dùng AN0 và AN6, chân AN0 lấy tín hiệu từ triết áp để điều khiển tốc độ động cơ, còn chân AN6 lấy tín hiệu dòng phản hồi của động cơ, rồi hiện thì lên LCD chẳng han,thì cấu hình như nào, tốc độ lấy mẫu như nào thì phù hợp ah, với AN0 thì dùng PWM chấm dứt lấy mẫu, còn với AN6 mình dùng TIMER3 chấm dứt lấy mẫu có hợp lý ko anh, ADCHS mình khai báo như nào ah kết quả chuyển đổi từ 2 chân trên mình lấy ở đâu ra ah, có phải từ ADCBUF0 và ADCBUF6 ko bác EM hỏi thêm bác đoặn này bit 5-2 SMPI<3:0>: Sample/Convert Sequences Per Interrupt Selection bits 1111 = Interrupts at the completion of conversion for each 16th sample/convert sequence 1110 = Interrupts at the completion of conversion for each 15th sample/convert sequence ..... 0001 = Interrupts at the completion of conversion for each 2nd sample/convert sequence 0000 = Interrupts at the completion of conversion for each sample/convert sequence cái này có phải lựa chon ngắt xảy ra sau 1 đến 16 lần chuyển đổi xong, hay ngắt khi lấy mẫu 1 đến 16 lần rồi chuyển đôi. Em thấy cái thứ nhất có vẻ đúng hơn, có phải ko hả bác Mong bác giúp đỡ em |
bác namqn giúp em thêm cái này nữa, em viết đoặn chtr điều khiển tốc độ động cơ dùng triết áp, điểm đầu và chuối mắc vào 0 và 5V, điểm giữa đưa vào AN0 của 30F4011, dùng L298,
với động cơ chưa có tải, và em để PWM là kich chuyển đổi ADC thì em chỉnh chiết áp thì tốc độ thay đổi rất trươn ko có vấn đề j cả, nhung em cho thêm cái tải là em dùng dây cô doa nối sang 1 động cơ khác thôi, là tụ nhiên 2 chạy rất giật, điều chỉnh tốc độ cũng bị giật mà để em 1 vị trí tốc độ thì nó chạy dc vài vông lại giật 1 cái, ở dải tốc độ thấp cả 2 con đều ko chay, em có chuyển sang dùng timer3 kích chuyển đổi thì có vẻ chạy ko bị giật hơn và ở giải tốc đọ thấp vẫn điều khiển dc, nhung chỉ cần hơi vặn nhanh triết áp 1 tí là vdk bị đơ và dc đứng yên. anh xem hộ em vơi đây là code của em Code:
------------------------------------------------------------------------------*/ |
Trích:
Tôi không có thói quen dùng hàm thư viện của MPLAB C Compiler for dsPIC, do đó tôi chỉ nêu những thay đổi đối với các thanh ghi liên quan đến module ADC, cho trường hợp ví dụ của bạn, sử dụng AN0 và AN6. Dựa vào hình vẽ 20-1 trong datasheet, có thể thấy để lấy mẫu các ngõ vào AN0 và AN6, cần thiết lập để kênh S/H số 0 (CH0) sử dụng AN6, và kênh S/H số 1 (CH1) sử dụng AN0. Để làm việc này, thanh ghi ADCHS sẽ được thiết lập là 0x0006 (bạn xem "dsPIC30F Family Reference Manual" về ý nghĩa của các trường trong thanh ghi này). Đồng thời, các bit CHPS<1:0> trong thanh ghi ADCON2 cần được thiết lập là '01' để việc chuyển đổi được thực hiện cho CH0 và CH1. Tất nhiên, thanh ghi ADPCFG cũng cần cập nhật để các bit 6 và 0 là '0' (do đó các chân AN6 và AN0 sẽ là các chân analog). Bạn có thể dùng chế độ tự động lấy mẫu, thay vì chọn một trong các nguồn tín hiệu chấm dứt lấy mẫu. ADCBUF chỉ là một bộ đệm được lần lượt điền các kết quả vào, không có chuyện ánh xạ kết quả của AN0 vào ADCBUF0, và của AN6 vào ADCBUF6. Tôi chân thành đề nghị bạn đọc mục 17 của tài liệu "dsPIC30F Family Reference Manual", có rất nhiều ví dụ với hình minh họa về cách sử dụng bộ đệm ADCBUF. Câu hỏi của bạn về field SMPI<3:0> cũng được trả lời rõ trong phần này, theo như ý đầu tiên của bạn: ngắt sau 1 đến 16 chu kỳ lấy mẫu/chuyển đổi. Thân, |
Trích:
Thân, |
1 Attachment(s)
mạch của em mắc như này, bỏ cái phần mắc cho vui, ko dùng con uc3611 mà dùng 4 con diode schotky, vấn đề củ em là ở phần mềm hay ở phần cứng hả anh
|
Trích:
Thân, |
vấn đề nhiếu ở trên em đã giải quyết dc rồi, do em dùng bộ dao động nội của chíp, em chuyển sang dùng thạch anh thì ko còn hiện tượng đó,
Còn về vấn đê đọc 2 đầu vào analog em em làm được rồi nhưng có 1 vấn đề thế này, em set các thanh ghi giống như bác ở trên, và bit SIMSAM = 1 để chuyển đôi dồng thời, em chon chế độ tự động chuyển đổi, và ngắt sau 1 chu kid lấy mẫu/chuyển đổi, kết quả ở chân AN6 là CH0 thì ở ADCBUF0, con AN1 là CH1 thì ở ADCBUF1, em vặn biến trở thì cũng điều chỉnh tốc độ động cơ đc, em dùng hàm ngắt timer2 mỗi 100ms để xuất ra trị của đầu vào AN6 là giá trị dòng điện ra LCD, thì em quan sát thấy giá trị này cứ dao động liên tục, ngay cả khi em chưa cho động cơ chạy và lúc động cơ chạy ở tốc độ ổn định, em dùng đồng hồ đo thì thấy giá trị ở chân này ko thay đổi, bác xem hộ em nguyên nhân tại sao nó giao động thế |
Độ phân giải của chu kỳ nhiệm vụ?
''Chú ý là độ phân giải của chu kỳ nhiệm vụ là TCY/2, còn độ phân giải của chu kỳ xung là TCY. Do đó, chẳng hạn PTPER = 0x7F thì PDCx = 0xFF mới là chu kỳ nhiệm vụ = 100%.''
Anh namqn cho em hỏi là chu kỳ nhiệm vụ là như thế nào? thank's |
Trích:
Thân, |
bác nam ơi, em đọc 1 lúc 5 chân ADC là AN0,1,2,3,6
các chân này em nối với chân giữa của biến trở 100k, 2 chân còn lại của btr dc nối vào nguồn 5V, em đã đọc dc 5 giá tri ADC và hiển thị len LCD, nhưng mà các giá trị này toàn bị dao động thôi bác ah, ngoại trừ em vặn về 0 và 5V thì giá trị ADC đứng yên, em vặn 1 giá trị bất kì chẳng hạn thì nó dao đọng ví dụ từ 231 đến 243, nó cứ chạy lên chạy xuống. Làm sao để đọc dc giá trị ko bị dao động hả bác |
Trích:
|
Trích:
Với ADC 10-bit, hai bit cuối cùng thường dao động với mạch thử nghiệm thông thường của bạn. Cần thiết kế phù hợp để đạt được đầy đủ độ phân giải 10-bit. Thân, |
Trích:
|
Trích:
Ngay cả những hướng dẫn của họ cũng vẫn mang tính lý thuyết, và bạn vẫn cần kinh nghiệm thực tế để thực hiện tốt những dẫn hướng đó. Các nhà sản xuất ADC hàng đầu như Maxim, Analog Devices, hay Linear Technology đều có các app. note hướng dẫn thiết kế mạch giao tiếp với ADC để đạt độ phân giải danh định của vi mạch. Chẳng hạn: http://www.linear.com/pc/downloadDoc...58,P1037,D4160 http://pdfserv.maxim-ic.com/en/an/AN1948.pdf Rất tiếc là tôi không có điều kiện để tìm hết các tài liệu này cho bạn, hơn nữa, kinh nghiệm thiết kế kiểu này khó có thể truyền đạt qua diễn đàn. Thân, |
Bác namqn ơi cho em hỏi, có lẽ nào bộ ADC của con 30F4011 chết được ko hả bác, bo mạch em vân dùng bình thg ko đọng j đến cả, tự nhiên em bật nên thì tất cả các bộ đệm của ADC đều ở giá trị max là 1023, em đã kiểm tra hết tất cả đầu vào xoay biến trở thì vẫn chạy từ 0 đến 5V, em thử nạp lại mấy ch trình ADC đã chạy ngon thì vẫn thế, con chip này làm việc với LCD, PWM, UART vẫn ngon bác ah. Không nhẽ nó chỉ hỏng mỗi bộ ADC10 bit
|
Thầy Nam cho em hỏi là trong file p30f2010.h của phần mềm mplap C30 có đoạn họ định nghĩa về 16 buffer chứa kết quả tạm thời của ADC là :
" extern volatile unsigned int ADCBUF0 __attribute__((__sfr__)); extern volatile unsigned int ADCBUF1 __attribute__((__sfr__)); extern volatile unsigned int ADCBUF2 __attribute__((__sfr__)); extern volatile unsigned int ADCBUF3 __attribute__((__sfr__)); .........." vậy ở đây __attribute__((__sfr__)) có nghĩa là gì hả thầy? Cho em hỏi câu nữa là em muốn cùng một lúc 6 ngõ vào AD là AN0 ... AN5 , thì em phải làm thiết lập sao? bởi vì em thấy trong Farmily rerence .... chỉ thấy có 4 chanels chuyển đổi nên khi dung 6 ngõ vào AD có vấn đề ? chắc em hiểu chưa cặn kẽ về AD module mong thầy chỉ rõ dùm em. Em cảm ơn. Trân trọng !. |
Ở ví dụ 5.1 thầy có viết trong hàm : void Init_MCPWM(void) là
" PWMCON2 = 0x0F00; //Postscale = 1:16 " em đọc trong farmily reference ... về PWMCON2 register mà không hiểu ý nghĩa của postscale ? và trong TUTO này thầy thiết lập Postscale ảnh hưởng như thế nào ? Khi dùng pin PWML mà không dùng PWMH thi Duty cycle đó chính là khoảng thời gian LOW hay là HIGHT trong 1 cycle hả thầy. Tại em không có dao động kí nên không trả lờ câu hỏi này được> Em cảm ơn. Trân trong !. |
Trích:
dsPIC30F2010 chỉ có một bộ chuyển đổi A/D (là phần tử ADC trong sơ đồ ở hình 18-1 của datasheet). dsPIC30F2010 có thể lấy mẫu (sample) mỗi lần 1 ngõ vào, 2 ngõ vào, hay 4 ngõ vào, tùy theo sự thiết lập của các bit CHPS trong thanh ghi ADCON2. dsPIC30F2010 có thể lấy mẫu cả 4 kênh một lần nhờ vào sự hiện diện của 4 bộ S/H (Sample and Hold), được ký hiệu là CH0 đến CH3 trong sơ đồ nêu trên. Dù bạn lấy mẫu kiểu nào đi nữa, mỗi tín hiệu được lấy mẫu đều được xử lý bởi cùng một bộ chuyển đổi A/D. Để chuyển đổi 6 ngõ vào AN0 đến AN5, bạn sẽ phải lấy mẫu 6 ngõ vào đó theo một thứ tự nào đó (phù hợp với sự bố trí các chân analog đến các bộ S/H), và lần lượt chuyển đổi các tín hiệu đã được lấy mẫu đó. Ví dụ, bạn có thể chỉ dùng một bộ S/H CH0 và lần lượt lấy mẫu, sau đó chuyển đổi các ngõ vào AN0 đến AN5. Hoặc bạn có thể dùng 2 bộ S/H CH0 và CH1, để cùng lúc lẫy mẫu AN0 và AN1, sau đó lần lượt chuyển đổi các ngõ vào này, rồi sau đó thiết lập để dùng 4 bộ S/H từ CH0 đến CH3, để cùng lúc lấy mẫu AN2 đến AN5, và sau đó lần lượt chuyển đổi các ngõ vào này. Với mỗi cách thực hiện, code để hiện thực sẽ có sự thay đổi tương ứng. Đề nghị bạn đọc thêm về bộ ADC 10-bit trong tài liệu "dsPIC30F Family Reference Manual" (mã của tài liệu là DS70046) trước khi đặt tiếp câu hỏi (điều này sẽ giúp bạn hiểu được những câu trả lời). Thân, |
Trích:
Trong ví dụ 5-1 của tôi, việc thiết lập postscale khiến cho 1 PWM Special Event Trigger được tạo ra sau mỗi 16 chu kỳ PWM, để kích hoạt việc chuyển đổi A/D. Về câu hỏi liên quan đến duty cycle, bạn xem hình 14-4 trong datasheet của dsPIC30F2010. Thân, |
Trích:
Em dùng biến trở chỉnh điện áp tại chân RB0(AN0) là 1V thì theo lí thuyết , khi đó giá trị mình thu được tại thanh ghi ADCBUF0 là: 1x(2^10 - 1) / 5 = 204.6 hay là 11001101B sau lệnh dịch bit qua phải và gắn vào giá trị này vào PDC1 thì PDC1 = 102, mà duty_cycle = 2 * PDC1 / PTPER, mà ở đây PTPER = Fcy/Fpwm - 1 , với Fcy= 10Mhz ( do em dung thạch anh ngoài 10Mhz với PLL_4), Fpwm = 40Khz => PTPER = 249 Vậy duty_cycle = 2 * 102 / 249 = 0.8193 = 81.93 %, do đó khi dùng VOM để đo trên chân PWML ( RE0 ) thì điện áp DC phải là : (1 - 0.8193 ) * 5V = 0.9035 V. Mà em đo thực tế lại là : 3.1 V !!!! Em hiểu như vậy có đúng không Thầy , hay lỗi do đâu thầy ? Em cảm ơn . Trân trọng !. |
Trích:
Với PWM timer chạy ở chế độ free-running (như trong ví dụ của tôi đã thiết lập), công thức tính duty cycle như sau: duty_cycle = PDCx/((PTPER + 1)*2) Do đó, với các thông số mà bạn đã thiết lập, bạn sẽ có duty cycle của chân PWM1H là 102/((249 + 1)*2) = 20.4 %, và duty cycle của chân PWM1L sẽ là 100 - 20.4 = 79.6 %, tương ứng với khoảng 4 V, nếu hoàn toàn không có dead time. Có lẽ kết quả chuyển đổi A/D là khác với giá trị 204 hay 205 đang dùng để tính toán ở đây. Thân, |
Trong dsPic30 farmily reference ... ở phần PWM có nói cách thiết lập chế độ hoạt động của PWM thông qua các bits PTMOD<1:0> ở thanh ghi PTCON là:
" PTMOD<1:0>: PWM Time Base Mode Select bits 11 = PWM time base operates in a continuous up/down mode with interrupts for double PWM updates 10 = PWM time base operates in a continuous up/down counting mode 01 = PWM time base operates in single event mode 00 = PWM time base operates in a free running mode " Thầy Nam hoặc anh em nào trong diễn đàn hiểu rõ về các MOD hoạt động này ảnh hưởng như thế nào tơi PWM như công thức tính duty_cycle .... chỉ cho mình với ? Cảm ơn nhiều ! Trân trọng !. |
Trích:
Duty_cycle là khoảng phần trăm thời gian HIGHT trong một chu kỳ đối với chân PWMxH , còn đối với PWMxL thì dutycycle lại là khoảng phần trăm thời gian LOW (với giả sử deadtime = 0) KHI TA ĐANG DÙNG pwm Ở MODE complementary , còn PWM ở MODE independence thì duty_cycle cũng là khoảng phần trăm thời gian HIGHT trong một chu kỳ đối với chân PWMxL hay chân PWMxH (tùy vào chân nào được set). Tại em đo thực tế thấy như vậy, Trân trọng !. |
Display Duty_cycle of PWM on PC by using UART and ADC comunication
1 Attachment(s)
Đây là project mình làm sau khi đọc 2 TUTO của Thầy Nam (namnq) là UART và PWM - ADC , ở đây mình kết hợp 3 module này lại với nhau để hiện thị thông số của PWM (duty_cycle) lên PC sau khoảng thời gian 1ms , và duty_cycle được điều khiển bởi điện áp tại chân RB0 thông qua biến trở, các bạn tham khảo nha, có gì thì cùng trao đổi, Project này đã chạy thực tế rồi (mình dùng dsPic30f2010 nhưng con này không khác con 30f4012 gì cả).
Trân trọng !. |
anh Nam ơi, xem hộ em lỗi này là sao ạ :
c:\program files\microchip\mplab c30\bin\pic30-coff-ld.exe Error: A heap is required, but has not been specified Link step failed. em đã có đủ những tập tin cần thiết rồi mà nó vẫn báo vậy. |
Trích:
http://www.picvietnam.com/forum/showthread.php?p=2663 Thân, |
Em đang làm việc với con dspic30f4011. Em đang làm 1 bài toán là đo nhiệt độ rồi hiển thị lên lcd. anh có thể nói cho em về phần xử lí số liệu lấy ra từ module ADC để đưa lên LCD để hiển thị nhiệt độ ko anh ? Em dùng lm35 đó.
|
Trích:
Nguyên tắc chung: bạn xác định dải nhiệt độ cần đo, xác định dải điện áp ra tương ứng và xử lý để nó tận dụng dải điện áp analog mà PIC/dsPIC có thể đọc. Từ đó, xác định công thức chuyển đổi từ kết quả A/D và nhiệt độ thực. Việc còn lại chỉ là đưa chuỗi ký tự ra LCD. Thân, |
Múi giờ GMT. Hiện tại là 10:55 AM. |
Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam