LỚP DD07KSTN

LỚP DD07KSTN


 
Trang ChínhCalendarTrợ giúpTìm kiếmThành viênNhómĐăng kýĐăng Nhập
December 2018
MonTueWedThuFriSatSun
     12
3456789
10111213141516
17181920212223
24252627282930
31      
CalendarCalendar
Latest topics
Keywords

Share | 
 

 PWM_điều khiển động cơ đổi chiều

Go down 
Tác giảThông điệp
kẹo kéo
phó giám đốc
phó giám đốc
avatar

Tổng số bài gửi : 50
Join date : 31/12/2009
Age : 29

Bài gửiTiêu đề: PWM_điều khiển động cơ đổi chiều   Sat Jun 05, 2010 10:47 pm

/******************************************************
- Test trên mạch R&P PIC16
- Động cơ sử dụng là loại nhỏ, áp vào 5V, tầm 200mA.
- Ý tưởng là so sánh áp vào chân adc >2.5V thì lấy áp đó trừ đi 2.5, rồi tất
cả nhân 2 để sao cho tại 5V (thực ra khoảng 4.98V) thì động cơ quay max, tại 2.5V động cơ dừng. Tương tự cho chiều ngược lại.
- Thực tế là trong tầm 2V-3V, đông cơ không quay, có lẽ do momen không đủ.
- Mấy cái vớ vẩn k2 viết, còn code đổi chiều Phát viết. Smile
******************************************************/

#include <htc.h>
#include "stdlib.h"
#include "lcd.h"


__CONFIG(XT & WDTDIS & PWRTEN & MCLREN & UNPROTECT & SWBOREN & IESODIS & FCMDIS & LVPDIS & DEBUGDIS); //1st config. word
__CONFIG(BORV21); //2st config. word


#define _XTAL_FREQ 4000000


void setup_adc()
{
TRISA3=1;
TRISE0=0;
ANSEL=0xFF;
ADCON0=0b00001101;
ADFM=1;
VCFG1=0;
VCFG0=0;
}


unsigned long adc_read()
{
unsigned long vol=0;
if (GODONE==0) // thuc te khong can kiem tra if .. o day
{
vol=ADRESH*256+ADRESL;
}
return vol;
}


void init_timer2()
{
T2CON=0x00; //prescaler 1:1, postscaler1:1
TMR2ON=1; //timner 2 on
}


void setup_pwm()
{
PR2=199; //Fpwm=5khz
CCP1CON=0x0C;
CCP2CON=0x0C;
CCPR1L=0x00;
CCPR2L=0x00;
TRISC2=0;
TRISC1=0;
}


void output_lcd()
{
unsigned char dvi, chuc, tram, ngan;
unsigned long adc_val;
adc_val=5*(adc_read())*1000/1024; //đoạn code này tham khảo của lee Smile
dvi=adc_val%10;
adc_val=adc_val/10;
chuc=adc_val%10;
adc_val=adc_val/10;
tram=adc_val%10;
adc_val=adc_val/10;
ngan=adc_val%10;

lcd_gotoxy(0,1);
lcd_putc(0x30+ngan);
lcd_putc('.');
lcd_putc(0x30+tram);
lcd_putc(0x30+chuc);
lcd_putc(0x30+dvi);
lcd_puts(" Von");
}


void main()
{
setup_adc();
init_timer2();
setup_pwm();
lcd_init();
lcd_puts("Dien ap do duoc: ");
unsigned long pwm_val;
while(1)
{
GODONE=1;
while(GODONE); //cho adc chuyen doi xong
pwm_val=adc_read()*200/1023;
output_lcd();

if (pwm_val>100)
{
pwm_val=(pwm_val-100)*2;
CCPR2L=0x00; // tat kenh 2
__delay_us(10); //delay tranh trung dan
CCPR1L=pwm_val;
}
else
{
pwm_val=(100-pwm_val)*2;
CCPR2L=0x00; // tat kenh 1
__delay_us(10); //delay tranh trung dan
CCPR2L=pwm_val;
}
RE0=1; // motor enable
}
}
Về Đầu Trang Go down
Xem lý lịch thành viên http://dm.trong@gmail.com
Lee
phó tổng giám đốc
phó tổng giám đốc
avatar

Tổng số bài gửi : 106
Join date : 29/12/2009
Age : 29
Đến từ : Tây Ninh

Bài gửiTiêu đề: Re: PWM_điều khiển động cơ đổi chiều   Mon Jun 07, 2010 7:22 pm

Sao nhiều phen sóng gió thì cũng biết mình lỗi chổ nào!
Cách làm cũng giống Phát với Trọng thôi, nhưng ở đây sử dụng ngắt. Thiết nghĩ nó sẽ chạy " mượt " hơn so với polling hỏi vòng.

Trích dẫn :
/****************************************************************
*
* PIC Training Course
*
****************************************************************/

/****************************************************************
*
* Module : main.c
* Description : what is this for?????????????
* Tool : HI-TECH PIC
* Chip : 16F887A
* History : 3/6/2010
*
* Author :Mai Khac Hiep, CLB NCKH
* Notes :
*
*
****************************************************************/


/****************************************************************
* IMPORT
****************************************************************/
#include <htc.h>
__CONFIG(INTIO & WDTDIS & PWRTEN & MCLREN & UNPROTECT & DUNPROTECT & BORDIS & IESODIS & FCMDIS & LVPDIS); //1st config. word

__CONFIG(BORV21); //2st config. word

#define _XTAL_FREQ 4000000


/*****************************************************************
* ROUTINES
******************************************************************/
void setup_ADC(void)
{ unsigned char i=0;
ANS3=1;// NGO VAO ANALOG
TRISA3=1;
ADRESH=0x00;
ADRESL=0x00;
ADCON1 = 0; // TAM TOAN THANG=5V
ADFM = 1; // KET QUA LAP DAY BEN PHAI
ADCON0 = 0;
ADCS0 = 1; // tan so chuyen doi ADC bang FRC
ADCS1 =1;
CHS0 = 1; // chon kenh AN3
CHS1 = 1;
ADON = 1; // bat ADC
__delay_us(5);
GODONE =1 ; // run ADC
}
/*********************************************************************
**********************************************************************/
void setup_timer2(void)
{ T2CON = 0;
TMR2ON=1;
PR2=199;
}
/**********************************************************************
***********************************************************************/
void setup_pwm(void)
{ CCP1CON=0x0C;
CCP2CON=0x0C;
TRISC1=0;
TRISC2=0;
TRISE0=0;
RE0=1;
}
/**********************************************************************
***********************************************************************/
void setup_interrupt(void)
{ GIE=1;
PEIE=1;
ADIE=1;
ADIF=0;
}
/**********************************************************************
***********************************************************************/
void interrupt isr()
{ unsigned long temp=0;
if( ADIE && ADIF && PEIE)
{ ADIF=0;
temp=((unsigned int )ADRESH<<Cool|ADRESL;
if( temp<512) // dong co quay thuan
{ temp=(511-temp)*200/511;;
CCPR2L=0; // CCP1 chay, CCP2 tat
CCPR1L=temp;
}
if( temp>=512) // dong co quay nghich
{ temp=(temp-511)*200/511;;
CCPR1L=0; // CCP1 tat, CCP2 chay
CCPR2L=temp;
}
__delay_us(5);
GODONE = 1;
}
}

/****************************************************************
* MAIN Description : Dieu khien toc do dong co bang ADC *
****************************************************************/
void main(void)
{ setup_interrupt();
setup_timer2();
setup_ADC();
setup_pwm();
while(1);
}
/****************************************************************
* END OF standard form.c
****************************************************************/
Về Đầu Trang Go down
Xem lý lịch thành viên
kẹo kéo
phó giám đốc
phó giám đốc
avatar

Tổng số bài gửi : 50
Join date : 31/12/2009
Age : 29

Bài gửiTiêu đề: Re: PWM_điều khiển động cơ đổi chiều   Mon Jun 07, 2010 8:12 pm

- Há há, 2 code giống nhau ở cái này: 100=512*200/1024 cheers

- Theo k2 thì 2 cái có tác dụng như nhau và không có cái nào làm động cơ quay mượt hơn hết. Muốn quay mượt ta xài luôn 2 cái bit thấp của adc và pwm kìa. Razz

- Cái khác giữa dùng interrupt và polling là ở polling, trong giai đoạn chờ go/done=1 thì vxl không thực hiện việc khác được. Còn nếu dùng interrupt thì ta không phí thời gian chờ go/done.
Về Đầu Trang Go down
Xem lý lịch thành viên http://dm.trong@gmail.com
Lee
phó tổng giám đốc
phó tổng giám đốc
avatar

Tổng số bài gửi : 106
Join date : 29/12/2009
Age : 29
Đến từ : Tây Ninh

Bài gửiTiêu đề: Re: PWM_điều khiển động cơ đổi chiều   Mon Jun 07, 2010 8:59 pm

Cùng mục đích nên chắc chắn là xử lí hơi bị giống nhau rồi ( Cùng 1 lò ra cả ).

Uhm.. Nếu dùng hết 10 bit thì có lý đấy, độ phân giải cao, động cơ chạy mượt hơn. Đồng ý với k2.
Về Đầu Trang Go down
Xem lý lịch thành viên
Sponsored content




Bài gửiTiêu đề: Re: PWM_điều khiển động cơ đổi chiều   

Về Đầu Trang Go down
 
PWM_điều khiển động cơ đổi chiều
Về Đầu Trang 
Trang 1 trong tổng số 1 trang

Permissions in this forum:Bạn không có quyền trả lời bài viết
LỚP DD07KSTN :: Câu lạc bộ nghiên cứu khoa học :: PIC 16-
Chuyển đến