PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Cơ bản về vi điều khiển và PIC (http://www.picvietnam.com/forum/forumdisplay.php?f=8)
-   -   điều khiển tóc độ đông cơ DC qua đọc ADC (http://www.picvietnam.com/forum/showthread.php?t=32680)

navypro 15-08-2013 12:02 AM

điều khiển tóc độ đông cơ DC qua đọc ADC
 
chào các anh em đang thử code việc thay đổi tốc độ động cơ thông qua đọc giá trị adc của pic, anh chị có thể chỉ giúp cho em với được không ah.

quanghuy_125 15-08-2013 12:39 AM

Dùng điện trở sun đo dòng I= U/R => U =R*I ( Coi động cơ DC có cos=1 hehe)
Khuyếch đại U sao cho U>=5V đưa vào ADC của PIC==>> điều chỉnh PWM

navypro 15-08-2013 10:50 AM

Trích:

Nguyên văn bởi quanghuy_125 (Post 82723)
Dùng điện trở sun đo dòng I= U/R => U =R*I ( Coi động cơ DC có cos=1 hehe)
Khuyếch đại U sao cho U>=5V đưa vào ADC của PIC==>> điều chỉnh PWM

cơ bản là không có gì về vấn đề đó nhưng việc lấy các giá trị ADC để làm giá trị duty nạp cho PWM của pic thì em đang vướng mong anh chỉ giúp

quanghuy_125 15-08-2013 11:09 AM

Trích:

Nguyên văn bởi navypro (Post 82724)
cơ bản là không có gì về vấn đề đó nhưng việc lấy các giá trị ADC để làm giá trị duty nạp cho PWM của pic thì em đang vướng mong anh chỉ giúp

Vướng sao cơ. Dùng time ngắt rùi đọc ADC. Cái này giúp ADC tần số lấy mẫu luôn chuẩn

navypro 16-08-2013 11:52 AM

Trích:

Nguyên văn bởi quanghuy_125 (Post 82725)
Vướng sao cơ. Dùng time ngắt rùi đọc ADC. Cái này giúp ADC tần số lấy mẫu luôn chuẩn

ý em muốn nói là giờ em muốn lấy giá trị read_adc() để làm giá trị duty nạp cho PWM ấy anh ah em đang vướng mắc chỗ đó nếu anh gửi tam cho em cái code mẫu thì em xin cảm ơn ah

quanghuy_125 17-08-2013 07:11 PM

Giá trị ADC tỷ lệ thuận với PWM vậy bạn muốn điều khiển như thế nào?
Điều chỉnh còn phụ thuộc vào động cơ. PI

navypro 17-08-2013 09:02 PM

Trích:

Nguyên văn bởi quanghuy_125 (Post 82743)
Giá trị ADC tỷ lệ thuận với PWM vậy bạn muốn điều khiển như thế nào?
Điều chỉnh còn phụ thuộc vào động cơ. PI

cơ bản em muốn hỏi anh là cách tính giá trị duty trên cơ sở giá trị đọc ADC ấy

quanghuy_125 18-08-2013 10:34 PM

Trích:

Nguyên văn bởi navypro (Post 82744)
cơ bản em muốn hỏi anh là cách tính giá trị duty trên cơ sở giá trị đọc ADC ấy

Duty là biến số đầu vào.
ADC có cách tính theo I, mà P=U*I*cos(fi) ( cos(fi) biến đổi theo duty, tần số...)
Cái này bạn phải dùng thử nghiệm để đưa ra phương thức tính toán thôi.
Lý thuyết thì nhiều cái lắm..............................

navypro 24-08-2013 06:15 PM

Trích:

Nguyên văn bởi quanghuy_125 (Post 82753)
Duty là biến số đầu vào.
ADC có cách tính theo I, mà P=U*I*cos(fi) ( cos(fi) biến đổi theo duty, tần số...)
Cái này bạn phải dùng thử nghiệm để đưa ra phương thức tính toán thôi.
Lý thuyết thì nhiều cái lắm..............................

em đang có ý nghĩ thế này không biết anh thấy có đúng không?
em lấy ADC 8 bít như thế sẽ có 255 mức, tương ứng với giá trị duty lấy tương ứng như thế có thể thay đổi tốc độ động cơ bằng cách thay đổi chiết áp nối với chân đọc ADC anh thấy thế nào ah> em thử làm nhưng chưa được anh có thể code mấu một đoạn giúp em không ah

quanghuy_125 24-08-2013 11:25 PM

Trích:

Nguyên văn bởi navypro (Post 82793)
em đang có ý nghĩ thế này không biết anh thấy có đúng không?
em lấy ADC 8 bít như thế sẽ có 255 mức, tương ứng với giá trị duty lấy tương ứng như thế có thể thay đổi tốc độ động cơ bằng cách thay đổi chiết áp nối với chân đọc ADC anh thấy thế nào ah> em thử làm nhưng chưa được anh có thể code mấu một đoạn giúp em không ah

Hoàn toàn được bạn ạ.
Bạn tham khảo ví dụ nha:
#include <16f877a.h>
#include <def_877a.h>
#device *=16 adc=8
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=200000000)

int8 P=0;
void init()
{
// cai PWM bo dieu che xung cho dong co
setup_ccp1(CCP_PWM); // Bat che do PWM cho RC1
// setup_ccp2(CCP_PWM); // Bat che do PWM cho RC2
setup_timer_2(T2_DIV_BY_4,156,1);//Ta co PR2=199,prescale=1
//Tpwm=[PR2+1]*4*1/clock*prescale=[199+1]*4/20000000*1=40 us
//Fpwm=1/Tpwm=25 kHZ
// set_tris_c(0b00000000);
set_pwm1_duty (10);
}

void main()
{
init();
// Khoi tao che do cho bo ADC
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_INTERNAL);
delay_us(10);
// Lay mau nhiet do lan dau tien
P=Read_ADC(ADC_START_AND_READ); //Lire Vin
restart_wdt(); // Woof !
delay_ms (10);
TRISA = 0x3F;
TRISB = 0x00;
TRISC = 0x0B;
TRISE = 0x07;
TRISD=0x03;
PORTB=0x00;
PORTC=0x0B;
PORTD=0x00;
while (true)
{

if(RA3==0||RD0==0){
if(RA3==0){

if(RA1==0||RA2==0){
if(RA1==0){RC5=1;RD2=0;
delay_ms(3);RC4=RD3=1;
};
if(RA2==0){RD2=1;RC5=0;
delay_ms(3);RC4=RD3=1;
};
}
else {RC5=RD2=0;RD3=1;RC4=1;delay_us(100);};

};
if(RD0==0){
if(RA1==0||RA2==0){
if(RA1==0){RC5=0;RD2=1;
delay_ms(3);RC4=RD3=1;
};
if(RA2==0){RD2=0;RC5=1;
delay_ms(3);RC4=RD3=1;
};
}
else {RC5=RD2=1;delay_ms(3);RC4=RD3=1;};
};
} else {RD3=RC4=RC5=RD2=0;};
if((RA1==0||RA2==0)&&RA3==1&&RD0==1){
if(RA1==0){ RC5=1;RD2=0;
delay_ms(3);RC4=1;RD3=0;
};
if(RA2==0){ RC5=0;RD2=1;
delay_ms(3);RC4=0;RD3=1;
};
};



delay_ms(1);
P=Read_ADC(ADC_START_AND_READ); //Lire Vin
restart_wdt(); // Woof !
delay_ms(4);
P=P/1.57;
set_pwm1_duty (P);
delay_ms (2);

/*
set_pwm2_duty(10);//100%
delay_ms(50);
set_pwm2_duty(25);//80%
delay_ms(100);
set_pwm2_duty(50);//50%
delay_ms(100);
set_pwm2_duty(100);
delay_ms(100);
set_pwm2_duty(120);
delay_ms(100);*/
}
}

navypro 30-08-2013 11:04 AM

Trích:

Nguyên văn bởi quanghuy_125 (Post 82795)
Hoàn toàn được bạn ạ.
Bạn tham khảo ví dụ nha:
#include <16f877a.h>
#include <def_877a.h>
#device *=16 adc=8
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=200000000)

int8 P=0;
void init()
{
// cai PWM bo dieu che xung cho dong co
setup_ccp1(CCP_PWM); // Bat che do PWM cho RC1
// setup_ccp2(CCP_PWM); // Bat che do PWM cho RC2
setup_timer_2(T2_DIV_BY_4,156,1);//Ta co PR2=199,prescale=1
//Tpwm=[PR2+1]*4*1/clock*prescale=[199+1]*4/20000000*1=40 us
//Fpwm=1/Tpwm=25 kHZ
// set_tris_c(0b00000000);
set_pwm1_duty (10);
}

void main()
{
init();
// Khoi tao che do cho bo ADC
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_INTERNAL);
delay_us(10);
// Lay mau nhiet do lan dau tien
P=Read_ADC(ADC_START_AND_READ); //Lire Vin
restart_wdt(); // Woof !
delay_ms (10);
TRISA = 0x3F;
TRISB = 0x00;
TRISC = 0x0B;
TRISE = 0x07;
TRISD=0x03;
PORTB=0x00;
PORTC=0x0B;
PORTD=0x00;
while (true)
{

if(RA3==0||RD0==0){
if(RA3==0){

if(RA1==0||RA2==0){
if(RA1==0){RC5=1;RD2=0;
delay_ms(3);RC4=RD3=1;
};
if(RA2==0){RD2=1;RC5=0;
delay_ms(3);RC4=RD3=1;
};
}
else {RC5=RD2=0;RD3=1;RC4=1;delay_us(100);};

};
if(RD0==0){
if(RA1==0||RA2==0){
if(RA1==0){RC5=0;RD2=1;
delay_ms(3);RC4=RD3=1;
};
if(RA2==0){RD2=0;RC5=1;
delay_ms(3);RC4=RD3=1;
};
}
else {RC5=RD2=1;delay_ms(3);RC4=RD3=1;};
};
} else {RD3=RC4=RC5=RD2=0;};
if((RA1==0||RA2==0)&&RA3==1&&RD0==1){
if(RA1==0){ RC5=1;RD2=0;
delay_ms(3);RC4=1;RD3=0;
};
if(RA2==0){ RC5=0;RD2=1;
delay_ms(3);RC4=0;RD3=1;
};
};



delay_ms(1);
P=Read_ADC(ADC_START_AND_READ); //Lire Vin
restart_wdt(); // Woof !
delay_ms(4);
P=P/1.57;
set_pwm1_duty (P);
delay_ms (2);

/*
set_pwm2_duty(10);//100%
delay_ms(50);
set_pwm2_duty(25);//80%
delay_ms(100);
set_pwm2_duty(50);//50%
delay_ms(100);
set_pwm2_duty(100);
delay_ms(100);
set_pwm2_duty(120);
delay_ms(100);*/
}
}

cảm ơn anh nhiều em thử lại nhé có gì anh tiếp tục chỉ giáo, cảm ơn anh nhiều


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