![]() |
|
Tài trợ cho PIC Vietnam |
Cơ bản về vi điều khiển và PIC Những bài hướng dẫn cơ bản nhất để làm quen với vi điều khiển PIC |
![]() |
|
Ðiều Chỉnh | Xếp Bài |
![]() |
#31 |
Đệ tử 7 túi
Tham gia ngày: Jul 2007
Nơi Cư Ngụ: Đà Nẵng
Bài gửi: 188
: |
thêm vào dòng #byte PORTB=0x06
|
![]() |
![]() |
![]() |
#32 |
Đệ tử 2 túi
Tham gia ngày: Dec 2008
Bài gửi: 33
: |
|
![]() |
![]() |
![]() |
#33 |
Đệ tử 3 túi
Tham gia ngày: Feb 2009
Bài gửi: 47
: |
|
![]() |
![]() |
![]() |
#34 |
Đệ tử 3 túi
Tham gia ngày: Jan 2009
Bài gửi: 52
: |
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! thay đổi nội dung bởi: xuanhiendk2, 10-07-2009 lúc 09:31 PM. |
![]() |
![]() |
![]() |
#35 | ||
Đệ tử 2 túi
Tham gia ngày: Dec 2008
Bài gửi: 33
: |
Trích:
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:
|
||
![]() |
![]() |
![]() |
#36 |
Đệ tử 3 túi
Tham gia ngày: Jan 2009
Bài gửi: 52
: |
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?
|
![]() |
![]() |
![]() |
#37 |
Đệ tử 3 túi
Tham gia ngày: Jan 2009
Bài gửi: 52
: |
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.
|
![]() |
![]() |
![]() |
#38 |
Đệ tử 4 túi
Tham gia ngày: May 2009
Bài gửi: 74
: |
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); } } }] |
![]() |
![]() |
![]() |
|
|