PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Những câu hỏi thường gặp (http://www.picvietnam.com/forum/forumdisplay.php?f=54)
-   -   Dieu khien dong co 1 chieu dung 16f877a bang pp PWM ??? (http://www.picvietnam.com/forum/showthread.php?t=6135)

HAI1817 25-11-2010 08:00 PM

Trích:

Nguyên văn bởi dinhminh09 (Post 40348)
đề 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

đây
 
1 Attachment(s)
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

Trích:

Nguyên văn bởi dinhminh09 (Post 40426)
ở đâ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

1 Attachment(s)
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

Trích:

Nguyên văn bởi pk178 (Post 40264)
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

dhtd 27-12-2010 10:16 PM

điều khiễn đông cơ 1 chiều kích thích quay thuận ,quay ngược
 
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 :


Múi giờ GMT. Hiện tại là 12:05 AM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam