PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > PIC - Thiết kế và Ứng dụng

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

PIC - Thiết kế và Ứng dụng Ý tưởng cho các sản phẩm sử dụng PIC/dsPIC và các sản phẩm của Microchip

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 15-01-2010, 03:28 AM   #1
Lehoangel
Nhập môn đệ tử
 
Tham gia ngày: Dec 2009
Bài gửi: 3
:
Điều khiển động cơ bằng PWM

Mình thử làm 1 mạch dk động cơ trên Proteus để test thử hoạt động của PWM.
Không rõ code sai ở đâu mà khi chạy thử, dù đã set duty cho pwm1 = 0 mà chân C2 vẫn có tín hiệu ra và động cơ vẫn quay.
Nếu mình thay 0 bằng 1 giá trị khác tốc độ quay động cơ vẫn không thay đổi.
Mọi người xem giúp thử với. Thanks.

void main()
{

setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);

output_low(PIN_C2); // Set CCP1 output low
output_low(PIN_C3); // Set CCP2 output low

output_high(PIN_C4); // Enable ENA
output_low(PIN_C5); // Disable ENB

setup_ccp1(CCP_PWM); // Configure CCP1 as a PWM
setup_ccp2(CCP_PWM); // Configure CCP2 as a PWM

setup_timer_2(T2_DIV_BY_16, 255, 1);

while(1){

set_pwm1_duty(0);

}
}
Lehoangel vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 15-01-2010, 11:35 AM   #2
nhanh0112
Đệ tử 4 túi
 
Tham gia ngày: May 2007
Bài gửi: 81
:
Code:
void main()
{
   setup_timer_2(T2_DIV_BY_16,255,1);
   setup_ccp1(CCP_PWM);
   set_pwm1_duty(50);gia tri thay doi tu 0-255 (nho hon hoac bang period)
while(true);
}
Bạn chỉ cần viết thế này là đủ cho PWM của chân CCP1

thay đổi nội dung bởi: nhanh0112, 15-01-2010 lúc 11:55 AM.
nhanh0112 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 15-01-2010, 11:34 PM   #3
Lehoangel
Nhập môn đệ tử
 
Tham gia ngày: Dec 2009
Bài gửi: 3
:
Hi, mình đã làm thử như bạn nhưng vẫn không thấy động cơ thay đổi theo value mà mình định sẵn. Đây là mạch mình dùng để chạy thử, các bạn xem có thiết kế sai ở đâu không mà mình chạy demo ko đc.

@P/s: Đã test lại và làm đc, cám ơn bạn nhanh0112 nhé

thay đổi nội dung bởi: Lehoangel, 17-01-2010 lúc 01:38 AM.
Lehoangel vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 26-01-2010, 11:53 PM   #4
chiene
Đệ tử 1 túi
 
Tham gia ngày: Mar 2009
Bài gửi: 20
:
Em cũng gặp vấn đề với PWM rất cần dc mọi người giúp đỡ. Em định dùng 1 biến trở để điều khiển lối ra độ rộng xung, ko hiểu chương trình bị sai ở đâu hay phải mô phỏng ntn? Mà em ko thấy có tín hiệu gì ở lối ra (chân 17 của PIC, tức RC2) nối vào dao động ký và trực tiếp vào 1 mô tơ, mô tơ ko thấy chạy cũng ko quan sát thấy gì trên dao động ký. Mọi người xem giúp em với, em cảm ơn trc!
Đây là chương trình của em:

#include <16f877.h>
#fuses HS,noPROTECT,noWDT,noPUT,noBROWNOUT,nolvp,nowrt
#use delay(clock=20000000)

main()
{
int8 value;

setup_port_a(ALL_ANALOG);
setup_adc(adc_clock_internal);
set_adc_channel( 0 );

setup_ccp1(CCP_PWM); // Configure CCP1 as a PWM
setup_timer_2(T2_DIV_BY_1, 255, 1);

while( TRUE ) {
value=read_adc();
set_pwm1_duty(value);
}
}

thay đổi nội dung bởi: chiene, 27-01-2010 lúc 12:11 AM.
chiene vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 27-01-2010, 08:55 AM   #5
nhanh0112
Đệ tử 4 túi
 
Tham gia ngày: May 2007
Bài gửi: 81
:
Trích:
Nguyên văn bởi chiene View Post
Em cũng gặp vấn đề với PWM....
Có mất vẫn đề như thế này. Trước khi bạn làm kết hợp với ADC (sử dụng biến trở như bạn nói) thì bạn nên làm thử với 1 giá trị cố định (với đoạn code mà mọi người đã làm đc ở trên), và chắc chắn rằng "mô tơ" của bạn chạy (nghĩa là code chạy ổn). Sau đó mới viết thêm phần ADC.
Về phần ADC của bạn thì bạn nên khai báo cấu hình bạn đâu là sử dụng 8bit hay 10 bit. ví dụ.
Code:
#include <12F683.h>
#device adc=10
//#device adc=8
Nếu là 8 bit (0-255) thì bạn có thể sử dụng trong trường hợp trên.
Nếu là 10 bit (0-1023). các giá trị của bạn chỉ nhận từ 0-255 các giá trị còn lại tương ứng với đầu ra là 1 hết (nghĩa là biến trở chỉ có tác dụng trong 1 khoảng nhỏ).
nhanh0112 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 27-01-2010, 10:00 AM   #6
chiene
Đệ tử 1 túi
 
Tham gia ngày: Mar 2009
Bài gửi: 20
:
Em đã sửa lại chương trình như phần trên của bác, nhưng vẫn ko dc:
#include <16F877A.h>
#device adc=8
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, WRT_50%
#use delay(clock=20000000)

void main()
{
setup_timer_2(T2_DIV_BY_16,255,1);
setup_ccp1(CCP_PWM);
set_pwm1_duty(50); //gia tri thay doi tu 0-255 (nho hon hoac bang period)
while(true);
}

Em mô phỏng bằng Proteus, nối trực tiếp 1 mô tơ (có 2 chân) vào chân RC2, chân kia nối đất. Nhưng nó ko chạy gì hết, mà Proteus thì lúc nào cũng báo chân RC2 màu xanh. Em đã thử thay đổi giá trị duty thành vài giá trị khác (150, 200) cũng ko thấy thay đổi gì.
Các bác giúp em với, có thể dc thì gửi hộ em 1 chương trình đơn giản nhất (nếu kèm theo luôn file Proteus trong 1 thư mục để mô phỏng luôn thì càng tốt) để tạo ra tín hiệu PWM làm quay động cơ.
Nếu gặp khó khăn khi tải file lên diễn đàn thì gửi trực tiếp file vào mail cho em với: chien2607@gmail.com
Xin đa tạ các bác!
chiene vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 27-01-2010, 10:14 AM   #7
thuyhutfet88
Đệ tử 2 túi
 
Tham gia ngày: Jan 2009
Bài gửi: 34
:
Bạn đang làm với trình Complier gi vậy?
Mà trình biên dịch gì theo mình cũng vậy thui.Trong khi viết trương trình nên ấn F1 để xem file Help của nó.Có như vậy viết sẽ ko bao giờ sai!
ở chỗ set_pwm1_duty(50) .Nếu là như thế này thì áp ra rất bé.Có thể chưa đủ để làm động cơ quay dc đâu bạn ạ!Banthử set_pwm1_duty(200) trở lến Xem sao!
Chúc thành công!
thuyhutfet88 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 27-01-2010, 11:02 AM   #8
chiene
Đệ tử 1 túi
 
Tham gia ngày: Mar 2009
Bài gửi: 20
:
Trích:
Nguyên văn bởi thuyhutfet88 View Post
Bạn đang làm với trình Complier gi vậy?
Mà trình biên dịch gì theo mình cũng vậy thui.Trong khi viết trương trình nên ấn F1 để xem file Help của nó.Có như vậy viết sẽ ko bao giờ sai!
ở chỗ set_pwm1_duty(50) .Nếu là như thế này thì áp ra rất bé.Có thể chưa đủ để làm động cơ quay dc đâu bạn ạ!Banthử set_pwm1_duty(200) trở lến Xem sao!
Chúc thành công!
Em dùng CCSC mà. Em biết cái phím F1 mà, vấn đề là đã tìm kỹ lắm mà ko thấy sai, nên em mới lên diễn đàn hỏi mọi người. Em cũng chưa có nhiều kinh nghiệm rất mong dc giúp đỡ. Em rất cần 1 chương trình mẫu đơn giản nhất để chạy thử. Giúp em với
chiene vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 27-01-2010, 10:31 PM   #9
chiene
Đệ tử 1 túi
 
Tham gia ngày: Mar 2009
Bài gửi: 20
:
Trích:
Nguyên văn bởi chiene View Post
Em đã sửa lại chương trình như phần trên của bác, nhưng vẫn ko dc:
#include <16F877A.h>
#device adc=8
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, WRT_50%
#use delay(clock=20000000)

void main()
{
setup_timer_2(T2_DIV_BY_16,255,1);
setup_ccp1(CCP_PWM);
set_pwm1_duty(50); //gia tri thay doi tu 0-255 (nho hon hoac bang period)
while(true);
}

Em mô phỏng bằng Proteus, nối trực tiếp 1 mô tơ (có 2 chân) vào chân RC2, chân kia nối đất. Nhưng nó ko chạy gì hết, mà Proteus thì lúc nào cũng báo chân RC2 màu xanh. Em đã thử thay đổi giá trị duty thành vài giá trị khác (150, 200) cũng ko thấy thay đổi gì.
Các bác giúp em với, có thể dc thì gửi hộ em 1 chương trình đơn giản nhất (nếu kèm theo luôn file Proteus trong 1 thư mục để mô phỏng luôn thì càng tốt) để tạo ra tín hiệu PWM làm quay động cơ.
Nếu gặp khó khăn khi tải file lên diễn đàn thì gửi trực tiếp file vào mail cho em với: chien2607@gmail.com
Xin đa tạ các bác!
Mọi người giúp em với! Em đang cần gấp lắm ạ, em xin cảm ơn rất nhiều
chiene vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 28-01-2010, 01:04 AM   #10
nhanh0112
Đệ tử 4 túi
 
Tham gia ngày: May 2007
Bài gửi: 81
:
Trích:
Nguyên văn bởi chiene View Post
Mọi người giúp em với! Em đang cần gấp lắm ạ, em xin cảm ơn rất nhiều
Dưới đây là nguyên văn đoạn code PWM để tạo ra xung 38kHz (đã là thử thực tế)
Code:
#include <16F88.h>
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES INTRC_IO                 //Internal RC Osc, no CLKOUT
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOMCLR                   //Master Clear pin used for I/O
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOPROTECT                //Code not protected from reading
#FUSES FCMEN                    //Fail-safe clock monitor enabled
#FUSES IESO                     //Internal External Switch Over mode enable
#FUSES CCPB3                   //use pin B3 for CCP
#use delay(clock=4000000)

void main()
{
   setup_ccp1(CCP_PWM);
   setup_timer_2(T2_DIV_BY_1,25,1);
   set_pwm1_duty(14);
   while(true);
}
Bạn nên làm thử với mạch thực tế thì có lẽ rõ hơn (tui ít làm với mô phỏng, nên ko rõ về khả năng của các linh kiện trong đó). Trong trường hợp mô phỏng như vậy bạn thử thay bằng led hoặc một chiếc osilo scope để kiểm tra xung ra xem
nhanh0112 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 28-01-2010, 09:19 AM   #11
chiene
Đệ tử 1 túi
 
Tham gia ngày: Mar 2009
Bài gửi: 20
:
Trích:
Nguyên văn bởi nhanh0112 View Post
Dưới đây là nguyên văn đoạn code PWM để tạo ra xung 38kHz
Bạn nên làm thử với mạch thực tế thì có lẽ rõ hơn (tui ít làm với mô phỏng, nên ko rõ về khả năng của các linh kiện trong đó). Trong trường hợp mô phỏng như vậy bạn thử thay bằng led hoặc một chiếc osilo scope để kiểm tra xung ra xem
Em đã thử mô phỏng chương trình của bác mà vẫn ko thấy động cơ chạy, nối vào oscilosope cũng ko thấy tín hiệu gì. Ko rõ thằng Proteus nó có mô phỏng dc cho trường hợp này ko?
Em sẽ thử trên mạch thật xem sao. Thanks bác!

PS: Đã thử trên mạch thật thấy chạy tốt ko có vd gì => ko nên tin tưởng trình mô phỏng :d

thay đổi nội dung bởi: chiene, 30-01-2010 lúc 12:20 AM.
chiene vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 30-01-2010, 07:52 AM   #12
hangocminh1989
Đệ tử 6 túi
 
Tham gia ngày: Apr 2009
Bài gửi: 132
:
em vẫn không hiểu rút cục là ở cú pháp của pwm cần khởi tạo những thông số như thế nào?ý nghĩa từng thông số làm gì????mệt quá,help me.thank cả nhà nhiều
hangocminh1989 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 31-01-2010, 08:58 PM   #13
nhanh0112
Đệ tử 4 túi
 
Tham gia ngày: May 2007
Bài gửi: 81
:
Trích:
Nguyên văn bởi hangocminh1989 View Post
em vẫn không hiểu rút cục là ở cú pháp của pwm cần khởi tạo những thông số như thế nào?ý nghĩa từng thông số làm gì????mệt quá,help me.thank cả nhà nhiều
Theo tui hiểu nôm na là thế này
Code:
setup_ccp1(CCP_PWM);
Cho phép PWM
Code:
setup_timer_2(T2_DIV_BY_1,25,1);
Cấu hình cho Timer2 (cái này bạn xem lại). Từ 0 đến tràn tương ứng với một chu kỳ xung ra
Code:
set_pwm1_duty(14);
Là tham số để thiết lập xung chuyển từ mức 1 xuống 0 (nằm trong khoảng 1 chu kỳ trên)
Code:
<-----period-------->
<-duty->
 ---------
           |        |
           |        |
            -------
Code:
setup_timer_2(mode,period,postscale)
.............
The cycle time will be    (1/clock)*4*t2div*(period+1)*postscale
.............
T=1/4000000*4*1(25+1)*1=0.000026
f=1/T=38.461kHz
nhanh0112 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 02-02-2010, 12:44 AM   #14
Lehoangel
Nhập môn đệ tử
 
Tham gia ngày: Dec 2009
Bài gửi: 3
:
Làm theo 3 câu lệnh như cậu Nhanh0112 giải thích là đủ để lập trình cho pwm rồi. Nếu vẫn không điều khiển đc động cơ là do giả lập proteus có vấn đề, hoặc do bạn lắp mạch chưa đúng. Trước mình không làm giả lập đc trên proteus nhưng cho nguyên code vào mạch thật động cơ thật thì robot chạy hối hả. Nếu chiene không có điều kiện thực hành mạch thật ngay bh thì post mạch giả lập của bạn lên xem có gì mọi người sửa cho
Lehoangel vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 03-02-2010, 08:16 AM   #15
trongtienk43
Nhập môn đệ tử
 
Tham gia ngày: Sep 2009
Bài gửi: 8
:
các bác cho em hỏi 2 cái này có ý nghĩa và tác dụng như thế nào?
setup_timer_2(T2_DIV_BY_16,255,1);
setup_ccp1(CCP_PWM);
trongtienk43 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:00 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