PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Các ngôn ngữ lập trình khác (CCS C, HT PIC,...) (http://www.picvietnam.com/forum/forumdisplay.php?f=12)
-   -   Pwm (http://www.picvietnam.com/forum/showthread.php?t=885)

tranvu_hop 24-01-2007 10:04 AM

Pwm
 
Em có 2 cách viết như thế này để điều khiển công suất động cơ mức 50 %

C1:
setup_ccp1(CCP_PWM); // Configure CCP1 as a PWM
setup_timer_2(T2_DIV_BY_16, 249, 1);
set_pwm1_duty(500L);

C2:
setup_ccp1(CCP_PWM); // Configure CCP1 as a PWM
setup_timer_2(T2_DIV_BY_16, 249, 1);
set_pwm1_duty(125);

cách nào đúng??

namqn 24-01-2007 06:32 PM

Trích:

Nguyên văn bởi tranvu_hop (Post 7013)
Em có 2 cách viết như thế này để điều khiển công suất động cơ mức 50 %

C1:
setup_ccp1(CCP_PWM); // Configure CCP1 as a PWM
setup_timer_2(T2_DIV_BY_16, 249, 1);
set_pwm1_duty(500L);

C2:
setup_ccp1(CCP_PWM); // Configure CCP1 as a PWM
setup_timer_2(T2_DIV_BY_16, 249, 1);
set_pwm1_duty(125);

cách nào đúng??

Cách 1 đúng. Sao không chạy thử chương trình trên chip thật?

Thân,

tranvu_hop 25-01-2007 08:51 AM

Em muốn hỏi là tại sao fải để là
set_pwm1_duty(500L)
500L, nếu bỏ L đi thì sao, em chưa hiểu chỗ này. Mong các anh chỉ đáp

nhh 25-01-2007 10:51 AM

Trích:

Nguyên văn bởi tranvu_hop (Post 7029)
Em muốn hỏi là tại sao fải để là
set_pwm1_duty(500L)
500L, nếu bỏ L đi thì sao, em chưa hiểu chỗ này. Mong các anh chỉ đáp

Lệnh set_pwm1_duty(value); dùng xác định duty cho xung PWM trên chân CCP1.

Tùy theo kiểu của value mà cách tính khác nhau.

- Nếu value là giá trị kiểu int 8bit thì CCS C sẽ dịch trái 2 bit để đủ 10bit

Công thức tính: %duty = value/(PR2 +1)*100%

- Nếu value là giá trị long int 16bit thì CCS C sẽ bỏ đi 4 bit cao

Công thức tính: %duty = (value & 1023)/(4*(PR2 +1))*100%

Chú ý rằng nếu bác set giá trị duty vượt quá 100%, thì ôi thôi chân điều chế xung nó không bị xóa về mức thấp nữa.

Hai đoạn code sau đều cho giá trị duty 50% trên chân CCP1:
Code:

int value = 128;
setup_ccp1(CCP_PWM);
setup_timer_2(T2_DIV_BY_16, 255, 1);
set_pwm1_duty(value);

Code:

int16 value = 512;
setup_ccp1(CCP_PWM);
setup_timer_2(T2_DIV_BY_16, 255, 1);
set_pwm1_duty(value);

Hôm sau sẽ gởi cho mấy bác chương trình tính toán pwm trực quan, đơn giản nhưng hiệu quả.

tranvu_hop 25-01-2007 06:10 PM

Cảm ơn bạn đã trả lời, câu trả lời của bạn dễ hiểu quá !

namqn 25-01-2007 06:19 PM

Cám ơn bạn nhh!

Tôi không dùng CCS C nên không trả lời tốt như những bạn đã dùng CCS C nhiều. Mong các bạn hỗ trợ cho các thành viên trên diễn đàn hơn nữa, vì riêng một ai đó đều không thể hỗ trợ mọi thứ thật tốt được.

Thân,

nhh 27-01-2007 09:46 AM

1 Attachment(s)
http://i82.photobucket.com/albums/j2.../CCS_C_PWM.gif

tranvu_hop 27-01-2007 08:39 PM

Trích:

Nguyên văn bởi nhh (Post 7066)

Đang ký cái file *.ocx như thế nào ấy nhỉ ?
Nếu ko máy ko nhân ?
Nó báo thiếu file Comctl32.ocx

nhh 28-01-2007 06:36 PM

Chương trình viết bằng VB, bạn cài VB thì OK, nếu ko xem thiếu các file cần thiết nào thì tìm đặt vào cùng thư mục đó.

che 22-06-2007 11:20 PM

em mới gia nhập gia đình Pic,em thấy các bài viết của bác nhh rất hay,dễ hiểu ,em mới mua được con 18F4431 để điều khiển 2 động cơ một chiều từ máy tính,nếu bác đã làm con này rồi thì xin bác cho em một số lưu ý về nó nhé để em làm nhanh hơn ,khỏi mò mẫm lâu lắm bác ạ. thanks bác !

hvktdk9 12-07-2007 05:12 PM

Trong chương trình bạn đã khai báo cấu hình cho Pic là cho phép sử dụng chế độ PWM chưa. Cái này rất quan trọng trong việc sử dụng PWM.

tmtm 08-10-2007 04:36 PM

Các anh chỉ giúp em các thông số trong dòng lệnh:
setup_timer_2(T2_DIV_BY_16, 255, 1);
có nghĩa gì? E chưa hiểu? và nếu lập trình để điều chỉnh tốc độ động cơ DC thay đổi trơn từ một giá trị này tới một giá trị khác thì phải viết thế nào? và thay đổi tốc đọ nhảy cấp thì làm thế nào?

Nguoidumuc204 10-10-2007 11:44 AM

Các bác cho em hỏi là tại sao chương trình em viết thế này mà không chạy,
Em mới ra nhập làng PIC nên chưa hiểu rõ lắm.
Trích:

Nguyên văn bởi Code
#include <16F877.h>
#use delay(clock = 4000000)
#include <lcd.c>
#FUSES NOWDT , HS , NOPROTECT

unsigned char i=0 ;
int16 a ,b;

#int_TIMER0
void TIMER10_isr(void)
{
i++;
if (i>=255) i=0;
}

void main()
{
lcd_init();
delay_us(10);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_4);
while(1)
{
TIMER1_isr();
lcd_gotoxy(1,1);
printf(lcd_putc," timer is : %u",i);
}
}

Kết quả là màn hình LCD trắng rã ,chẳng nhìn thấy gì thay đổi cả.

tmtm 17-10-2007 06:10 PM

Câu hỏi của em thiếu 'Iốt' quá hay sao mà chẳng thấy ai thèm bắt nhời cả vậy. Anh nào giúp em đi, được ý nào, em cảm ơn ý đó!

Mr.Bi 18-10-2007 12:33 AM

thạch anh 4M thì khai báo là XT chứ ko phải là HS bạn ơi !


Múi giờ GMT. Hiện tại là 11:56 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