PDA

View Full Version : Bộ so sánh và PWM cho PIC16F877A


anhquangngai
02-03-2007, 04:57 PM
ai biết thì chỉ cho em về bộ so sánh và PWM hai kênh cùng một lúc.
và cho em biết bắt đầu từ đâu và làm như thế nào?
Xin chân thành cảm ơn!

falleaf
02-03-2007, 05:36 PM
Đây là vấn đề về thiết kế phần cứng, có nghĩa là khi bạn dùng thiết bị cùng một chân, thì bạn không thể dùng chung được. Chỉ đơn giản là bạn tìm cách thiết kế phần cứng, cho nó giống cái switch và dùng một tín hiệu để bật tắt cái switch này để chuyển chân. Sau đó, tại cùng một thời điểm bạn không thể dùng nó cùng lúc.

Ngoại trừ trường hợp bạn thay một con PIC có nhiều chân CCP hơn.

Chúc vui.

anhquangngai
08-03-2007, 09:01 PM
ý cùa em là ko dùng hai cái cùng một lúc mà hoặc là dùng bộ so sánh hoặc là dùng PWM hai kênh CCP1 và CCP2 cùng một lúc. Hai cái này riêng biệt không dùng chung so sánh và PWM cùng lúc!

falleaf
08-03-2007, 10:09 PM
Hai chức năng này, sẽ dùng chung timer trên hai chân (nếu 2 chân được setup cùng chức năng). Do đó, bạn chỉ cần bật chức năng này, setup timer 1 lần, và chạy nó.

Có nghĩa là, bạn chỉ phải setup cho chân CCP1 là PWM, chân CCP2 là PWM, rồi chỉnh timer theo ý bạn, rồi chạy. Tương tự, CCP1 là comparator, CCP2 là comparator, rồi setup timer, rồi chạy.

Chúc vui

anhquangngai
13-03-2007, 08:05 PM
vậy anh falleaf có chương trinh demo nào cho hai phần này thì up len cho em dc ko?
Xin cảm ơn!

PICC
24-03-2007, 02:19 PM
toi dang dung 16f877a de lam pwm nhung la 1 cho la luc dau van pwm duoc, nap chuong trinh vai lan la no khong pwm duoc nua, chang biet chuyen gi xay ra. Neu mua 1 con nua bo vao thi lai bi y nhu con dau, co ai biet chuyen gi da xay ra khong?

namqn
24-03-2007, 06:37 PM
toi dang dung 16f877a de lam pwm nhung la 1 cho la luc dau van pwm duoc, nap chuong trinh vai lan la no khong pwm duoc nua, chang biet chuyen gi xay ra. Neu mua 1 con nua bo vao thi lai bi y nhu con dau, co ai biet chuyen gi da xay ra khong?
Bạn mô tả quá chung chung. Chưa thấy có ai phản ánh về PWM của PIC16F877A như bạn, mà số người dùng PWM của PIC16F877A đâu phải chỉ có một vài.

Bạn đã cấu hình chip như thế nào, đã nạp chương trình vào chip như thế nào, đoạn code set up PWM của bạn như thế nào, và những nơi nào trong chương trình của bạn cập nhật giá trị cho PWM (post những đoạn code đó luôn).

Thân,

phamvanthang
27-03-2007, 10:27 PM
Toi dang tim cach su dung che do CCP1 cua PIC877a tao ra song vuong, chuong trinh viet bang CCS C. Nhung chay mo phong bang Proteous thi lai thu duoc song co chu ki khong phai la 2 ms. Xin moi nguoi sua giup. Cam on!
#include <16F877.h>
#INCLUDE<def_877a.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)

int16 pulse;

#int_ccp1
void isr()
{

if (!bit_test(PORTB,0)){
output_high(PIN_b0);
}
else{
output_low(PIN_B0);}
CCP_1+=1000;
}



void main()
{
CHAR VALUE;
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
setup_ccp1(CCP_COMPARE_INT);
enable_interrupts(INT_CCP1);
enable_interrupts(GLOBAL);


pulse = 1000;
TRISB = 0;
PORTB = 0;
CCP_1 = PULSE;

set_timer1(0);

while(true);
}

phamvanthang
28-03-2007, 12:58 AM
Khong hieu sao chuong trinh tren lai chay dung roi! Nhung ma khi toi thay CCP1 bang CCP2 thi chuong trinh lai chay sai.

namqn: Bạn chú ý viết tiếng Việt có dấu, diễn đàn có sẵn bộ gõ tiếng Việt rồi, bạn không cần cài thêm gì vào máy của bạn đâu.

0509592
13-07-2008, 12:23 AM
các bác co tai liệu tiếng Việt về pic 16F877A thi load lên cho em với.
email: truongtv0510@gmail.com
thanks!

tallht
28-07-2008, 02:06 PM
bạn search trên mạng thì có đó mà.

tmtm
28-07-2008, 07:23 PM
các bác co tai liệu tiếng Việt về pic 16F877A thi load lên cho em với.
email: truongtv0510@gmail.com
thanks!
Bạn có thể vào đây http://dientuvietnam.net/forums/showthread.php?t=12053 hoặc vào đây http://park.geocities.jp/hitechcontrol/ebook/dieu-khien-tu-dong.htm (cái này tải hơi khó, hình như là mục báo cáo ngay trên đầu thì phải).

tmtm
28-07-2008, 07:28 PM
bạn search trên mạng thì có đó mà.
có thì nói là có, ko có thì nói là ko có, ''search trên mạng'', tất nhiên rồi, nhưng nói thế sao nghe khó quá!

minhdt10
14-08-2008, 05:46 PM
#include <16F877a.h>
#INCLUDE<def_877a.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)

int16 pulse;

//#int_ccp1
#int_ccp2
void isr()
{
if (!bit_test(PORTB,0))
{
output_high(PIN_B0);
}
else
{
output_low(PIN_B0);
}
// CCP_1+=1000;
CCP_2+=5000;
}

void main()
{
// CHAR VALUE;

setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
setup_ccp2(CCP_COMPARE_INT);

enable_interrupts(INT_CCP2); //-> Cho phep ngat
enable_interrupts(GLOBAL);

pulse = 5000;
TRISB = 0;
PORTB = 0;
// CCP_1 = PULSE;
CCP_2 = PULSE;

// set_timer1(0);
set_timer1(0);

while(true);
}
Bạn thử cái này xem thế nào

window
29-09-2008, 11:55 AM
Các bạn có thể gom lại thành một tài liệu chi tiết , cơ bản và đầy đủ cho anh em mới được học hỏi.

hoangquan_d
23-04-2009, 08:48 PM
các bác co tai liệu tiếng Việt về pic 16F877A thi load lên cho em với.
email: truongtv0510@gmail.com
thanks!

bạn doc thử cái nay nhé

minh_thanh
26-04-2009, 10:39 AM
help! e mới bắt đầu tìm hiểu về pic 16f887a lập trình bằng ccs, đến phần ccp thi bị đơ mất
bác nào có tài liệu ccs chi tiết về phần này cho e tham khảo với.
thank much!

hoang_spk
30-11-2009, 12:08 PM
em cũng nghiên cứu về ứng dụng của bộ so sánh.Nhưng không rõ bộ so sánh có những ứng dụng như thế nào.anh co' thể giúp em được không???nếu có đoạn chương trình để tham khảo thì càng tốt.thanks anh nhìu

stupid11
03-03-2011, 08:44 PM
#include<16f877a.h>
#device 16F877*16ADC=8
#fuses nowdt,noprotect,nolvp,xt,put
#use delay(clock=4000000)
#use fast_io(d)
#use fast_io(c)
#use fast_io(a)
#use fast_io(e)
#byte porte=0x9
#byte portd=0x8
#byte portc=0x7
#byte porta=0x5
#byte option=0x81//option_reg//
#byte tmr0=0x1
#bit e1=porte.1
#bit e0=porte.0
#bit p0=option.0
#bit p1=option.1
#bit p2=option.2
#bit p3=option.3
#bit p4=option.4
#bit p5=option.5
int x,i,chuc,dv,y;
void xuatxung();
void docADC();
void main()
{
int a[10]={192,249,164,176,153,146,130,248,128,144};
set_tris_d(0);
set_tris_c(0);
set_tris_a(0b010001);
set_tris_e(0);
tmr0=0;
portd=0;
portc=0;
porta=0;
while(1)
{
p3=0;
p2=0;p1=1;p0=0;//chia tan 1:8//encoder duc 8 lo tren 1 vong
docADC();
x=read_ADC();
xuatxung();
p4=p5=1; // cho TMR0 hoat dong//
for(i=0;i<50;i++)
{
e1=1;e0=0;
portd=a[chuc];
delay_ms(10);
e0=1;e1=0;
portd=a[dv];
delay_ms(10);
}
y=tmr0;
chuc=y/10;
dv=y%10;
tmr0=0;// cai lai gia tri cho TMR0//
}}
void docADC()
{
setup_ADC(ADC_clock_internal);
setup_ADC_ports(AN0);
set_ADC_channel(0);
delay_us(100);
}
void xuatxung()
{
setup_ccp1(ccp_PWM);
set_pwm1_duty(x);
setup_timer_2(t2_div_by_16,255,1);
}




Su dung bo ADC de dieu chinh do rong xung (PWM)

mini_2440
21-03-2011, 12:34 PM
#include <16F877.h>
#INCLUDE<def_877a.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP /// sửa lại chỗ này nhé
//////////// #fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)

int16 pulse;

#int_ccp1
void isr()
{

if (!bit_test(PORTB,0)){
output_high(PIN_b0);
}
else{
output_low(PIN_B0);}
CCP_1+=1000;
}



void main()
{
CHAR VALUE;
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
setup_ccp1(CCP_COMPARE_INT);
enable_interrupts(INT_CCP1);
enable_interrupts(GLOBAL);


pulse = 1000;
TRISB = 0;
PORTB = 0;
CCP_1 = PULSE;

set_timer1(0);

while(true);
}

mini_2440
21-03-2011, 12:35 PM
HOẶC LẤY CODE NÀY NÈ,

#include <16F877A.h>
#FUSES HS
#use delay(clock=8000000)
INT16 J ;
void main()
{
setup_ccp1(CCP_PWM);
setup_ccp2(CCP_PWM);

setup_timer_2(T2_DIV_BY_16, 255,1) ;
OUTPUT_C(0) ;
WHILE(TRUE)
{
FOR(J = 0 ; J < 1024 ; J ++ )
{
set_pwm1_duty(J);
set_pwm2_duty(J);
DELAY_MS(8) ;
}
}
}

tuthantuthuc
17-05-2011, 07:05 PM
Nhờ mọi người giúp dùm về bộ PWM.
Hiện nay e đang làm khoá luận về cánh tay robot dùng PIC6F877A, và e đang vướng chỗ dùng xung PWM để điều khiển động cơ(em dùng động cơ DC) vì con PIC chỉ có 2 chân PWM nên e định đưa tín hiệu PWM vào con 74LS540 để khuyếch đại dòng,kết hợp với tín hiệu điều khiển chọn động cơ để đưa vào chân cho phép của con 74LS540 từ đó xuất ra giá trị PWM để điều khiển động cơ tương ứng.
Nhưng e k biết sau khi đưa qua con 74LS540 thì tín hiệu ra có còn là giá trị xung nữa k? E dùng con 74LS540 này để điều khiển động cơ bước thì được nhưng k biết khi dùng tín hiệu xung thì như thế nào? Mọi người có thể giúp dùm em vấn đề này được k?
Một vấn đề nữa e đang thắc mắc đó là e dùng encoder để hồi tiếp tốc độ, từ đó tính ra được góc quay cho động cơ nhưng e k biết đưa encoder về chân nào của con PIC vì e thấy nó chỉ có 1 chân RB0 là nhận tín hiệu ngắt ngoài, mà e thì điều khiển tới 4 động cơ nên giờ e nên làm sao đây? Mong mọi người giúp dùm.
Em xin cám ơn

ichitea606
15-05-2012, 12:10 PM
Chào các pan đề tài của e là: viết chường trình điều khiển độ sáng tồi của bóng đèn dùng PWM của PIC16f877A. e có cầu hỏi này muốn hỏi
1. khi ta phát hiện được điểm "0" của sóng sin thì ta kích 1 xung bằng PWM vậy thì Timer nó có liên quan gì tới chỗ này(thấy có người nói dùng timer gì gì đó )
2.Khi ta muốn góc kích tăng lên thì mình chỉ cần thay đổi duty của nó phải không nhỉ ?
3. E có doạn code điều khiển Led đơn như vầy: khi nhấn nút nhấn sẽ tạo ra một chuỗi xung điều khiển led đơn. E có thắc mắc là tại sao nhấn xong, một chuỗi xung được tạo ra,thả nút nhấn ra chuỗi xung vần còn. Vậy hàm CCP1 chỉ cần khởi tạo 1 lần là hoạt động luôn sao,muốn nó hoạt động theo ý muốn thì phải làm như thế nào,mong các bạn, các thầy hướng dẫn

#include <16F877A.h>
#include <def_16f877a.h>
#fuses NOWDT,PUT,HS,NOPROTECT,NOLVP
#use delay(clock=12000000)

#define diem0 rb0
#define led1 rc0
int16 duty1=0,i,j;
void kich (void){
setup_ccp1(CCP_PWM); //khoi tao bo PWM1
setup_timer_2(T2_div_by_16,187,1); //tao chu ky xung 1ms (1/clock)*4*t2div*(period+1)
duty1=120;
set_pwm1_duty(duty1); //theo cong thuc = duty1*t2div/clock
delay_ms(10);
}
void main()
{
set_tris_b(0);
set_tris_c(0);
while(true)
{
if(diem0==0){
delay_ms(1);
kich(); }
}
}

ichitea606
16-05-2012, 11:10 AM
K ai rảnh hướng dẫn mình hết ah? Bang chủ Pic(namq) giúp e với

thanhlam1911
08-09-2012, 09:00 AM
Bang chủ đang bế quan luyện công, các đệ tử chịu khó đợi nhé!