pic micro controller example - qei - adc - int

28
TS. Võ Tường Quân Module Điều khiển động cơ DC servo QEI / PID – ADC – INT Bài giảng Vi Điều Khiển 2011 Page 1 GIỚI THIỆU MODULE QEI ADC INT TRONG VI ĐIỀU KHIỂN A/ ĐIỀU KHIỂN ĐỘNG DC SERVO (CHỨC NĂNG QEI) 1 / Sơ đồ khối chế QEI: (dựa trên họ dsPIC30F ) 2/ Quadrature Encoder Interface. Incremental hay optical ecoder là loại tiêu biểu thường được sử dụng, có ba tín hiệu lối ra: pha A, phase B và xung index. Ba tín hiệu rất hữu ít và thường được để xác định vị trí và điều khiển tốc độ động cơ ACIM hoặc SR. Phase A (QEA) và pha B (QEB) có một mối tương quang độc nhất. Nếu phase A sớm pha hơn phase B chỉ ra motor quay thuận chiều, nếu pha A chậm phase hơn phase B motor quay ngược chiều. Xung index xuất hiện 1 lần trên một vòng và được sử dụng như là một tham chiếu để xác định vị trí tuyệt đối. Xung index trùng khớp với phase A và phase B Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only.

Upload: thong-do

Post on 25-Apr-2015

1.002 views

Category:

Documents


26 download

TRANSCRIPT

Page 1: PIC Micro Controller Example - QEI - ADC - InT

TS. Võ Tường Quân Module Điều khiển động cơ DC servo QEI / PID – ADC – INT

Bài giảng Vi Điều Khiển 2011 Page 1

GIỚI THIỆU MODULE QEI – ADC – INT TRONG VI ĐIỀU KHIỂN A/ ĐIỀU KHIỂN ĐỘNG CƠ DC SERVO (CHỨC NĂNG QEI)

1 / Sơ đồ khối chế QEI: (dựa trên họ dsPIC30F )

2/ Quadrature Encoder Interface.

Incremental hay optical ecoder là loại tiêu biểu thường được sử dụng, có ba tín hiệu lối ra: pha A, phase B và xung index. Ba tín hiệu rất hữu ít và thường được để xác định vị trí và điều khiển tốc độ động cơ ACIM hoặc SR.

Phase A (QEA) và pha B (QEB) có một mối tương quang độc nhất. Nếu phase A sớm pha hơn phase B chỉ ra motor quay thuận chiều, nếu pha A chậm phase hơn phase B motor quay ngược chiều.

Xung index xuất hiện 1 lần trên một vòng và được sử dụng như là một tham chiếu để xác định vị trí tuyệt đối. Xung index trùng khớp với phase A và phase B

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 2: PIC Micro Controller Example - QEI - ADC - InT

TS. Võ Tường Quân Module Điều khiển động cơ DC servo QEI / PID – ADC – INT

Bài giảng Vi Điều Khiển 2011 Page 2

3/ Enable Digital Filters Lọc kỹ thuật số khi đã kích hoạt cho phép lọc bất cứ nhiễu sinh ra trong tính hiệu của encoder.

Hình trên cho biết cách mà lọc được nhiễu của tính hiệu encoder. Việc lọc nhiễu dựa trên việc tính toán độ rộng xung nhỏ nhất dựa trên tốc độ động cơ

VD: Tốc độ động cơ 4000 vòng/phút, xung encoder 500, thì độ rộng xung nhỏ nhất sẽ là:

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 3: PIC Micro Controller Example - QEI - ADC - InT

TS. Võ Tường Quân Module Điều khiển động cơ DC servo QEI / PID – ADC – INT

Bài giảng Vi Điều Khiển 2011 Page 3

Vì vậy cấu hình bộ lọc loại bỏ các tính hiệu có độ rộng nhỏ hơn 15us. Trong ví dụ này chúng ta đang chạy tại 14,75 MIPS, cấu hình bộ lọc đạt được yêu cầu:

Ta cấu hình chế độ QEI sao cho bộ chia là 64 thì các xung nhỏ hơn 13us sẽ bị loại bỏ.

4/ Increment Pulse Counter Bộ đếm xung gia tăng đếm dựa trên sự thay đổi ở các chân QEn. QEI phải được cấu hình ở chế độ X4. Trong chế độ X4 tín hiệu cạnh lên ơ chân QEA và QEB đều làm tăng hoặc giảm giá trị trong thanh ghi POSCNT.

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 4: PIC Micro Controller Example - QEI - ADC - InT

TS. Võ Tường Quân Module Điều khiển động cơ DC servo QEI / PID – ADC – INT

Bài giảng Vi Điều Khiển 2011 Page 4

5/ Reset Pulse Counter. Xung reset bộ đếm tại chân index (Chế độ reset bởi chân index)

6/ VD đoạn mã thiết lập các thông số ban đầu cho khối QEI. void InitQEI(void) { ADPCFG |= 0x0038;// Configure QEI pins as digital inputs QEICONbits.QEIM = 0;// Disable QEI Module QEICONbits.CNTERR = 0;// Clear any count errors QEICONbits.QEISIDL = 0;// Continue operation during sleep QEICONbits.SWPAB = 0;// QEA and QEB not swapped QEICONbits.PCDOUT = 0;// Normal I/O pin operation QEICONbits.POSRES = 1;// Index pulse resets position counter DFLTCONbits.CEID = 1;// Count error interrupts disabled DFLTCONbits.QEOUT = 1;// Digital filters output enabled for QEn pins DFLTCONbits.QECK = 5;// 1:64 clock divide for digital filter for QEn DFLTCONbits.INDOUT = 1;// Digital filter output enabled for Index pin DFLTCONbits.INDCK = 5;// 1:64 clock divide for digital filter for Index POSCNT = 0;// Reset position counter QEICONbits.QEIM = 6;// X4 mode with position counter reset by Index return; }

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 5: PIC Micro Controller Example - QEI - ADC - InT

TS. Võ Tường Quân Module Điều khiển động cơ DC servo QEI / PID – ADC – INT

Bài giảng Vi Điều Khiển 2011 Page 5

7/ Tính toán vị trí góc với QEI Giá trị đếm tối đa trên một vòng được tính dựa vào số xung của encoder (500) và chế độ QEI.

Độ phân giải của góc :

Với độ phân giải này, giá trị ta cần chuyển đổi là từ 0-1999 thành một phân số 16 bit có dấu từ 0-32767 Ta sử dụng công thức sau:

VD Tính toán vị trí góc: int AngPos[2] = {0,0}; // Two variables are used for Speed Calculation int POSCNTcopy = 0; void PositionCalculation(void) { POSCNTcopy = (int)POSCNT; if (POSCNTcopy < 0) POSCNTcopy = -POSCNTcopy; AngPos[1] = AngPos[0]; AngPos[0] = (unsigned int)(((unsigned long)POSCNTcopy * 2048)/125); // 0 <= POSCNT <= 1999 to 0 <= AngPos <= 32752 return; } 8/ Tính toán vận tốc góc với QEI: Việc tính tóan vận toc góc sẽ được thực hiện trong ngắt.Vận tốc góc là 1 số tăng dần trong khoản thời gian phù hợp. Khoảng thời gian ngắt phải nhỏ hơn thời gian tối thiểu để đạt được ½ vòng ở tốc độ tối đa. Công thức tính khoảng thời gian ngắt:

VD: Khởi tạo các thông số cho timer1 để có được chu kỳ ngắt là 0.075 s

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 6: PIC Micro Controller Example - QEI - ADC - InT

TS. Võ Tường Quân Module Điều khiển động cơ DC servo QEI / PID – ADC – INT

Bài giảng Vi Điều Khiển 2011 Page 6

void InitTMR1(void) { TMR1 = 0; // Reset timer counter T1CONbits.TON = 0; // Turn off timer 1 T1CONbits.TSIDL = 0; // Continue operation during sleep T1CONbits.TGATE = 0; // Gated timer accumulation disabled T1CONbits.TCS = 0; // use Tcy as source clock T1CONbits.TCKPS = 2; // Tcy / 64 as input clock PR1 = 1728; // Interrupt period = 0.0075 sec with a 64 prescaler IFS0bits.T1IF = 0; // Clear timer 1 interrupt flag IEC0bits.T1IE = 1; // Enable timer 1 interrupts T1CONbits.TON = 1; // Turn on timer 1 return; } VD: Tính vận tốc góc #define MAX_CNT_PER_REV (500 * 4 - 1) #define MAXSPEED (unsigned int)(((unsigned long)MAX_CNT_PER_REV*2048)/125) #define HALFMAXSPEED (MAXSPEED>>1) int Speed; void __attribute__((__interrupt__)) _T1Interrupt (void) { IFS0bits.T1IF = 0; // Clear timer 1 interrupt flag PositionCalculation(); Speed = AngPos[0] - AngPos[1]; if (Speed >= 0)

{ if (Speed >= (HALFMAXSPEED) Speed = Speed - MAXSPEED;

} else {

if (Speed < -(HALFMAXSPEED) Speed = Speed + MAXSPEED;

} Speed *= 2; return; }

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 7: PIC Micro Controller Example - QEI - ADC - InT

TS. Võ Tường Quân Module Điều khiển động cơ DC servo QEI / PID – ADC – INT

Bài giảng Vi Điều Khiển 2011 Page 7

Ví dụ sử dụng module QEI của DsPic

// Các thư viện hỗ trợ của DsPic

#include <p30f4011.h>

#include <pwm.h>

#include <qei.h>

void QEI_Init()

{

ADPCFG = 0xFFFF; // Configure QEI pins as digital inputs

QEICONbits.QEIM = 7; // (bit 10-8 Disable QEI Module) x4 mode

QEICONbits.QEISIDL = 0; // bit 13 Continue operation during sleep

QEICONbits.SWPAB = 0; // bit 7 QEA and QEB not swapped

QEICONbits.PCDOUT = 0; // bit 6 Normal I/O pin operation

QEICONbits.TQGATE= 1; // bit 5 Timer gated time accumulation disabled

QEICONbits.TQCKPS= 0; // bit 4-3 Timer Input Clock Prescale Select bits

//(1:1 prescale value)

QEICONbits.POSRES = 0; // bit 2 Index pulse does not reset position counter

QEICONbits.TQCS=0; // bit 1 Timer Clock Source Select bit=Internal clock

//(TCY)

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 8: PIC Micro Controller Example - QEI - ADC - InT

TS. Võ Tường Quân Module Điều khiển động cơ DC servo QEI / PID – ADC – INT

Bài giảng Vi Điều Khiển 2011 Page 8

DFLTCONbits.CEID = 1; // Count error interrupts disabled

DFLTCONbits.QEOUT = 0; // Digital filters output disabled for QEn pins

DFLTCONbits.QECK = 0; // clock divide for digital filter for QEn

}

Điều khiển động cơ theo dạng hình thang

Sample code for PWM

void PWM_Initialize()

{

DisableIntMCPWM; // Macro disable the PWM Interrupt

SetPriorityIntMCPWM(7); //

DisableIntFLTA; // Config PTPER : PWM Time Base Period Register

PTPER=14570; //tần số PWM 2KHz ,14 bits resolution

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 9: PIC Micro Controller Example - QEI - ADC - InT

TS. Võ Tường Quân Module Điều khiển động cơ DC servo QEI / PID – ADC – INT

Bài giảng Vi Điều Khiển 2011 Page 9

// Config PWMCON1 : PWM Control Register 1

PWMCON1bits.PMOD1=1; // PWM I/O pin pair is in the independent output

//mode

PWMCON1bits.PEN1H=0; // Disable for PWM 1H output

PWMCON1bits.PEN1L=1; // Enable for PWM 1L output ----------> PWM for

//LMD18200

PWMCON1bits.PEN2H=0; // Disable for PWM 2H output

PWMCON1bits.PEN2L=1; // Enable for PWM 2L output(Disable for PWM 2L output)

PWMCON1bits.PEN3H=0; // Disable for PWM 3H output

PWMCON1bits.PEN3L=0; // Disable for PWM 3L output

// Config PWMCON2 : PWM Control Register 2

PWMCON2bits.SEVOPS=0; // PWM Special Event Trigger Output Postscale

//Select bits

PWMCON2bits.IUE=0; // Updates to active PDC registers are

//synchronized to the PWM time base

PWMCON2bits.UDIS=0; // Updates from duty cycle and period buffer

//registers are enable

// Config PDC1 : PWM Duty Cycle Register 1

// Config PTCON : PWM Time Base Control Register

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 10: PIC Micro Controller Example - QEI - ADC - InT

TS. Võ Tường Quân Module Điều khiển động cơ DC servo QEI / PID – ADC – INT

Bài giảng Vi Điều Khiển 2011 Page 10

PTCONbits.PTSIDL=1; // PWM time base halts in CPU Idle mode

PTCONbits.PTOPS=16; // 1:16 Postscale (125 Hz).

PTCONbits.PTCKPS=0; // PWM time base input clock period is TCY

//(1:1 prescale)

PTCONbits.PTMOD=0; // PWM time base operates in a free running mode

PTCONbits.PTEN=1; // PWM time base is on

}

// Tính toán số xung cần xuất

void getu (unsigned int U)

{

u = f(U); // Tính toán ra số xung dựa vào tín hiệu cảm biến, Sinh viên tự chọn lại công thức của

hàm f(U) dựa vào cảm biến sử dụng .

fposition = ceilf(u);// lam tron so xung

if (fposition < 0)

{neg_mode = 1;}

else neg_mode = 0;

phase1dist = abs(fposition/2); // phase1dist giữ 1/2 quãng đường cần di chuyển

phase = 0;

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 11: PIC Micro Controller Example - QEI - ADC - InT

TS. Võ Tường Quân Module Điều khiển động cơ DC servo QEI / PID – ADC – INT

Bài giảng Vi Điều Khiển 2011 Page 11

pwm_in_progress = 1;

position = 0;

mposition = 0;

}

// Tính toán điều khiển vận tốc theo dạng hình thang

void UpdateTraj ()

{

if (pwm_in_progress) // Nếu động cơ vẫn hoạt động

{

if (!phase) // Nếu là nữa đầu của quãng đường

{

if (velact < vlim) // Nếu vận tốc chưa đạt tới vận tốc giới hạn thì

{ // gia tốc tăng thêm

velact += accel;

}

else

{ flatcount ++;// Nếu đã đạt tới vận tốc giới hạn thì bật cờ flatcount

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 12: PIC Micro Controller Example - QEI - ADC - InT

TS. Võ Tường Quân Module Điều khiển động cơ DC servo QEI / PID – ADC – INT

Bài giảng Vi Điều Khiển 2011 Page 12

phase1dist -= velact; // trừ dần nữa quãng đường cho velact

if (neg_mode)

position -= velact;// Nếu di chuyển ngược chiều thì trừ

else

position += velact;// Nếu di chuyển chiều thuận thì cộng

}

if (phase1dist <= 0) //Nếu hết nữa quãng đường đầu thì chuyển sang nữa

//sau

{ phase = 1;

}

}

else

{ if (flatcount)flatcount--;

else

if (velact)

{ velact -= accel;// Giảm tốc độ

if (velact < 0)

velact = 0;

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 13: PIC Micro Controller Example - QEI - ADC - InT

TS. Võ Tường Quân Module Điều khiển động cơ DC servo QEI / PID – ADC – INT

Bài giảng Vi Điều Khiển 2011 Page 13

}

else {

pwm_in_progress = 0;// Nếu vận tốc bằng không thì cờ dừng động cơ

position = fposition; // quãng đường đi được đã hoàn thành

}

if (neg_mode)

{position -= velact;

}

else

{position += velact;

}

}

}

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 14: PIC Micro Controller Example - QEI - ADC - InT

TS. Võ Tường Quân Module Điều khiển động cơ DC servo QEI / PID – ADC – INT

Bài giảng Vi Điều Khiển 2011 Page 14

// Tính toán PID

void pid_cal()

{

EncoderCount = POSCNT - Count; // lay sai lech xung cua encoder

Count = POSCNT;

mposition += EncoderCount ; // mode lam viec cua encoder la x4

// Tinh toan sai lech

u = position - mposition ;

Ypid = ceilf(u*Kp) ;// Làm tròn số xung

Intergral =Intergral + u;

Ypid = Ypid + ceilf(Ki*Intergral);

Ypid = Ypid + ceilf(Kd*EncoderCount);

PDC1 = PDC2 = Ypid;

}

B/ MODULE ADC CỦA VI ĐIỀU KHIỂN

- PIC có nhiều chân phục vụ xử lý ADC với nhiều cách thức khác nhau . Để dùng ADC , phải có khai báo #DEVICE cho biết dùng ADC bao nhiêu bit ( tuỳ chip hỗ trợ , thường là 8 hay 10 bit hoặc hơn) chọn lựa ADC 8 hay 10 bit tùy mục đích sử dụng.

- Các hàm sau phục vụ ADC :

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 15: PIC Micro Controller Example - QEI - ADC - InT

TS. Võ Tường Quân Module Điều khiển động cơ DC servo QEI / PID – ADC – INT

Bài giảng Vi Điều Khiển 2011 Page 15

1 / Setup_ADC ( mode ): Không trả về trị. Dùng xác định cách thức hoạt động bộ biến đổi ADC . Tham số mode tuỳ thuộc file thiết bị *.h có tên tương ứng tên chip đang dùng , nằm trong thư mục DEVICES của CCS .

Sau đây là các giá trị mode của 16F877

o ADC_OFF : tắt hoạt động ADC ( tiết kiệm điện , dành chân cho hoạt động khác ) . o ADC_CLOCK_INTERNAL : thời gian lấy mẫu bằng xung clock IC ( mất 2-6 us ) thường là

chung cho các chip . o ADC_CLOCK_DIV_2 : thời gian lấy mẫu bằng xung clock / 2 ( mất 0.4 us trên thạch anh

20MHz ) o ADC_CLOCK_DIV_8 : thời gian lấy mẫu bằng xung clock / 8 ( 1.6 us ) o ADC_CLOCK_DIV_32 : thời gian lấy mẫu bằng xung clock / 32 ( 6.4 us )

2 / Setup_ADC_ports ( value ): Xác định chân lấy tín hiệu analog và điện thế chuẩn sử dụng . Tùy thuộc bố trí chân trên chip , số chân và chân nào dùng cho ADC và số chức năng ADC mỗi chip mà value có thể có những giá trị khác nhau.

Sau đây là các giá trị cho value ( chỉ dùng 1 trong các giá trị ) của 16F877 :

o ALL_ANALOGS : dùng tất cả chân sau làm analog : A0 A1 A2 A3 A5 E0 E1 E2 (Vref=Vdd)

o NO_ANALOG : không dùng analog , các chân đó sẽ là chân I /O. o AN0_AN1_AN3 : A0 A1 A3 , Vref = Vdd o AN0 : A0

….

VD : setup_adc_ports (AN0_AN1_AN3 ) ; // A0 , A1 , A3 nhận analog , áp nguồn +5V cấp

cho IC sẽ là điện áp chuẩn .

3 / Set_ADC_channel ( channel ):

- Chọn chân để đọc vào giá trị analog bằng lệnh Read_ADC ( ) . Giá trị channel tuỳ số chân chức năng ADC mỗi chip .Với 16F877, channel có giá trị từ 0 -7 : 0-chân A0 | 1-chân A1 | 2-chân A2 | 3-chân A3 | 4-chân A5 | 5-chân E0 | 6-chân E1 | 7-chân E2

- Hàm không trả về trị . Nên delay 10 us sau hàm này rồi mới dùng hàm read_ADC ( ) để bảo đảm kết quả đúng . Hàm chỉ hoạt động với A /D phần cứng trên chip.

4 / Read_ADC ( mode ): Dùng đọc giá trị ADC từ thanh ghi (/ cặp thanh ghi ) chứa kết quả biến đổi ADC . Lưu ý hàm này sẽ hỏi vòng cờ cho tới khi cờ này báo đã hoàn thành biến đổi ADC ( sẽ mất vài us ) thì xong hàm .

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 16: PIC Micro Controller Example - QEI - ADC - InT

TS. Võ Tường Quân Module Điều khiển động cơ DC servo QEI / PID – ADC – INT

Bài giảng Vi Điều Khiển 2011 Page 16

- Nếu giá trị ADC là 8 bit như khai báo trong chỉ thị #DEVICE , giá trị trả về của hàm là 8 bit, ngược lại là 16 bit nếu khai báo #DEVICE sử dụng ADC 10 bit trở lên .

- Khi dùng hàm này , nó sẽ lấy ADC từ chân bạn chọn trong hàm Set_ADC_channel( ) trước đó.Nghĩa là mỗi lần chỉ đọc 1 kênh Muốn đổi sang đọc chân nào, dùng hàm set_ADC_channel( ) lấy chân đó . Nếu không có đổi chân , dùng read_ADC( ) bao nhiêu lần cũng được.

- “mode” có thể có hoặc không , gồm có :

ADC_START_AND_READ : giá trị mặc định

ADC_START_ONLY : bắt đầu chuyển đổi và trả về

ADC_READ_ONLY : đọc kết quả chuyển đổi lần cuối

5 /Ví dụ:

- Chương trình sau lấy ADC 8 bit , đọc và xuất ra LCD ở port B. - Kết nối chân trên 16F877 : RA0 là chân lấy Analog vào , áp chuẩn là nguồn +5V , mass=0 V

a /Sơ đồ mạch:

b /Chương trình viết trong CCS:

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 17: PIC Micro Controller Example - QEI - ADC - InT

TS. Võ Tường Quân Module Điều khiển động cơ DC servo QEI / PID – ADC – INT

Bài giảng Vi Điều Khiển 2011 Page 17

#include <16F877.h >

#use delay( clock=20000000 )

#device *= 16 ADC = 8 // sử dụng ADC 8 bit , giá trị ADC vào từ 0-255

#FUSES hs,nowdt,noput,nolvp //khai bao cau hinh cho PIC

#byte portB =0x06 //dinh ten portB

#byte portC=0x07 // dinh ten portC cho PORTC cua chip

#define RS pin_c0 // dinh ten RS la chan RC0 cua chip

#define RW pin_c1 // dinh ten RW la chan RC1 cua chip

#define E pin_c2 // dinh ten E la chan RC2 cua chip

Int8 adc, donvi, chuc, tram;

Int8 a =0;

Main( )

{

output_b(0x38); // chon che do de giao tiep LCD là 8 bit, hien thi 2x16, font 5x8

truyen_lenh(); //truyen lenh vao LCD

output_b(0x0E); // bat den hien thi,bat con tro

truyen_lenh(); //truyen lenh vao LCD

Delay_ms (100 ); // delay 100 ms

Setup_ADC ( ADC_internal ) ;

Setup_ADC_ports (AN0);

Set_ADC_channel ( 0 ) ;

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 18: PIC Micro Controller Example - QEI - ADC - InT

TS. Võ Tường Quân Module Điều khiển động cơ DC servo QEI / PID – ADC – INT

Bài giảng Vi Điều Khiển 2011 Page 18

Delay_us (10 ); // delay 10 us

While (true )

{ adc = read_adc ( ) ;

a = adc;

convert_to_ascii();

hienthi();

}

}

//////////////////////////////////////////////////////////////////////////////////////

void convert _to_ascii() //chuong trinh con chuyen ma thành mã ascii de hien thi ra LCD

{a=a%1000; //lay gia tri so du sau khi chia cho hang nghin

tram=a/100 + 0x30; //lay gia tri hang tram chuyển sang mã ascii

a=a%100; //lay gia tri so du sau khi chia cho hang tram

chuc= a/10 + 0x30 ; //lay gia tri hang chuc chuyển sang mã ascii

donvi=a%10 + 0x30; //lay gia tri hang don vi chuyển sang mã ascii

}

///////////////////////////////////////////////////////////////////////////////////////////

Void hienthi()

{

Output_b( 0x80);

Truyen_lenh ;

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 19: PIC Micro Controller Example - QEI - ADC - InT

TS. Võ Tường Quân Module Điều khiển động cơ DC servo QEI / PID – ADC – INT

Bài giảng Vi Điều Khiển 2011 Page 19

Output_b (‘V’);

Truyen_du_lieu ();

Output_b (donvi);

Truyen_du_lieu ();

Delay_ms (10 );

Output_b ( chuc);

Truyen_du_lieu ();

Delay_ms (10);

Output_b ( tram);

Truyen_du_lieu ();

Delay_ms (10);

}

//////////////////////////////////////////////////////////////////////////////////

void truyen_lenh() //chuong trinh cho phep ghi vao thanh ghi tren LCD

{output_low(RS); //bat che do truyen lenh vào thanh ghi

output_low(RW); //bat bus ghi du lieu

output_high(E); //bat dau cho du lieu qua

delay_ms(5); //cho thoi gian truyen du lieu

output_low(E); //tat du lieu va da san sang ghi du lieu

delay_ms(5);} //cho thoi gian dong du lieu

////////////////////////////////////////////////////////////////////////////////////////////////////

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 20: PIC Micro Controller Example - QEI - ADC - InT

TS. Võ Tường Quân Module Điều khiển động cơ DC servo QEI / PID – ADC – INT

Bài giảng Vi Điều Khiển 2011 Page 20

void truyen_du_lieu() //chuong trinh ghi du lieu vao RAM va hien thi len LCD

{output_high(RS); //bat che do doc du lieu can hien thi

output_low(RW); //bat bus ghi du lieu vao RAM

output_high(E); //bat dau cho du lieu qua

delay_ms(5); //cho thoi gian truyen du lieu

output_low(E); //tat du lieu va da san sang ghi du lieu

delay_ms(5); //cho thoi gian dong du lieu

}

C/ CHỨC NĂNG TRUYỀN NHẬN QUA IC RS232 CỦA VI ĐIỀU KHIỂN. - Chương này sẽ giúp chúng ta viết chương trình có sử dụng giao tiếp UART trên PC và Vi điều khiển .

Điều này rất cần thiết khi chúng ta muốn VĐK khi hoạt động có thể truyền dữ liệu cho PC xử lý, hoặc nhận giá trị từ PC để xử lý và điều khiển ( dùng PC điều khiển động cơ , nhiệt độ , hay biến PC thành dụng cụ đo các đại lượng điện , . . .) .

- Để sử dụng giao thức này, chúng ta phải có 2 khai báo như ví dụ sau : #use delay (clock = 40000000 ) // nếu VDK đang dùng OSC 40Mhz #use rs232 (baud=19200 , parity=n , xmit=pin_C6 , rcv=pin_C7 ) // baud= 19200 , không chẵn lẻ , chân truyền C6 , chân nhận C7 - Các hàm liên quan :

Printf ( ) Getc ( ) putc ( ) Getch ( ) putchar ( ) Getchar ( ) fputc ( ) Fgetc ( ) puts ( ) Gets ( ) fputs ( ) Fgets ( ) Kbhit ( )…

1 / printf ( string ) Printf ( cstring , values . . . ) - Dùng xuất chuỗi theo chuẩn RS232 ra PC . - “string” là 1 chuỗi hằng hay 1 mảng ký tự ( kết thúc bởi ký tự null ) . - “value “ là danh sách các biến , cách nhau bởi dấu phẩy . - Phải khai báo dạng format của value theo kiểu %wt .Trong đó “w” có thể có hoặc không, có

giá trị từ 1-9 chỉ rõ có bao nhiêu ký tự được xuất ra ( mặc định không có thì có bao nhiêu ra bấy nhiêu ), hoặc 01-09 sẽ chèn thêm 0 cho đủ ký tự hoặc 1.1-1.9 cho trường hợp số thực . Còn “t” là kiểu

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 21: PIC Micro Controller Example - QEI - ADC - InT

TS. Võ Tường Quân Module Điều khiển động cơ DC servo QEI / PID – ADC – INT

Bài giảng Vi Điều Khiển 2011 Page 21

giá trị. t có thể là :

C : 1 ký tự S : chuỗi hoặc ký tự U : số 8 bit không dấu x : số 8 bit kiểu hex ( ký tự viết thường ,VD : 1ef ) X : số 8 bit kiểu hex ( ký tự viết hoa ,VD : 1EF ) D : số 8 bit có dấu e : số thực có luỹ thừa VD : e12 f : số thực Lx : số hex 16 /32 bit ( ký tự viết thường ) LX : hex 16 /32 bit ( ký tự viết hoa ) Lu : số thập phân không dấu Ld : số thập phân có dấu % : ký hiệu %

2 / KBHIT ( ): - Thường dùng RC6 và RC7 cho RX và TX trong giao tiếp cổng COM. VDK PIC trang bị phần cứng

phục vụ việc này với thanh ghi gởi và nhận và các bit bào hiệu tương ứng . Do đó khi dùng RS232 hỗ trợ từ phần cứng thì KHBIT ( ) trả về TRUE nếu 1 ký tự đã được nhận ( trong bộ đệm phần cứng ) và sẵn sàng cho việc đọc , và trả về 0 nếu chưa sẵn sàng.

- Hàm này có thể dùng hỏi vòng xem khi nào có data nhận từ RS232 để đọc.

5 /Ví dụ:

a/ Sơ đồ mạch:

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 22: PIC Micro Controller Example - QEI - ADC - InT

TS. Võ Tường Quân Module Điều khiển động cơ DC servo QEI / PID – ADC – INT

Bài giảng Vi Điều Khiển 2011 Page 22

b /Chương trình viết trong CCS:

#include<16F877.h> //khai bao header file, tuong ung chip su dung

#use delay (clock=20M) //su dung xung clock tan so 20MHz

#fuses hs,nowdt,noput,nolvp //khai bao cau hinh cho PIC

#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8) //khai bao RS232 (toc do baud = 9600, dat parity = N, dat chan truyen DL la C6, dat chan nhan la C7, du lieu 8bit)

#byte portB=0X06 // dinh ten portB cho PORTB cua chip

#byte portC=0X07 // dinh ten portC cho PORTC cua chip

#define RS pin_c0 // dinh ten RS la chan RC0 cua chip

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 23: PIC Micro Controller Example - QEI - ADC - InT

TS. Võ Tường Quân Module Điều khiển động cơ DC servo QEI / PID – ADC – INT

Bài giảng Vi Điều Khiển 2011 Page 23

#define RW pin_c1 // dinh ten RW la chan RC1 cua chip

#define E pin_c2 // dinh ten E la chan RC2 cua chip

unsigned char DIG[]={'h',e','l','l','o','#'}; //khai bao chuoi ky tu

unsigned char hienthi;

int8 a=0;

int8 b=0;

//////////==========Cac chuong trinh con=========////////////

void truyen_lenh() //chuong trinh cho phep ghi vao thanh ghi tren LCD

{output_low(RS); //bat che do truyen lenh vào thanh ghi

output_low(RW); //bat bus ghi du lieu

output_high(E); //bat dau cho du lieu qua

delay_ms(5); //cho thoi gian truyen du lieu

output_low(E); //tat du lieu va da san sang ghi du lieu

delay_ms(5);} //cho thoi gian dong du lieu

//////////////////////////////////////////

void truyen_du_lieu() //chuong trinh ghi du lieu vao RAM va hien thi len LCD

{output_high(RS); //bat che do doc du lieu can hien thi

output_low(RW); //bat bus ghi du lieu vao RAM

output_high(E); //bat dau cho du lieu qua

delay_ms(5); //cho thoi gian truyen du lieu

output_low(E); //tat du lieu va da san sang ghi du lieu

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 24: PIC Micro Controller Example - QEI - ADC - InT

TS. Võ Tường Quân Module Điều khiển động cơ DC servo QEI / PID – ADC – INT

Bài giảng Vi Điều Khiển 2011 Page 24

delay_ms(5);} //cho thoi gian dong du lieu

/////////////////chuong trinh xuat chuoi hello ra dòng 1 của LCD//////////////////////////

void write_to_row1()

{output_b(0x80); //hiễn thị bat dau tại vị trí đầu tiên của dòng 1 trên LCD

Truyen_lenh(); //truyen du lieu vao thanh ghi

while(DIG[a]!='#') //vong lap hien thi chuoi ky tu 'KIEM TRA PHIM4x4 va kiem tra het chuoi

{portB=DIG[a]; //chuyen ky tu hien thi ra portB

Truyen_du_lieu(); //cho phep truyen du lieu va hien thi LCD

delay_ms(5); //thoi gian hien thi tung ky tu

a++; //hien thi ky tu tiep theo

} //hien thi xong chuoi ky tu

a=0;} //xoa bien a

//////////////////////////////////////////

void xoa_LCD() //chuong trinh xoa LCD

{output_b(0x01); //lenh xoa LCD

truyenlenh(); //truyen du lieu vao thanh ghi

delay_ms(5);

}

///////////////////////////////////////////

void hien_thi_du_lieu_nhan() //chuong trinh xuat du lieu ra LCD

{output_b(hienthi); //xuat gia tri phim tuong ung phim duoc nhan

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 25: PIC Micro Controller Example - QEI - ADC - InT

TS. Võ Tường Quân Module Điều khiển động cơ DC servo QEI / PID – ADC – INT

Bài giảng Vi Điều Khiển 2011 Page 25

Truyen_du_lieu(); //cho phep truyen du lieu va hien thi LCD

b++; //tang b len 1; bien b dem so lan hien thi LCD tren hang 2

if(b==16) //kim tra hien thi du 16 ky tu chua

{xoa_LCD(); //neu du 16 lan --> xoa LCD

b=0; //reset bien b

}} //ket thuc chuong trinh

////////////////////////////////////////

////////------------Chuong trinh chinh----------------////////

void main() //chuong trinh chinh

{output_b(0x38); //che do giao tiep 8 bit, hien thi 2x16, font 5x8

Truyen_lenh(); //truyen du lieu vao thanh ghi

output_b(0x0E); //bat den hien thi,bat con tro

truyenlenh(); //truyen du lieu vao thanh ghi

//******************************

Write_to_row1(); //xuat chuoi ‘Hello’ ra hang 1 LCD

output_b(0xC0); //hien thi vi tri dau dong 2

truyenlenh(); //truyen du lieu vao thanh ghi

delay_ms(5);

while(true) //vong lap giao tiep chip va PC

{if(kbhit()) //kiem tra hoan tat nhan du lieu tu PC

{hienthi=getc(); //nhan ky tu tu PC

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 26: PIC Micro Controller Example - QEI - ADC - InT

TS. Võ Tường Quân Module Điều khiển động cơ DC servo QEI / PID – ADC – INT

Bài giảng Vi Điều Khiển 2011 Page 26

Hien_thi_du_lieu_nhan(); //hien thi ky tu nhan duoc len LCD

putc(hienthi); //truyen du lieu ra PC

} //ket thuc 1 lan giao tiep

}} //ket thuc chuong trinh

D/ ỨNG DỤNG NGẮT CỦA VI ĐIỀU KHIỂN

1 / enable_interrupts ( level )

- “level” là tên các ngắt ( GLOBAL để cho phép ngắt ở cấp toàn cục ) - Mọi ngắt của VDK đều có 1 bit cờ ngắt , 1 bit cho phép ngắt . Khi có ngắt thì bit cờ ngắt bị set =1,

nhưng ngắt có họat động được hay không tuỳ thuộc bit cho phép ngắt . Lệnh enable_interrupts (int_xxx ) sẽ bật bit cho phép ngắt . Nhưng tất cả các ngắt đều không thể thực thi nếu bit cho phép ngắt toàn cục = 0 , enable_interrupts( global ) sẽ bật bit này .

VD : để cho phép ngắt timer0 và timer1 hoạt động:

enable_interrupts (int_timer0);

enable_interrupts (int_timer1 ) ;

enable_interrupts ( global ); // chỉ cần dùng 1 lần trừ phi muốn có thay đổi đặc biệt

2 / disable_interrupts ( level ):

- Hàm này vô hiệu 1 ngắt bằng cách set bit cho phép ngắt = 0 . - disable_interrupts ( global ) set bit cho phép ngắt toàn cục =0 , cấm tất cả các ngắt.

3 / ext_int_edge ( source , edge )

- Hàm này thiết lập nguồn ngắt ngoài EXTx là cạnh lên hay cạnh xuống . - source : nguồn ngắt . Trên PIC 18 có 3 nguồn ngắt trên 3 chân EXT0 , EXT1 , EXT2 ứng với source =

0 ,1 , 2 . Các PIC khác chỉ có 1 nguồn EXT nên source = 0 . - edge : chọn cạnh kích ngắt , edge = L_TO_H nếu chọn cạnh lên ( từ mức thấp chuyển lên mức cao )

hay H_TO_L nếu chọn cạnh xuống.

5 /Ví dụ:

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 27: PIC Micro Controller Example - QEI - ADC - InT

TS. Võ Tường Quân Module Điều khiển động cơ DC servo QEI / PID – ADC – INT

Bài giảng Vi Điều Khiển 2011 Page 27

- chương trình sử dụng ngắt khi có sự thay đổi trên chân B4-B7. - Mỗi khi nhấn nút bất kỳ trên B4-B7, sẽ kích ngắt RB, hàm phục vụ ngắt có tên RB_LED được thực thi,

hàm này đơn giản là xuất ra LED ở vị trí tương ứng nhưng trên portD từ D4 – D7.

a/ Sơ đồ mạch:

b /Chương trình viết trong CCS:

#include < 16F877.h >

#device PIC16F877 *=16

#use delay (clock = 20000000 ) //thêm khai báo này nếu ctrình có dùng hàm delay,OSC=20 Mhz

#byte portb = 0x06 //tạo tên danh định portb thay thế địa chỉ portB là 06h

#byte portd = 0x08 //tạo tên danh định portd thay thế địa chỉ portD là 08h

#INT_RB

Void RB_LED ( ) // hàm phục vụ ngắt

{

portd=portb;

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.

Page 28: PIC Micro Controller Example - QEI - ADC - InT

TS. Võ Tường Quân Module Điều khiển động cơ DC servo QEI / PID – ADC – INT

Bài giảng Vi Điều Khiển 2011 Page 28

}

void main ( )

{ set_tris_b ( 0xF0 ) ; // portB = 11110000 , B4-B7 là ngõ vào , B0-B3 là ngõ ra

set_tris_d ( 0x00 ) ; // portD = 00000000 , D0-D7 đều là ngõ ra

enable_interrupts ( INT_RB ) ; // cho phép ngắt RB

enable_interrupts ( GLOBAL ) ; // cho phép ngắt toàn cục

// do chương trình không làm gì khác ngoài việc chờ ngắt nên vòng while này trống không

while( true )

{

}

} //main

Generated by Foxit PDF Creator © Foxit Softwarehttp://www.foxitsoftware.com For evaluation only.