![]() |
Đ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); } } |
Code:
void main() |
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é :) |
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); } } |
Trích:
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> 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ỏ). |
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! |
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! |
Trích:
|
Trích:
|
Trích:
Code:
#include <16F88.h> |
Trích:
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 |
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
|
Trích:
Code:
setup_ccp1(CCP_PWM); Code:
setup_timer_2(T2_DIV_BY_1,25,1); Code:
set_pwm1_duty(14); Code:
<-----period--------> Code:
setup_timer_2(mode,period,postscale) f=1/T=38.461kHz |
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 :)
|
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); |
Múi giờ GMT. Hiện tại là 06:21 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