View Full Version : Dieu khien dong co 1 chieu dung 16f877a bang pp PWM ???
quachvanluan_bk
13-04-2010, 12:14 AM
Mình đang làm bt về đk động cơ bằng pp PWM dung 16f877a,mọi nguời xem và góp ý cho mình nhé :Mình muốn thảo luận về 1 số nội dung :
+ Dùng timer 1 định thời 1s và tính toán value rồi set_duty nhu vay có hợp lý ko, Hay nên dùng timer 2 ?
+Mình phản hồi từ encoder về như vậy để hiệu chỉnh tốc độ động cơ cho bằng tốc độ đặt có ổn không ?
+ Minh muốn đặt 1 tốc độ nào đó thì phải chỉnh duty như thế nào
+ Khi thực hiện mạch phần cững phải lưu ý điều gì
Nếu ai có bài mẫu về đề tài này cho mình xin thì tốt quá.Email của mình là quachvanluan_bk@yahoo.com
Cảm ơn mọi người đã quan tâm:
file mình đính kèm đây nhé
pk178
30-04-2010, 08:45 PM
Mình đang làm bt về đk động cơ bằng pp PWM dung 16f877a,mọi nguời xem và góp ý cho mình nhé :Mình muốn thảo luận về 1 số nội dung :
+ Dùng timer 1 định thời 1s và tính toán value rồi set_duty nhu vay có hợp lý ko, Hay nên dùng timer 2 ?
Trong PIC16F877A đã có sẵn module PWM, bạn có thể sử dụng luôn module này, khi dùng module PWM thì timer 2 mặc định được sử dụng cho module này (xem trang 65/234 - datasheet PIC16F877A)
+Mình phản hồi từ encoder về như vậy để hiệu chỉnh tốc độ động cơ cho bằng tốc độ đặt có ổn không ?
Quá ổn chứ sao không ! Khi sử dụng phương pháp điều khiển phản hồi như vậy, bạn nên áp dụng các luật điều khiển như PID, điều khiển mờ... Điều này sẽ giúp hệ thống ổn định hơn !
+ Minh muốn đặt 1 tốc độ nào đó thì phải chỉnh duty như thế nào
Việc set duty phụ thuộc vào mô hình đối tượng (động cơ) của bạn, để làm được điều này, bạn cần biết các thông số của động cơ, nếu không biết các thông số của động cơ, bạn có thể sử dụng các phương pháp nhận dạng, trong Matlab có toolbox Identification, bạn có thể dùng toolbox này để nhận dạng động cơ !
+ Khi thực hiện mạch phần cững phải lưu ý điều gì
Phần cứng thì có nhiều lưu ý lắm, điều đó phụ thuộc nhiều vào cách bạn định sử dụng những gì. Mình chỉ có 1 lưu ý cho bạn là bộ nguồn, bạn phải xem xét xem bộ nguồn bạn dùng có đủ công suất không. Đây là 1 trong những vấn đề rất quan trọng.
Nếu ai có bài mẫu về đề tài này cho mình xin thì tốt quá.Email của mình là quachvanluan_bk@yahoo.com
Đây là 1 trong những đồ án điều khiển động cơ sử dụng bộ PID số của các anh K49, bạn có thể dùng nó để tham khảo : http://www.mediafire.com/?oo34ztnmdq0
Bạn học BKHN thì có thể lên văn phòng bộ môn ĐKTĐ để mượn các đồ án này về tham khảo.
Thân ái !
phu_vinh77
29-09-2010, 02:02 AM
anh ơi còn anh cho em hỏi điều khiển động cơ DC dùng đk mờ sao anh, em đang làm đồ án về cái này hic
hcmut.khoamaisi
29-09-2010, 12:59 PM
Đây là đồ án DK tốc độ động cơ.Trong này chưa có giao tiếp với LCD
http://www.mediafire.com/?b8wx87eoxz1s6
pro_khoa_pro
30-09-2010, 11:29 PM
sao không ai chịu giúp mình thế này, chán.
hongmta
24-10-2010, 01:30 AM
sao không ai chịu giúp mình thế này, chán.
bạn tìm trên forum coi,đã có nhiều topic về PWM rồi đấy,
nói thêm là PWM chỉ dùng timer2 để tính duty thôi bạn à
kqha1025
04-11-2010, 02:41 PM
Pac HAI1817 cho e xin nick của Pác!
Pác add nick của e , e hỏi Pác tý nhé : daolan_ktqs@yahoo.com
HAI1817
04-11-2010, 02:49 PM
tôi cũng theo cái đề tài này lâu rồi cũng tìm trong diễn đàn rồi mà cũng không thấy, pwm được. ổn định tốc độ không được bấy nhiêu đó mà chưa làm được nói chi tới PID.Nếu có code mẫu C 16f877a thì tốt quá.mong mọi người giúp đỡ.cảm ơn QUACHVANLUAN_BK code của bạn trích lại code
HAI1817
20-11-2010, 02:55 PM
giúp dùm em code trên đi.em cần gấp lắm
HAI1817
22-11-2010, 11:17 AM
có ai giúp dùm em code trên không?
pk178
22-11-2010, 03:47 PM
anh ơi còn anh cho em hỏi điều khiển động cơ DC dùng đk mờ sao anh, em đang làm đồ án về cái này hic
Thường người ta chỉ dùng ĐK mờ cho những đối tượng không điều khiển hoặc khó điều khiển được bằng những phương pháp điều khiển kinh điển.
Để dùng được phương pháp điều khiển mờ, bạn cần nắm vững luật điều khiển mờ, cụ thể các bước làm như sau :
- Mờ hóa đối tượng : 1 trong những cách mình thấy người ta hay làm là xác định góc ổn định của đối tượng bằng phương pháp popov rồi dựa vào đó thiết kế các luật hợp thành.
- Xác định các luật mờ (If...then...)
- Giải mờ.
Bạn có thể sử dụng bộ điều khiển Fuzzy-PID, tức là kết hợp luật điều khiển PID và luật điều khiển mờ, khi đó bạn không cần biết mô hình toán học của đối tượng mà vẫn có thể điều khiển đối tượng, bộ điều khiển mờ khi đó làm nhiệm vụ chỉnh định các tham số của bộ điều khiển PID
pk178
22-11-2010, 03:50 PM
tôi cũng theo cái đề tài này lâu rồi cũng tìm trong diễn đàn rồi mà cũng không thấy, pwm được. ổn định tốc độ không được bấy nhiêu đó mà chưa làm được nói chi tới PID.Nếu có code mẫu C 16f877a thì tốt quá.mong mọi người giúp đỡ.cảm ơn QUACHVANLUAN_BK code của bạn trích lại code
Bạn có thể tham khảo 1 đồ án tốt nghiệp của trường ĐH BKHN về vấn đề này ở địa chỉ
http://www.mediafire.com/?oo34ztnmdq0
Còn 1 đồ án tương tự nữa bạn có thể tham khảo, cũng là bộ điều khiển PID, điều khiển trực tiếp qua giao diện trên máy tính, ở đây mình dùng ngôn ngữ C#, viết trên VS2008, bạn phải có bộ này hoặc mới hơn mới xem được code giao diện. Còn PIC thì mình dùng dòng 16F887, cũng tương tự với dòng 16F877A. Địa chỉ download : http://www.mediafire.com/?116d1d14019zdij
HAI1817
24-11-2010, 12:07 PM
Code em viết chạy cảm thấy không ổn định chưa tìm ra được sai ở đâu ,cũng tốn nhiều thời gian rồi.mong anh chị các bạn giúp! mail hai1817@yahoo.com.vn
HAI1817
25-11-2010, 12:52 PM
cần trợ giúp công thức tính v/p code em tính có đúng không?xin cảm ơn trước
dinhminh09
25-11-2010, 03:09 PM
đề nghị úp lên media fire down cho dễ. không thì copy cái code paste vào luôn
muốn đến v/p thì trước hết phải biết cái encoder mỗi vòng cho bao nhiêu xung.
cho một timer định thời là 1 phút ngắt lấy số xung ra tính. tổng số xung trong 1 phút / số xung trong 1 vòng quay
HAI1817
25-11-2010, 08:00 PM
đề nghị úp lên media fire down cho dễ. không thì copy cái code paste vào luôn
muốn đến v/p thì trước hết phải biết cái encoder mỗi vòng cho bao nhiêu xung.
cho một timer định thời là 1 phút ngắt lấy số xung ra tính. tổng số xung trong 1 phút / số xung trong 1 vòng quay
#include <16F877A.h>
#include <def_877a.h>
#fuses NOWDT,PUT,HS,NOPROTECT,NOLVP
#use delay(clock=8000000)
#include <lcd_lib_4bit.c>
#use fast_io(a)
#use fast_io(b)
#use fast_io(d)
#define tocdo0 0 //toc do bang 0
#define td_macdinh 10 //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 bientocdo=0;
INT16 COUNT=0;
INT8 SOLANLAP=0;
int8 nghin,tram,chuc,donvi;
int16 bientocdodat=0;
int16 duty1=0;
int16 duty2=0;
INT16 TOCDOENCODER=200;
INT16 SOXUNGDEM_1PHUT=0;
int16 x;
int1 bienthuan=0;
int1 biennghich=0;
INT chieu;
#INT_RTCC // Ngat khi timer0 tran
VOID TIMER0() // tao bo dem timer0 dem so xung vao.............RA4
{
COUNT++;
}
#INT_TIMER1
VOID TIMER1() // dinh thoi 1s bang timer1 va tinh toan toc do....
{
set_timer1(15535); // timer 1 se dem 50 000 lan phuc vu cho dinh thoi 1S
solanlap=solanlap+1; //so lan lap bang 5 vi de dinh thoi 1s voi bo chia tan la 8.osc=8Mhz can dem 2000 000
//chia tan 8 se con 250 000 lenh qua lon so voi gtri co the dem 65 535 cua tmr1
// de dem dc 250 000 lenh,trong 1 chu ky ta dem 50 000 lenh va lap 5 lan
if (solanlap==5)
{
SOXUNGDEM_1PHUT=(((COUNT*255)+GET_TIMER0())*60)/TOCDOENCODER;
SOLANLAP=0;
SET_TIMER0(0);
COUNT=0;
}
}
void tinhtoan_hienthi(int16 x) // thuc hien tach so va dua ra hien thi
{
nghin = x / 1000 +0x30 ;
x = x % 1000;
tram = x / 100 + 0x30; // tách so hàng tram
x = x % 100; // chia lay phan du
chuc = x / 10 + 0x30; // tách lay phan chuc
donvi = x % 10 + 0x30; // phan don vi
if (chieu==1) lcd_putchar('+');
else lcd_putchar('-');
lcd_putchar(nghin);
lcd_putchar(tram);
lcd_putchar(chuc);
lcd_putchar(donvi);
}
void main(void)
{
set_tris_a(0x0ff);
set_tris_b(0x00);
set_tris_d(0xFF); //khoi tao port B la port nhap
lcd_putcmd(0x80);
lcd_init();
delay_ms(5);
setup_timer_0 (RTCC_DIV_1|RTCC_EXT_H_TO_L); // Timer0 is Counter
set_timer0(0);
setup_timer_1(T1_INTERNAL | T1_DIV_BY_4); // Timer1 is Timer
set_timer1(12140);
enable_interrupts(INT_RTCC);
enable_interrupts(INT_TIMER1);
enable_interrupts(GLOBAL);
count = 0;
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(portD,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(portD,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(portD,3)) //nhan phim toc do 1
{
bientocdo=1;
goto next;
}
if (!bit_test(portD,4)) //nhan phim toc do 2
{
bientocdo=2;
goto next;
}
if (!bit_test(portD,5)) //nhan phim toc do 3
{
bientocdo=3;
goto next;
}
if (!bit_test(portD,6)) //nhan phim toc do 4
{
bientocdo=4;
goto next;
}
if (!bit_test(portD,7)) //nhan phim toc do 5
bientocdo=5;
next:
if (!bit_test(portD,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
bientocdodat=0;
}
if (bienthuan)
{
duty2 = tocdo0;
chieu=1;
switch (bientocdo)
{
case 1: duty1= tocdo1;
bientocdodat=128;
break;
case 2: duty1= tocdo2;
bientocdodat=248;
break;
case 3: duty1= tocdo3;
bientocdodat=372;
break;
case 4: duty1= tocdo4;
bientocdodat=496;
break;
case 5: duty1= tocdo5;
bientocdodat=621;
break;
default : duty1 = td_macdinh;
bientocdodat=10;
break;
}
set_pwm1_duty(duty1); //cho dco chay thuan
set_pwm2_duty(duty2);
}
if (biennghich)
{
duty1 = tocdo0;
chieu=0;
switch (bientocdo)
{
case 1: duty2= tocdo1;
bientocdodat=128;
break;
case 2: duty2= tocdo2;
bientocdodat=248;
break;
case 3: duty2= tocdo3;
bientocdodat=372;
break;
case 4: duty2= tocdo4;
bientocdodat=496;
break;
case 5: duty2= tocdo5;
bientocdodat=621;
break;
default : duty2 = td_macdinh;
bientocdodat=10;
break;
}
set_pwm1_duty(duty1); //cho dco chay nghich
set_pwm2_duty(duty2);
}
lcd_putcmd(0x80);
lcd_putchar("v thuc:");
lcd_putcmd(0x88);
TINHTOAN_HIENTHI(SOXUNGDEM_1PHUT);
delay_ms(1);
lcd_putcmd(0xc0);
lcd_putchar("v dat:");
lcd_putcmd(0xc8);
TINHTOAN_HIENTHI(bientocdodat);
}
}
mong sự giúp đỡ
HAI1817
25-11-2010, 08:04 PM
code và mô phỏng
linhdang
26-11-2010, 12:57 PM
anh chi nao biet dieu khien khí nén bằng pic 16f887 khang giup dum em zoi
em cam on nhieu nha
email:hoanglinh_111988@yahoo.com
linhdang
26-11-2010, 10:58 PM
cac bac giup em lam sao chu moi lan len lai day la minh ko the tim thay tin nhan minh nhan luc truoc cho moi nguoi het
HAI1817
28-11-2010, 01:26 PM
tấm lòng vàng đâu rồi....giúp với trời ơi encoder
dinhminh09
28-11-2010, 09:27 PM
ở đây mình không thấy bạn nhập dữ liệu từ encoder vào pic thì làm sao nó đến bao nhiêu xung được. cái động cơ có encoder thương là 3 dây thì phải. không biết doán mò vậy không biết có đúng không. mà hình như nó là 3 dây và 5 dây.
bạn phải biết được số xung trong 1 vòng là bao nhiêu chứ. viết một chương trình phụ chỉ đọc encoder thôi . rồi lấy tay xoay thử 1 vòng nó lên bao nhiêu xung thế là biết được 1 vòng nó được bao nhiêu xung. mà trước khi làm bước này phải biết đọc encoder từ động cơ cái đã.
mà cái này hình như trong diễn đàn này cũng có một bài rồi
HAI1817
29-11-2010, 07:21 PM
ở đây mình không thấy bạn nhập dữ liệu từ encoder vào pic thì làm sao nó đến bao nhiêu xung được. cái động cơ có encoder thương là 3 dây thì phải. không biết doán mò vậy không biết có đúng không. mà hình như nó là 3 dây và 5 dây.
bạn phải biết được số xung trong 1 vòng là bao nhiêu chứ. viết một chương trình phụ chỉ đọc encoder thôi . rồi lấy tay xoay thử 1 vòng nó lên bao nhiêu xung thế là biết được 1 vòng nó được bao nhiêu xung. mà trước khi làm bước này phải biết đọc encoder từ động cơ cái đã.
mà cái này hình như trong diễn đàn này cũng có một bài rồi
code của mình ở trên encoder là 200 xung mình khai báo ở trên bạn xem dùm và giúp mình với cảm ơn bạn
dinhminh09
29-11-2010, 08:08 PM
code chua co encoder
#include <16F877A.h>
#include <def_877a.h>
#fuses NOWDT,NOPUT,HS,NOPROTECT,NOLVP,xt
#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;
#define low 0
#define high 1
void main() //bo PMW1 dk dco quay thuan
{ //bo PMW2 dk dco quay nghich
TRISB=0xff; //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); set_pwm2_duty(duty2);
//gia tri duty cua PWM duoc tinh theo cong thuc duty1*t2div/clock
//khoi tao duty=0 -> tat dong co
while(true)
{
if (input(pin_b1)== low) //neu nhan phim FO : chay thuan
{
set_pwm1_duty(duty1); //cho duty cua 2 bo PMW=0 de
set_pwm2_duty(duty2); //tat dong co
//delay 1s de giam quan tinh dong co
{
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);
}
if (input(pin_b2)== low) //neu nhan phim RE : chay nghich
{
set_pwm1_duty(duty1); //cho duty cua 2 bo PMW=0 de
set_pwm2_duty(duty2); //tat dong co
//delay 1s de giam quan tinh dco
{
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 (input(pin_b3)== low) //nhan phim toc do 1
{
bientocdo=1;
}
if (input(pin_b4)== low) //nhan phim toc do 2
{
bientocdo=2;
}
if (input(pin_b5)== low) //nhan phim toc do 3
{
bientocdo=3;
}
if (input(pin_b6)== low) //nhan phim toc do 4
{
bientocdo=4;
}
if (input(pin_b7)== low) //nhan phim toc do 5
bientocdo=5;
if (input(pin_b0)== low) //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
}
}
}
dinhminh09
29-11-2010, 08:30 PM
code co encoder
#include <18f4331.h>
#INCLUDE <def_877a.h>
#FUSES HS,NOWDT,NOPROTECT,NOLVP,NOBROWNOUT,NOPUT,NOCPD,NO DEBUG,NOFCMEN,NOCPB,STVREN,NOPWMPIN,HPOL_LOW
#FUSES MCLR,NOIESO,NOWRTC,NOWRTB,NOWRTD,NOEBTR,NOWRT,NOEB TRB,EXCLKD0,T1STANDARD,NOWINEN
#use delay(clock=20000000)
#use fast_io(a)
#use fast_io(d)
#use fast_io(c)
#use fast_io(e)
#DEFINE GIAI_MA1 RE0
#DEFINE GIAI_MA2 RE1
#DEFINE GIAI_MA3 RE2
#DEFINE NUT_AN RA0
#DEFINE CT_HT RA4
long XUNG,XUNG1,XUNG2;
int1 nut1,nut2,nut3,nut4,nut5,nut6,nut7,nut8;
int1 CT_HT1,CT_HT2,CT_HT3,CT_HT4,CT_HT5,CT_HT6,CT_HT7,C T_HT8;
#INT_EXT //RC3
VOID DEM_NGAT()
{
XUNG++;
INT0IF=0;
return ;
}
#INT_EXT1 //RC4
VOID DEM_NGAT_1()
{
XUNG1++;
INT1IF=0;
return ;
}
#INT_EXT2 //RC5
VOID DEM_NGAT_2()
{
XUNG2++;
INT2IF=0;
return;
}
VOID CT_PWM_POWER()
{
SET_POWER_PWM0_DUTY(100);
SET_POWER_PWM2_DUTY(500);
SET_POWER_PWM4_DUTY(200);
SET_POWER_PWM6_DUTY(500);
}
VOID CT_PWM_CCP ()
{
SET_PWM2_DUTY(250);
SET_PWM1_DUTY(500);
}
void main()
{
trisa=0x00;
porta=0xff;
trisb=0x00;
portb=0x00;
trisc=0b00111000;
//portC=0b00111000;
trisd=0x00;
portd=0xff;
trise=0x00;
porte=0xff;
setup_power_pwm_pins( PWM_ODD_ON,PWM_ODD_ON,PWM_ODD_ON,PWM_ODD_ON);
setup_power_pwm(PWM_CLOCK_DIV_4|PWM_FREE_RUN,1,0,1 24,0,1,0);
set_power_pwm_override(1, false, 0);
set_power_pwm_override(3, false, 0);
set_power_pwm_override(5, false, 0);
set_power_pwm_override(7, false, 0);
SETUP_CCP1(CCP_PWM);
SETUP_CCP2(CCP_PWM);
setup_timer_2(T2_DIV_BY_4,124,1);
enable_interrupts(GLOBAL);
enable_interrupts(INT_EXT);
enable_interrupts(INT_EXT1);
enable_interrupts(INT_EXT2);
ext_int_edge(0, L_TO_H );
ext_int_edge(1, L_TO_H );
ext_int_edge(2, L_TO_H );
xung=0;
xung1=0;
xung2=0;
while(TRUE)
{
IF(xung2==100) RA0=0;
else IF(XUNG2==1200) RA1=0;
else IF(XUNG2==1300) RA2=0;
else IF(xung2==1400) RA3=0;
else IF(xung2==1500) RA4=0;
else IF(xung2==1600) RA5=0;
else IF(xung2==2000) CT_PWM_POWER();
else IF(xung2==3000) CT_PWM_CCP ();
else IF(xung2>4000)
{
RD0=0;
DELAY_MS(500);
RD1=0;
DELAY_MS(500);
RD2=0;
DELAY_MS(500);
RD3=0;
DELAY_MS(500);
RD4=0;
DELAY_MS(500);
RD5=0;
DELAY_MS(500);
RD6=0;
DELAY_MS(500);
}
}
}
// tham khao nha
HAI1817
30-11-2010, 11:33 AM
có cách nào sửa code của mình chạy cho đúng không.mình dùng ngắt ngoài ngắt timer0 đếm xung encode.ngắt timer1 tính thời gian,tính tốc độ vòng/phút nói như vậy nhưng mò hoài không ra
HAI1817
30-11-2010, 09:27 PM
sửa code dùm tôi đi
hcmut.khoamaisi
04-12-2010, 02:20 PM
Hic cao thủ đâu hết rồi ,ra giúp anh em đi!
Mà cho mình hỏi cách mắc encoder vô như thế nào.Ai đã làm rồi chỉ cho mình với!
Thiengod
05-12-2010, 09:32 PM
Bạn có thể tham khảo 1 đồ án tốt nghiệp của trường ĐH BKHN về vấn đề này ở địa chỉ
http://www.mediafire.com/?oo34ztnmdq0
Còn 1 đồ án tương tự nữa bạn có thể tham khảo, cũng là bộ điều khiển PID, điều khiển trực tiếp qua giao diện trên máy tính, ở đây mình dùng ngôn ngữ C#, viết trên VS2008, bạn phải có bộ này hoặc mới hơn mới xem được code giao diện. Còn PIC thì mình dùng dòng 16F887, cũng tương tự với dòng 16F877A. Địa chỉ download : http://www.mediafire.com/?116d1d14019zdij
Link die hết rùi bác ơi. Bác có thể up lại ko. em đang cần cái này
HAI1817
18-12-2010, 03:02 PM
Lâu quá rồi cũng không có cao thủ giúp minh .Mình bó tay thôi
các bác ơi bác nào có code về điều khiẽn động cơ 1 chiêu quay thuận quay ngược ko ạh cho em xin ,em đang làm đồ án về cái này mà ko chạy ,đồ án của em chỉ diều khiển động cơ quay thuận quay ngược thui ko có tốc độ j cả ,em mong các bác giúp em với?
em xin chân thành cảm ơn :
automatic151188
16-05-2011, 06:21 PM
Các A chị giúp E sửa lỗi code với!
E dùng timer1 đếm xung clock đưa vào từ chân T1CKI.Timer0 tạo thời gian1s.
nhưng giá trị hiển thị lên LCD cứ thay đổi mong mọi người giúp đỡ.Dưới đây là code
#include <16F877A.h>
#include <def_877a.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#device *=16 adc=10
#use delay(clock=20000000)
#include <lcd_lib_4bit.c>
#use fast_IO(C)
#use fast_IO(a)
#use fast_IO(B)
#use fast_IO(D)
#byte portC=0x07
int8 nghin,tram,chuc,donvi;
void tinhtoan_hienthi(int16 x);
int16 x;
//------DAT BIEN TOAN CUC----------------//
INT16 SOLANLAP=0;
INT16 BIEN;
INT16 SOXUNGDEM_1PHUT=0;
//.................................................. .....................................
#INT_TIMER0
VOID SOXUNGDEM_1S()
{
solanlap=solanlap+1;
}
void TINHTOAN_HIENTHI(int16 x) // thuc hien tach so va dua ra hien thi
{nghin = x / 1000 + 0x30;
x = x % 1000;
tram = x / 100 + 0x30; // tách s? hàng tram
x = x % 100; // chia l?y ph?n d?
chuc = x / 10 + 0x30; // tách l?y ph?n ch?c
donvi = x % 10 + 0x30; // ph?n don v?
lcd_putchar(nghin);
lcd_putchar(tram);
lcd_putchar(chuc);
lcd_putchar(donvi);
}
void main()
{
SET_TRIS_A(0X0);
set_tris_C(0x01);
lcd_putcmd(0x80);
lcd_init();
delay_ms(10);
BIEN=0;
setup_TIMER_1(T1_EXTERNAL);
set_TIMER1(0);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2);
set_timer0(6);
enable_interrupts(INT_RTCC);
enable_interrupts(GLOBAL);
DELAY_MS(10);
while( TRUE )
{
if (solanlap==10000)
{
BIEN=GET_TIMER1();
PORTA=BIEN;
SOXUNGDEM_1PHUT=(60*BIEN);
SOLANLAP=0;
SET_TIMER1(0);
set_timer0(6);
lcd_putcmd(0x88);
TINHTOAN_HIENTHI(SOXUNGDEM_1PHUT);
}
}
}
hangocminh1989
26-05-2011, 12:26 AM
mình dùng ngược lại với bạn, timer1 đếm time, timer0 tính xung, giá trị cũng nhảy nhảy. hic, đang mò mà chưa biết sao cho nó ok nhất, thời gian đo thực tế không chính xác lắm, đang tìm cách tính chu kì máy của pic để tính cho chuẩn. đọc cái code của bạn, có một số nhận xét sau:
bạn không cho ngắt timer1 kìa: enable_interrupts(int_timer1);
không biết timer1 của bạn có prescaler bằng bao nhiêu?
mình thấy nếu cho hiển thị lcd vào trong vòng lặp while(1) thì giá trị hiển thị lcd cứ nhảy như ngựa ấy.
tạm thời chỉ biết tới đây thui. mong cùng hợp tác.
automatic151188
27-05-2011, 04:26 AM
mình dùng ngược lại với bạn, timer1 đếm time, timer0 tính xung, giá trị cũng nhảy nhảy. hic, đang mò mà chưa biết sao cho nó ok nhất, thời gian đo thực tế không chính xác lắm, đang tìm cách tính chu kì máy của pic để tính cho chuẩn. đọc cái code của bạn, có một số nhận xét sau:
bạn không cho ngắt timer1 kìa: enable_interrupts(int_timer1);
không biết timer1 của bạn có prescaler bằng bao nhiêu?
mình thấy nếu cho hiển thị lcd vào trong vòng lặp while(1) thì giá trị hiển thị lcd cứ nhảy như ngựa ấy.
tạm thời chỉ biết tới đây thui. mong cùng hợp tác.
////////////////////////////////////////////////////////////////////////////////////////////////////////
enable_interrupts(int_timer1);
cấu hình Timer1 làm đếm xung thì Mình không cần dùng ngắt Timer1 nữa.Khi đó Mình dùng Timer0 đọc giá trị của Timer1 để biết số xung đã đếm dc trong 1 giây (ngắt Timer0 của Mình là 1 giây) từ đó tính ra tốc độ.
Hiện mình đã sửa được và tốc độ hiển thị LCD là chính xác.
Mình đang làm phần giao tiếp với máy tình bằng Lapview! Điều khiển (on-off) động cơ thì đc rồi nhưng lại mắc ở việc hiển thị tốc độ lên máy tính!(Mình đọc dữ liệu từ bộ đệm và đã thử tách nhưng hiển thị không chuẩn). Mong Bạn và các A (Chị) giúp đỡ.
nguyenuoc02
23-10-2011, 12:50 AM
Can_Su_Giup_Do_Ve_Pic 16f877A
hj cac pan, minh mun tim hiu ve mach thiet ke dong co DC dieu khien tu xa bang Remote dung Pic 16f877A, thi can nhug con linh kien nao de hoan thanh mach nay. Neu pan nao pit thi huong dan cho m voi nha, ah kem theo ca doan Code thi cang tot, boi vi m cug chua am hiu may ve Lap trinh Pic 16f877A. Mog dc su hoi am cua cac pan doc yeu thik dien dan http://www.picvietnam.com
Nick: nguyenuoc02@gmail.com
Thanks nhiu nhiu nha
nguyenuoc02
23-10-2011, 12:56 AM
Can_Su_Giup_Do_Ve_Pic 16f877A
hj cac pan, minh mun tim hiu ve mach thiet ke dong co DC dieu khien tu xa bang Remote dung Pic 16f877A, thi can nhug con linh kien nao de hoan thanh mach nay. Neu pan nao pit thi huong dan cho m voi nha, ah kem theo ca doan Code thi cang tot, boi vi m cug chua am hiu may ve Lap trinh Pic 16f877A. Mog dc su hoi am cua cac pan doc yeu thik dien dan http://www.picvietnam.com
Nick: nguyenuoc02@gmail.com
Thanks nhiu nhiu nha
masterking
05-07-2012, 10:42 AM
Bạn có thể tham khảo 1 đồ án tốt nghiệp của trường ĐH BKHN về vấn đề này ở địa chỉ
http://www.mediafire.com/?oo34ztnmdq0
Còn 1 đồ án tương tự nữa bạn có thể tham khảo, cũng là bộ điều khiển PID, điều khiển trực tiếp qua giao diện trên máy tính, ở đây mình dùng ngôn ngữ C#, viết trên VS2008, bạn phải có bộ này hoặc mới hơn mới xem được code giao diện. Còn PIC thì mình dùng dòng 16F887, cũng tương tự với dòng 16F877A. Địa chỉ download : http://www.mediafire.com/?116d1d14019zdij
Bác này cho link nhưng không cho pass thì em làm sao down về nghiên cứu được đây? Mong bác hồi âm sớm...thank's
vandung1234
09-08-2012, 12:13 PM
Mới lụm dc đồ án điều khiển động cơ nhưng phần code bị lỗi anh em chỉ giúp mình với có gì thì gởi wa meo mình cảm ơn nhìu
email:dungnguyencg@yahoo.com.vn
baoitc
26-09-2012, 11:55 PM
Trong PIC16F877A đã có sẵn module PWM, bạn có thể sử dụng luôn module này, khi dùng module PWM thì timer 2 mặc định được sử dụng cho module này (xem trang 65/234 - datasheet PIC16F877A)
Quá ổn chứ sao không ! Khi sử dụng phương pháp điều khiển phản hồi như vậy, bạn nên áp dụng các luật điều khiển như PID, điều khiển mờ... Điều này sẽ giúp hệ thống ổn định hơn !
Việc set duty phụ thuộc vào mô hình đối tượng (động cơ) của bạn, để làm được điều này, bạn cần biết các thông số của động cơ, nếu không biết các thông số của động cơ, bạn có thể sử dụng các phương pháp nhận dạng, trong Matlab có toolbox Identification, bạn có thể dùng toolbox này để nhận dạng động cơ !
Phần cứng thì có nhiều lưu ý lắm, điều đó phụ thuộc nhiều vào cách bạn định sử dụng những gì. Mình chỉ có 1 lưu ý cho bạn là bộ nguồn, bạn phải xem xét xem bộ nguồn bạn dùng có đủ công suất không. Đây là 1 trong những vấn đề rất quan trọng.
Đây là 1 trong những đồ án điều khiển động cơ sử dụng bộ PID số của các anh K49, bạn có thể dùng nó để tham khảo : http://www.mediafire.com/?oo34ztnmdq0
Bạn học BKHN thì có thể lên văn phòng bộ môn ĐKTĐ để mượn các đồ án này về tham khảo.
Thân ái !
Mật khẩu download MF là gì hả bạn?
long91
04-10-2012, 12:16 AM
nhan pim 1 bang den hien lan luot cac chu cai va chu so mau do
nhan pim 2bang den hien tu dong cac chu cai va chu so mau do
nhan pim 3 bang den hien lan luot cac chu cai va chu so mau xanh
nhan pim 4bang den hien tu dong cac chu cai va chu so mau xanh
cac anh giup e voi
long91
04-10-2012, 12:19 AM
help me.cac ban giup em voi
trungkien0911
11-11-2012, 08:38 AM
Nguyên văn bởi pk178
Bạn có thể tham khảo 1 đồ án tốt nghiệp của trường ĐH BKHN về vấn đề này ở địa chỉ
http://www.mediafire.com/?oo34ztnmdq0
Còn 1 đồ án tương tự nữa bạn có thể tham khảo, cũng là bộ điều khiển PID, điều khiển trực tiếp qua giao diện trên máy tính, ở đây mình dùng ngôn ngữ C#, viết trên VS2008, bạn phải có bộ này hoặc mới hơn mới xem được code giao diện. Còn PIC thì mình dùng dòng 16F887, cũng tương tự với dòng 16F877A. Địa chỉ download : http://www.mediafire.com/?116d1d14019zdij
nhưng có mã khóa mà e đâu có biết mà download về đc.
20090227
01-11-2013, 03:05 PM
pas download la j the ban
hoangvanan
31-10-2016, 09:36 PM
Bạn có thể tham khảo 1 đồ án tốt nghiệp của trường ĐH BKHN về vấn đề này ở địa chỉ
http://www.mediafire.com/?oo34ztnmdq0
Còn 1 đồ án tương tự nữa bạn có thể tham khảo, cũng là bộ điều khiển PID, điều khiển trực tiếp qua giao diện trên máy tính, ở đây mình dùng ngôn ngữ C#, viết trên VS2008, bạn phải có bộ này hoặc mới hơn mới xem được code giao diện. Còn PIC thì mình dùng dòng 16F887, cũng tương tự với dòng 16F877A. Địa chỉ download : http://www.mediafire.com/?116d1d14019zdij
pass để unlock là gì anh ơi?
vBulletin® v3.8.11, Copyright ©2000-2025, vBulletin Solutions Inc.