PDA

View Full Version : Việc dùng PWM trong pic 16f877a


manhha2799
13-02-2008, 11:39 PM
Các bác cho em hỏi;
+ Mình có thể dùng chân ccp1 để tạo xung PWM cho động cơ 1 chạy, và dùng chân ccp1 này để tạo xung PWM cho động cơ 2 chạy không. Với điều kiện khi tạo động cơ 1 chạy thì động cơ 2 không chạy và ngược lại. Em tính dùng chân CCP1 tạo xung + ngắt cạnh lên H_TO_L cho động cơ 1, và tạo xung + ngắt cạnh xuống L_TO_H cho động cơ 2 được không.
Xin các bác nào có kinh nghiệm trả lời.

manhha2799
13-02-2008, 11:53 PM
void dongco1(int8 speed1)
{
setup_ccp1(CCP_PWM_H_L); // Configure CCP1 as a PWM
setup_timer_2(T2_DIV_BY_16, 255,1);
set_pwm1_duty (speed1); tốc độ động cơ 1
}
void dongco2(int8 speed2)
{
setup_ccp1(CCP_PWM_L_H); // Configure CCP1 as a PWM
setup_timer_2(T2_DIV_BY_16, 255,1);
set_pwm1_duty (speed2); tốc độ động cơ 2
}
Khi dùng cho động cơ nào em gọi hàm động cơ đó. Không biết như thế này có được không?

namqn
14-02-2008, 12:35 AM
Các bác cho em hỏi;
+ Mình có thể dùng chân ccp1 để tạo xung PWM cho động cơ 1 chạy, và dùng chân ccp1 này để tạo xung PWM cho động cơ 2 chạy không. Với điều kiện khi tạo động cơ 1 chạy thì động cơ 2 không chạy và ngược lại.
Tất nhiên là được, vì xét về bản chất, tại bất kỳ thời điểm nào, bạn cũng chỉ cần 1 tín hiệu PWM.
Em tính dùng chân CCP1 tạo xung + ngắt cạnh lên H_TO_L cho động cơ 1, và tạo xung + ngắt cạnh xuống L_TO_H cho động cơ 2 được không.
Xin các bác nào có kinh nghiệm trả lời.
Đây là một trong những cách khả thi. Tất nhiên về phía đầu vào thì bạn phát hiện cạnh để chọn động cơ được cấp PWM, nhưng phía đầu ra của PIC bạn cũng nên dùng thêm ngõ ra để hiện thực việc lái tín hiệu PWM đến động cơ cần được truyền động.

Thân,

namqn
14-02-2008, 12:37 AM
void dongco1(int8 speed1)
{
setup_ccp1(CCP_PWM_H_L); // Configure CCP1 as a PWM
setup_timer_2(T2_DIV_BY_16, 255,1);
set_pwm1_duty (speed1); tốc độ động cơ 1
}
void dongco2(int8 speed2)
{
setup_ccp1(CCP_PWM_L_H); // Configure CCP1 as a PWM
setup_timer_2(T2_DIV_BY_16, 255,1);
set_pwm1_duty (speed2); tốc độ động cơ 2
}
Khi dùng cho động cơ nào em gọi hàm động cơ đó. Không biết như thế này có được không?
Bạn xem gợi ý ở post trên của tôi. Việc CCP module tạo ngắt khi chuyển từ cao xuống thấp hay từ thấp lên cao không liên quan đến việc lái tín hiệu PWM đến động cơ ở mạch ngoài. Bạn cần hiện thực thêm logic lái tín hiệu PWM đến động cơ cần được truyền động.

Thân,

anh_gioi
14-02-2008, 06:48 PM
Bạn xem gợi ý ở post trên của tôi. Việc CCP module tạo ngắt khi chuyển từ cao xuống thấp hay từ thấp lên cao không liên quan đến việc lái tín hiệu PWM đến động cơ ở mạch ngoài. Bạn cần hiện thực thêm logic lái tín hiệu PWM đến động cơ cần được truyền động.

Thân,

cho em hỏi câu này,(anh thong cảm vì em đã hỏi câu này rùi nhưng em chưa đọc câu trả lời mà cũng ko bít ở bài nào):
em có thể làm 1 chân pic bình thường thành 1 chân có điều xung có được ko ạ(đc hay ko thôi ạ?)

namqn
14-02-2008, 06:52 PM
cho em hỏi câu này,(anh thong cảm vì em đã hỏi câu này rùi nhưng em chưa đọc câu trả lời mà cũng ko bít ở bài nào):
em có thể làm 1 chân pic bình thường thành 1 chân có điều xung có được ko ạ(đc hay ko thôi ạ?)
Được, tất nhiên khả năng của nó không mạnh như chân PWM của một module ngoại vi.

Thân,

anh_gioi
14-02-2008, 06:55 PM
Được, tất nhiên khả năng của nó không mạnh như chân PWM của một module ngoại vi.

Thân,

như vậy ko biết giải thuật của nó có khó khăn không ạ.chẳng là em chỉ có con 16F877A mà cần 3 chân điều xung nên mới cần như vậy.
nếu anh có doạn mã code cho em thì hay quá.
thank anh nhìu

namqn
14-02-2008, 07:12 PM
như vậy ko biết giải thuật của nó có khó khăn không ạ.chẳng là em chỉ có con 16F877A mà cần 3 chân điều xung nên mới cần như vậy.
nếu anh có doạn mã code cho em thì hay quá.
thank anh nhìu
Giải thuật thì đơn giản chứ không phức tạp lắm, tuy nhiên, bạn nên nêu vấn đề cụ thể của bạn một cách chi tiết hơn. Trong một số trường hợp nhất định thì bạn không cần tạo thêm chân điều chế độ rộng xung. Điều quan trọng là tại một thời điểm bất kỳ thì bạn cần có bao nhiêu tín hiệu PWM khác nhau, thông tin này cần được xác định theo mạch công suất của bạn.

Thân,

anh_gioi
20-02-2008, 10:50 PM
Em có ý kiến thế này.em dùng con 16F877A để điều khiển 3 động cơ cùng 1 lúc bằng cách dùng 2 chân pwm của PIC :
em hỏi la có thể dùng 1 chân pwm để điều khiển 1 lúc 2 động cơ được ko?khi điều khiển 1 động cơ riêng lẻ thì qua 1 con (như dạng phân kênh) đc ko ạ?

namqn
21-02-2008, 01:47 AM
Em có ý kiến thế này.em dùng con 16F877A để điều khiển 3 động cơ cùng 1 lúc bằng cách dùng 2 chân pwm của PIC :
em hỏi la có thể dùng 1 chân pwm để điều khiển 1 lúc 2 động cơ được ko?khi điều khiển 1 động cơ riêng lẻ thì qua 1 con (như dạng phân kênh) đc ko ạ?
Bạn có thể dùng cùng 1 tín hiệu PWM để điều khiển n động cơ khác nhau, với điều kiện là chúng sử dụng cùng độ rộng và tần số xung nếu chạy đồng thời. Nếu trong một khoảng thời gian bất kỳ nào chỉ có 1 trong số n động cơ đó cần được truyền động thì không có điều kiện ràng buộc gì cả.

Thân,

anh_gioi
21-02-2008, 02:52 AM
#include "C:\Documents and Settings\anh gioi\Desktop\dieu xung\dieu xung02.h"
#use fast_io(b)
#byte portb = 0x06
void ccp1(){
int8 a;
setup_timer_2(T2_DIV_BY_1,255,1);
SETUP_CCP1(CCP_PWM);

while(true){
for(a=1;a<1024;a++){
set_pwm1_duty(a);
delay_ms(2);
}
delay_ms(20);
for(a=1023;a>1;a--){
set_pwm1_duty(a);
delay_ms(2);
}}}

void ccp2(void){
int b;

setup_timer_2(T2_DIV_BY_1,255,1);
SETUP_CCP2(CCP_PWM);

while(true){
for(b=1;b<1024;b++){
set_pwm1_duty(b);
delay_ms(2);
}
delay_ms(20);
for(b=1023;b>1;b--){
set_pwm1_duty(b);
delay_ms(2);
}}}
void main(){

void ccp1(void);
void ccp2(void);
set_tris_b(0xff);
while(true){
if(input(pin_b0)==0)
ccp1();
else
ccp2();
}


}

code này có chỗ nào sai vậy anh? em ko cho hiển thi ccp2 được???

namqn
21-02-2008, 05:38 AM
Trong phần code trên, trong các hàm ccp1() và ccp2() bạn dùng vòng lặp while(true) { ... }, điều này là không nên, vì khi bạn gọi một trong những hàm đó thì chương trình sẽ không thể trở về chương trình gọi (là main() trong trường hợp của bạn). while(1) { ... } hay while(true) { ... } chỉ nên được dùng trong main().

Ngoài ra, bạn xem lại trong ccp2(), bạn setup CCP2 xong lại thay đổi duty cycle của pwm1.

Thân,

anh_gioi
21-02-2008, 10:34 AM
ko dùng while() trong hàm ccp-->vâng.
anh có thể nói rõ hơn cái sai về hàm ccp2() của em được ko ạ? và em có thể dùng pwm2 được ko?(xloi anh vì em đợc datasheet nhưng chưa hỉu)

LeDuc
22-02-2008, 12:34 AM
ko dùng while() trong hàm ccp-->vâng.
anh có thể nói rõ hơn cái sai về hàm ccp2() của em được ko ạ? và em có thể dùng pwm2 được ko?(xloi anh vì em đợc datasheet nhưng chưa hỉu)

cai ham ccp2() của bạn sai ở chỗ bạn set nhầm duty của kênh ccp1 đó. đáng lẽ phải là " set_pwm2_duty(b);" chỉ vậy thôi.

LeDuc
22-02-2008, 01:04 AM
Tất nhiên là được, vì xét về bản chất, tại bất kỳ thời điểm nào, bạn cũng chỉ cần 1 tín hiệu PWM.

Đây là một trong những cách khả thi. Tất nhiên về phía đầu vào thì bạn phát hiện cạnh để chọn động cơ được cấp PWM, nhưng phía đầu ra của PIC bạn cũng nên dùng thêm ngõ ra để hiện thực việc lái tín hiệu PWM đến động cơ cần được truyền động.

Thân,

Nguyên văn bởi manhha2799
Các bác cho em hỏi;
+ Mình có thể dùng chân ccp1 để tạo xung PWM cho động cơ 1 chạy, và dùng chân ccp1 này để tạo xung PWM cho động cơ 2 chạy không. Với điều kiện khi tạo động cơ 1 chạy thì động cơ 2 không chạy và ngược lại.

Tất nhiên là được, vì xét về bản chất, tại bất kỳ thời điểm nào, bạn cũng chỉ cần 1 tín hiệu PWM.

Trích:
Nguyên văn bởi manhha2799
Em tính dùng chân CCP1 tạo xung + ngắt cạnh lên H_TO_L cho động cơ 1, và tạo xung + ngắt cạnh xuống L_TO_H cho động cơ 2 được không.
Xin các bác nào có kinh nghiệm trả lời.

Đây là một trong những cách khả thi. Tất nhiên về phía đầu vào thì bạn phát hiện cạnh để chọn động cơ được cấp PWM, nhưng phía đầu ra của PIC bạn cũng nên dùng thêm ngõ ra để hiện thực việc lái tín hiệu PWM đến động cơ cần được truyền động.

Thân,
Cho em hỏi cái này hơi chuối một chút , em ko hiểu "cách dùng chân CCP1 tạo xung + ngắt cạnh lên H_TO_L cho động cơ" là sao cả?.
Vậy ngắt này được tạo ra do đâu ? Có phài là ngắt của khối CCP kô ? nếu vậy thì chân ccp1 phải nhận được tín hiệu ngắt , sau khi có ngắt xảy ra nó sẽ tạo ra tín hiệu pwm phải ko ?
Nếu đúng như vậy thì khi có xung ngắt vào chân ccp , thì con lái (driver) mạch điều khiển động cơ cũng nhận được tín hiệu đó , như thế sẽ có ảnh hưởng đến việc điều khiển hả anh ?
#define CCP_PWM_H_H 0x0c
#define CCP_PWM_H_L 0x0d
#define CCP_PWM_L_H 0x0e
#define CCP_PWM_L_L 0x0f
trong ccs nó co chỉ như vậy nhưng em kô hiểu , rất mong các anh chỉ giúp ..
Thanks for all !!

LeDuc
22-02-2008, 01:07 AM
Tất nhiên là được, vì xét về bản chất, tại bất kỳ thời điểm nào, bạn cũng chỉ cần 1 tín hiệu PWM.

Đây là một trong những cách khả thi. Tất nhiên về phía đầu vào thì bạn phát hiện cạnh để chọn động cơ được cấp PWM, nhưng phía đầu ra của PIC bạn cũng nên dùng thêm ngõ ra để hiện thực việc lái tín hiệu PWM đến động cơ cần được truyền động.

Thân,

Cho em hỏi cái này hơi chuối một chút , em ko hiểu "cách dùng chân CCP1 tạo xung + ngắt cạnh lên H_TO_L cho động cơ" là sao cả?.
Vậy ngắt này được tạo ra do đâu ? Có phài là ngắt của khối CCP kô ? nếu vậy thì chân ccp1 phải nhận được tín hiệu ngắt , sau khi có ngắt xảy ra nó sẽ tạo ra tín hiệu pwm phải ko ?
Nếu đúng như vậy thì khi có xung ngắt vào chân ccp , thì con lái (driver) mạch điều khiển động cơ cũng nhận được tín hiệu đó , như thế sẽ có ảnh hưởng đến việc điều khiển hả anh ?
CCP_PWM_H_H
CCP_PWM_H_L
CCP_PWM_L_H
CCP_PWM_L_L
Trong ccs nó co chỉ như vậy nhưng em kô hiểu , rất mong các anh chỉ giúp ..
Thanks for all !!

nhattan
01-03-2008, 10:42 PM
Chào moi người .Cho tớ hỏi cái hàm điều xung bằng giá trị phần trăm (tức là mình sẽ truyền tham số cho hàm là giá trị phần trăm chứ không phải là value ) nằm ở đâu nhỉ ?tớ nghe nói là có ở trên diễn đàn mà, nên hỏi về để tham khảo .Có mục Tìm Kiếm ở trên rồi mà mình không tìm được.Cảm ơn mọi người

gaquay102
18-03-2008, 07:51 AM
#Có ai cho em hỏi :
-setup_timer_2(T2_DIV_BY_1,255,1); thì 255 là duty max ah?
-sao duty 100% mức 1 thì động cơ cũng hok chạy nhanh bằng cấp thẳng mức 1?

nhh
18-03-2008, 12:55 PM
Bạn nên đọc kỹ help CCS:
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%


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

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


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

phamtrieu138
19-03-2008, 02:16 AM
#include "C:\Documents and Settings\User\My Documents\thu pwm\hhff.h"
#byte portc=0x07
#use fast_io(c)
void bam()
{
set_pwm1_duty(800);
set_pwm2_duty(677);
}

void main()
{

setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
setup_timer_2(T2_DIV_BY_1,255,1);
setup_ccp1(CCP_PWM);
setup_ccp2(CCP_PWM);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
set_tris_c(0);
bam();
while (1)
{
}
}
sao c1,c2 ra toàn bằng 0 vậy. có khai báo gì đặc biệt hay phai treo trở ở chân c1,c2 vậyy??????

namqn
19-03-2008, 03:05 AM
#include "C:\Documents and Settings\User\My Documents\thu pwm\hhff.h"
#byte portc=0x07
#use fast_io(c)
void bam()
{
set_pwm1_duty(800);
set_pwm2_duty(677);
}

void main()
{

setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
setup_timer_2(T2_DIV_BY_1,255,1);
setup_ccp1(CCP_PWM);
setup_ccp2(CCP_PWM);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
set_tris_c(0);
bam();
while (1)
{
}
}
sao c1,c2 ra toàn bằng 0 vậy. có khai báo gì đặc biệt hay phai treo trở ở chân c1,c2 vậyy??????
Bạn vẫn chưa cho biết bạn dùng PIC nào. Bạn chưa cho biết bạn chạy mô phỏng hay trên mạch thực. Nếu bạn thử trên mạch thực thì sơ đồ mạch của bạn ra sao? Nếu bạn mô phỏng thì sơ đồ mạch dùng để mô phỏng ra sao?

Thân,

phamtrieu138
19-03-2008, 05:20 AM
mình dùng pic6f877a. sơ đồ mạch thì đơn giản. chỉ lấy dầu ra là c1,c2 băm xung cho 2 động cơ đồng tốc.thank

namqn
19-03-2008, 07:43 AM
mình dùng pic6f877a. sơ đồ mạch thì đơn giản. chỉ lấy dầu ra là c1,c2 băm xung cho 2 động cơ đồng tốc.thank
Ý của tôi là code của bạn khá đơn giản, không có vẻ sai chỗ nào, do đó tôi mới đặt vấn đề kiểm tra xem mạch của bạn có ổn hay không. Nếu là mạch thực thì bạn đã từng chạy thử chương trình nào trên đó chưa?

Trong nhiều trường hợp, chương trình không có vấn đề về thuật toán, nhưng PIC được cấu hình sai, dẫn đến không chạy khi cấp nguồn. Code của bạn không hề cho thấy PIC được cấu hình ra sao.

Thân,

phamtrieu138
19-03-2008, 03:30 PM
Cấu hình khai báo của mình là

#include <16f877A.h>
#device adc=8

#FUSES NOWDT
#FUSES XT
#FUSES NOPUT
#FUSES NOPROTECT
#FUSES NODEBUG
#FUSES NOBROWNOUT
#FUSES NOLVP
#FUSES NOCPD
#FUSES NOWRT

#use delay(clock=4000000)

mình định dùng chuơng trình để băm xung cho 2 động cơ cho đồng tốc mà làm hơn tuần nay ko được đành phải băm bằng tay nên chạy ko được mịn lắm mà mất công
mong mọi người chỉ giúp

Cần gấp lắm
Thanksss anh em nhiều

vleminh
06-10-2008, 06:58 PM
chào cả nhà! em muốn làm một dề tài là dùng pic 16f877a để lập trình và dùng lcd để hiển thị tốc độ của dong cơ. nhưng em mới vào nghề PIC nên còn gà lắm.bác nào co thể giúp em giải thuật lập trình đưoc ko?nếu có mạch nguyên lí nữa thí rất cảm ơn các bác. mong các pro giúp đỡ.

falleaf
06-10-2008, 07:26 PM
chào cả nhà! em muốn làm một dề tài là dùng pic 16f877a để lập trình và dùng lcd để hiển thị tốc độ của dong cơ. nhưng em mới vào nghề PIC nên còn gà lắm.bác nào co thể giúp em giải thuật lập trình đưoc ko?nếu có mạch nguyên lí nữa thí rất cảm ơn các bác. mong các pro giúp đỡ.

Hiên thị LCD em có thể đọc bài tại:
http://www.minhhaco.com/index.php?act=view&code=post&cid=9&id=10

Điều khiển động cơ em đọc bài tại:
http://www.picvietnam.com/forum/showthread.php?t=485

Chúc vui

vleminh
06-10-2008, 11:24 PM
cảm ơn anh F rất nhiều. các pro có thể giúp em một đoạn code tham khảo code được không? cho em hỏi giá của 1 lcd la bao nhiêu k vay nhi?

anhconnho
09-10-2008, 12:58 AM
Có ai giúp mình tìm hiểu cách hoạt động của quá trình điều chế xung với.
Rất mong được các bác hướng dẫn cụ thể.
Cảm ơn các bác nhiều.

vleminh
09-10-2008, 08:07 PM
ủa! không ai giúp mình với sao ? các bac pro đâu rồi giúp đệ với!!!!!!!

Macintosh
09-10-2008, 10:39 PM
lcd 16*2 khoảng 60k bạn ah
code thi` bạn coi trong thư mục example ccs có mà

vleminh
10-10-2008, 02:47 AM
cám ơn bạn.đề tài của mình là thiết kế mạch điều khiển động cơ và hiển thị tốc độ của nó ra lcd. mình muốn nhờ các pro viết code để tham khảo .nếu ai có mạch thì sent cho mình với.thanks nhiều.

mr.ngoc
29-08-2009, 11:59 AM
ua` mọi người cho em hỏi PIC16F877A chỉ có 2 kênh điều xung thôi sao? em xem datasheet thấy chỉ có 2 kênh là CCP1 và CCP2. hy` mới bắt đầu vào học mọi người giải đáp giùm em nhe!! thankSSSSSSSSSSSSS!

mr.ngoc
29-08-2009, 12:00 PM
à ai có tài liệu tiếng việt về PIC thì post lên giùm cho em nhe' em cảm ơn nhiều!!

manhha2799
31-08-2009, 04:14 PM
ua` mọi người cho em hỏi PIC16F877A chỉ có 2 kênh điều xung thôi sao? em xem datasheet thấy chỉ có 2 kênh là CCP1 và CCP2. hy` mới bắt đầu vào học mọi người giải đáp giùm em nhe!! thankSSSSSSSSSSSSS!


UH, nó có 2 kênh điều xung thôi,. Muốn nhiều thì xài 18f4431.

doover
04-11-2009, 09:45 AM
Dear!
Trong Phần khai báo của bạn fbanj cần khai báo
#use delay(clock="tan so thach anh"Hz, crystal)
Như thế thì nó mới hiểu được mấy cái delay trong bài!
Regards!

toancscdt
24-09-2012, 10:21 PM
cho mình hỏi nếu muốn điều khiển nhiều động cơ khác nhau nhưng chân pwm thì không đầy. mình dùng chân bình thường thì có thể điều khiển như thế nào được. các pro cho mình code tham khảo không? điều khiển 10 động cơ servo và 2 động cơ rc servo! cảm ơn các bạn mình ps điều khiển hoặc dùng sóng rf