23
LỜI NÓI ĐẦU Ngày nay những ứng dụng của vi điều khiển đã đi sâu vào đời sống sinh hoạt và sản xuất của con người, là một phần tất yếu không thể thiếu trong đời sống hiện đại. Thế kỉ 21 được xem là thế kỉ của khoa học công nghệ, là thế kỉ mà máy móc được thiết kế và điều khiển một cách tự động để thay thế các hoạt động của con người trong sản xuất, cũng như để phục vụ các công việc trong sinh hoạt. Trong tự động hóa thì các mạch vi xử lí như là một công cụ đắc lực, quan trọng, hỗ trợ con người thực hiện những nhu cầu của mình. Đang là sinh viên đang ngồi trên ghế nhà trường, cơ hội tiếp cận, học tập với những công nghệ tiên tiến, hiện đại chưa nhiều, nên trong quá trình tự học và tìm tòi, nhóm chúng em đã tìm hiểu về PIC16F877A cũng như các ứng dụng của nó trong các hệ VXL. Với những gì tìm hiểu được, nhóm chúng em đã thực hành thiết kế ứng dụng sử dụng VXL để thiết kế mạch đo tần số và công suất của lưới điện 220VAC. Đây là cơ hội tốt cho chúng em trau dồi kiến thức thực tế, áp dụng những lí thuyết đã học và rèn luyện bản thân trong môi trường làm việc theo nhóm.

Bài Tập VĐK & Ứng Dụng

Embed Size (px)

DESCRIPTION

mạch đo công suất & tần số có giao tiếp với máy tính

Citation preview

LI NI U

LI NI U

Ngy nay nhng ng dng ca vi iu khin i su vo i sng sinh hot v sn xut ca con ngi, l mt phn tt yu khng th thiu trong i sng hin i. Th k 21 c xem l th k ca khoa hc cng ngh, l th k m my mc c thit k v iu khin mt cch t ng thay th cc hot ng ca con ngi trong sn xut, cng nh phc v cc cng vic trong sinh hot. Trong t ng ha th cc mch vi x l nh l mt cng c c lc, quan trng, h tr con ngi thc hin nhng nhu cu ca mnh.

ang l sinh vin ang ngi trn gh nh trng, c hi tip cn, hc tp vi nhng cng ngh tin tin, hin i cha nhiu, nn trong qu trnh t hc v tm ti, nhm chng em tm hiu v PIC16F877A cng nh cc ng dng ca n trong cc h VXL. Vi nhng g tm hiu c, nhm chng em thc hnh thit k ng dng s dng VXL thit k mch o tn s v cng sut ca li in 220VAC. y l c hi tt cho chng em trau di kin thc thc t, p dng nhng l thuyt hc v rn luyn bn thn trong mi trng lm vic theo nhm.

Em xin chn thnh cm n thy gio Nguyn Hng Quang nhit tnh hng dn v cho nhng ghp kp thi n chng em trong sut qu trnh hc VXL nng cao v lm sn phm tht ny.

GII THIU CHUNG

ti: Thit k mch o tn s v cng sut ca li in 220VAC

Thi gian nhn ti : tun 6.

Thi gian np sn phm: tun 17.

Cc thnh vin trong nhm:

L Tin S

Nguyn H Thnh Long

Nguyn Thnh Trung

L Quang Hiu

Bi Vit Phng

Yu cu: o cng sut thit b v tn s ca li in 220Vdc

C IM K THUT

S dng Vi iu khin PIC16F877A.

S dng LCD 16x2 hin th kt qu o c.

Giao tip vi my tnh qua cng COM vi chun truyn thng RS232.

CC BC THC HIN

Trn tinh thn lm vic theo nhm, bn em phn chia cng vic v tin hnh nghin cu, thc hin phn cng vic m mnh c nhm giao.

a, Thit k mch nguyn l:

Vn :

thit k mt mch nguyn l cho ti ta t ra cc bc thc hin nh sau:

Thit k mch nguyn l gm cc khi no?

Phng n ti u cho thit k theo nguyn l?

Thit k cc khi cho mch nguyn l:

Khi ngun:

Vic s dng in p xoay chiu ly tn hiu vo nn ta ng thi lm b ngun cho mch s t ti u ha in nng s dng.

ly ngun t ngun xoay chiu ta dng b bin p nhiu u ra vi cc mc:

in p u vo l in p xoay chiu 220Vac

in p u ra ta ly cc mc in p xoay chiu 0Vdc, 6Vdc, 15Vdc.

Mch iu khin v mch to tn s yu cu cp ngun 5Vdc v 9Vdc. Nh vy to in p mt chiu t cc mc xoay chiu ta thc hin chnh lu hai na chu k v s dng IC 7809 v 7805 n p in p u ra cp cho mch.

S nguyn l cho khi ngun:

Khi vi iu khin v to tn hiu o tn s:

Khi vi iu khin gm chip PIC16f877a, b giao ng thch anh 20MHz, b reset v cng ISCP s dng np cho chip.

Khi to tn hiu o tn s gm LM324, cc tr, Transistor NPN.

S nguyn l cho khi vi iu khin v tn hiu o tn s:

Khi hin th LCD 16x2:

S dng LCD 4bits vi cc chn t D4-D7, hai chn RS v EN c ni vi chip PIC16F877A cho php LCD v reset LCD bin tr tinh chnh cho nt ca ch.

S nguyn l cho khi LCD 16x2: Khi truyn tin RS232:

Khi truyn tin s dng 4 t ha 1uF v IC Max232 cng cng Com Female 9 chn.

S nguyn l cho khi RS232:

Khi chun ha tn hiu u vo cho AD7755 v ly tn hiu ra:

S dng mt cap 8 chn ni mch AD7755 v cc chun u vo cng tn hiu ra, s dng bin dng CT100P ly tn hiu dng cho AD7755.

S nguyn l cho khi chun ha tn hiu u vo cho AD7755 v ly tn hiu ra:

Khi AD7755:

Khi AD7755 bao gm mt IC AD7755, b reset, b to dao ng, cap ni v cc t gm, t ha.

S nguyn l cho khi AD7755:

b, Thit k mch in (PCB)

Ta tch hai mch ring bit gm mt mch in dnh cho AD7755 s dng chip dn 24 chn v mt mch in cho khi cn li.

c, Lp trnh cho PIC 16F877A b Capture

CCP (Capture/Compare/PWM) bao gm cc thao tc trn cc xung m cung cp bi cc b m Timer1 v Timer2. PIC16F877A c tch hp sn hai khi CCP : CCP1 v CCP2.Mi CCP c mt thanh ghi 16 bit (CCPR1H:CCPR1L v CCPR2H:CCPR2L), pin iu khin dng cho khi CCPx l RC2/CCP1 v CCPy l RC1/T1OSI/CCP2.

C CCP1 v CCP2 v nguyn tc hot ng u ging nhau v chc nng ca tng khi l kh c lp. Tuy nhin trong mt s trng hp ngoi l CCP1 v CCP2 c kh nng phi hp vi nhau to ra cc hin tng c bit (Special event trigger) hoc cc tc ng ln Timer1 v Timer2. Cc trng hp ny c lit k trong bng sau:

Timer1:

Timer1 l b nh thi 16 bit, gi tr ca Timer1 s c lu trong hai thanh ghi (TMR1H:TMR1L). C ngt ca Timer1 l bit TMR1IF (PIR1).Bit iu khin ca Timer1 s l TMR1IE (PIE).

Cc thanh ghi lin quan n Timer1 bao gm:

- INTCON (a ch 0Bh, 8Bh, 10Bh, 18Bh): cho php ngt hot ng (GIE

v PEIE).

- PIR1 (a ch 0Ch): cha c ngt Timer1 (TMR1IF).

- PIE1( a ch 8Ch): cho php ngt Timer1 (TMR1IE).

- TMR1L (a ch 0Eh): cha gi tr 8 bit thp ca b m Timer1.

- TMR1H (a ch 0Eh): cha gi tr 8 bit cao ca b m Timer1.

- T1CON (a ch 10h): xc lp cc thng s cho Timer1.

S dng ngn ng CCS ta lp trnh cho b Capture nh sau:

#bit TMR1IF = 0x0C.0

int16 CCP1Value; // Gia tri CCP1 hien tai

int16 CCP1OldValue;// Gia tri CCP1 truoc do

int16 CCP2Value;//Gia tri CCP2 hien tai

int16 CCP2OldValue;// Gia tri CCP2 truoc do

BOOLEAN CCP1Captured;

BOOLEAN CCP2Captured;

float Capac,Freq;

int8 char1,char2,char3,char4,char5,char6,char7,char8;

#int_CCP1

void CCP1_isr()

{

if(TMR1IF)

{

CCP1Value = CCP_1 +(65535-CCP1OldValue);

CCP1OldValue = CCP_1;

TMR1IF=0;

}

else

{

CCP1Value = CCP_1 - CCP1OldValue;

CCP1OldValue = CCP_1;

}

CCP1Captured = TRUE;

}

#int_CCP2

void CCP2_isr()

{

if(TMR1IF)

{

CCP2Value = CCP_2 +(65535-CCP2OldValue);

CCP2OldValue = CCP_2;

TMR1IF=0;

}

else

{

CCP2Value = CCP_2 - CCP2OldValue;

CCP2OldValue = CCP_2;

}

CCP2Captured = TRUE;

}

//--------------------------------------------------------------------------

#int_TIMER1

void Timer1_isr()

{

if (RB0==1)

RB0=0;

else

RB0=1;

}

void Init_ccp(void)

{

SETUP_CCP1(CCP_CAPTURE_RE);

SETUP_CCP2(CCP_CAPTURE_RE);

SETUP_TIMER_1(T1_INTERNAL|T1_DIV_BY_8);

CCP1Value = 0;

CCP1OldValue = 0;

CCP2Value = 0;

CCP2OldValue = 0;

CCP1Captured = 1;

CCP2Captured = 1;

ENABLE_INTERRUPTS(INT_CCP1);//enable_interrupts(INT_TIMER1);

ENABLE_INTERRUPTS(INT_CCP2);//enable_interrupts(INT_TIMER1);

ENABLE_INTERRUPTS(GLOBAL);

}

void Convert_CCP1()

{

long temp;

int16 temp1,temp2;

Capac = 1.0/((float)CCP1Value*1.6e-6);

// F = 1/T

// Timer1 prescaler DIV_BY_8

// Pic16F877A 4MHz -> 0.000001 * 8 = 1uS * 8

// PIC16f877a 20MHz -> 0.0000002 * 8

temp = (long)Capac;

char1 = ((temp / 1000) + 0x30);

temp1 = (temp % 1000);

char2 = ((temp1 / 100) + 0x30);

temp2 = (temp1 % 100);

char3 = ((temp2 / 10) + 0x30);

char4 = ((temp2 % 10)+ 0x30);

}

void Convert_CCP2()

{

long temp3;

int16 temp4,temp5;

Freq = 1.0/((float)CCP2Value*1.6e-6);

temp3 = (long)Freq;

char5 = ((temp3 / 1000) + 0x30);

temp4 = (temp3 % 1000);

char6 = ((temp4 / 100) + 0x30);

temp5 = (temp4 % 100);

char7 = ((temp5 / 10) + 0x30);

char8 = ((temp5 % 10)+ 0x30);

}

d, Phn giao tip RS232 gia PIC16F877A vi my tnh nh giao din USARTYu cu ca giao din l gip giao tip trao i thng tin gia ngi dng vi pic. V l giao tip qua giao din UART nn phi thng nht gia my tnh v vi iu khin: tc baud(9600), khung truyn(s bit=8, khng c parity bit v stop bits =1). cho tin dng giao din ngi dng s c y cc thng s ci t cho ngi dng tha mi la chn.

V cch thc s dng giao din sau khi ci t cc tham s ph hp vi UART v kt ni th khi mun bit thng tin v tr s ca cng sut hay tn s ca dng in th nhn vo cc nt tng ng th k t tng ng vi cc nt s c gi xung(tn s l f,cng sut lp)vi x l, khi s nhn c cc gi tr tng ng hin th trn giao din .

y l 1 phn lp trnh trn vi iu khin thc hin chc nng ny:

#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)/* y l khai bo ci t cc thng s cho RS232 ni trn*/

#int_RDA

void Receive_Send_isr()

{

char c;

c=getc();

if(c=='p')

{

printf("%c%c%c%c",char1,char2,char3,char4);

}

if(c=='f')

{

printf("%c%c%c%c",char5,char6,char7,char8);

}

}

e, Giao din giao tip my tnh bng C#

hnh nh giao din

m ngun chng trnh:using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.IO;

using System.IO.Ports;

using System.Xml;

namespace VDK

{

public partial class Form1 : Form

{

SerialPort P = new SerialPort();

int a = 0;

int q = 0;

int p = 0;

int b = 0;

int k = 0;

int l = 0;

string InputData = String.Empty;

string InputData1 = String.Empty;

delegate void SetTextCallback(string text);

public Form1()

{

InitializeComponent();

string[] ports = SerialPort.GetPortNames();

comboBox1.Items.AddRange(ports);

P.ReadTimeout = 1000;

P.DataReceived += new SerialDataReceivedEventHandler(DataReceive);

string[] BaudRate = { "1200", "2400", "4800", "9600", "19200", "38400", "57600", "115200" };

comboBox2.Items.AddRange(BaudRate);

string[] Databits = { "6", "7", "8" };

comboBox3.Items.AddRange(Databits);

string[] Parity = { "None", "Odd", "Even" };

comboBox4.Items.AddRange(Parity);

string[] stopbit = { "1", "1.5", "2" };

comboBox5.Items.AddRange(stopbit);

}

private void Form1_Load(object sender, EventArgs e)

{

// button2.Enabled = false;

comboBox1.SelectedIndex = 0;

comboBox2.SelectedIndex = 3; // 9600

comboBox3.SelectedIndex = 2; // 8

comboBox4.SelectedIndex = 0; // None

comboBox5.SelectedIndex = 0; // None

status.Text = "Hy chn 1 cng COM kt ni.";

}

private void button3_Click(object sender, EventArgs e)

{

textBox1.Text = "";

textBox2.Text = "";

}

private void textBox1_TextChanged(object sender, EventArgs e)

{

}

private void comboBox2_SelectedIndexChanged(object sender, EventArgs e)

{

if (P.IsOpen)

{

P.Close();

}

P.BaudRate = Convert.ToInt32(comboBox2.Text);

}

private void comboBox4_SelectedIndexChanged(object sender, EventArgs e)

{

if (P.IsOpen)

{

P.Close();

}

switch (comboBox4.SelectedItem.ToString())

{

case "Odd":

P.Parity = Parity.Odd;

break;

case "None":

P.Parity = Parity.None;

break;

case "Even":

P.Parity = Parity.Even;

break;

}

}

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)

{

if (P.IsOpen)

{

P.Close();

}

P.PortName = comboBox1.SelectedItem.ToString();

}

private void comboBox3_SelectedIndexChanged(object sender, EventArgs e)

{

if (P.IsOpen)

{

P.Close();

}

P.DataBits = Convert.ToInt32(comboBox3.Text);

}

private void button1_Click(object sender, EventArgs e)

{

try

{

P.Open();

button2.Enabled = true;

button1.Enabled = false;

// Hin th Status

status.Text = "ang kt ni vi cng " + comboBox1.SelectedItem.ToString();

}

catch (Exception ex)

{

MessageBox.Show("Khng kt ni c.", "Th li", MessageBoxButtons.OK, MessageBoxIcon.Error);

}

}

private void button2_Click(object sender, EventArgs e)

{

P.Close();

button1.Enabled = true;

button2.Enabled = false;

status.Text = " Ngt Kt Ni";

}

private void textBox1_TextChanged_1(object sender, EventArgs e)

{

}

private void comboBox5_SelectedIndexChanged(object sender, EventArgs e)

{

if (P.IsOpen)

{

P.Close();

}

switch (comboBox5.SelectedItem.ToString())

{

case "1":

P.StopBits = StopBits.One;

break;

case "1.5":

P.StopBits = StopBits.OnePointFive;

break;

case "2":

P.StopBits = StopBits.Two;

break;

}

}

private void button4_Click(object sender, EventArgs e)

{

DialogResult kq = MessageBox.Show("Bn thc s mun thot", "VDK", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

if (kq == DialogResult.Yes)

{

MessageBox.Show("Cm n bn s dng chng trnh", "VDK");

this.Close();

}

}

private void toolStripStatusLabel1_Click(object sender, EventArgs e)

{

}

private void button6_Click(object sender, EventArgs e)

{

p = 0;

if (P.IsOpen)

{

P.Write("p");

a = 1;

b = 0;

textBox1.Text = "";

p = 0;

}

else MessageBox.Show("COM cha m.", "Thng bo", MessageBoxButtons.OK, MessageBoxIcon.Error);

}

private void DataReceive(object obj, SerialDataReceivedEventArgs e)

{

InputData = P.ReadExisting();

if (InputData != String.Empty)

{

SetText(InputData);

}

}

private void SetText(string text)

{

here:

if (a==1&&b==0)

{

if (this.textBox1.InvokeRequired)

{

SetTextCallback d = new SetTextCallback(SetText);

this.Invoke(d, new object[] { text });

}

else

{

this.textBox1.Text += text;

}

}

if(b==1&&a==0)

{

for (int i = 1; i < 100; i++) ;

if (this.textBox2.InvokeRequired)

{

SetTextCallback d = new SetTextCallback(SetText);

this.Invoke(d, new object[] { text });

}

else

{

this.textBox2.Text += text;

}

}

}

private void button5_Click(object sender, EventArgs e)

{

q = 0;

if (P.IsOpen)

{

P.Write("f");

a = 0;

b = 1;

textBox2.Text = "";

q = 0;

}

else MessageBox.Show("COM cha m.", "Thng bo", MessageBoxButtons.OK, MessageBoxIcon.Error);

}

private void label2_Click(object sender, EventArgs e)

{

}

private void label7_Click(object sender, EventArgs e)

{

}

}

}

KT QU T C

Qua thi gian nghin cu, tm ti v c s hng dn nhit tnh ca thy gio mn hc, nhm hon thnh c sn phm tht v cho chy.

( xem sn phm )

KT LUN

Sau thi gian di c gng tm hiu v nghin cu, nhm thu c nhng kt qu tt v tip thu c thm nhiu kin thc v kinh nghim v lm vic vi vi iu khin, vi x l, ng thi bit cch phn chia cng vic theo nhm v pht huy sc mnh lm vic chung. Hon thnh tt BTL l mt bc quan trng gip cc sinh vin p dng c nhng l thuyt trn ging ng vo thc t lm vic v sn xut.

TI LIU THAM KHO

Datasheet PIC16F877A.

Datasheet AD7755

Datasheet MAX232.

Datasheet LM324

Website: http://www.dientuvietnam.net/ Website: http://www.picvietnam.com/ Website: http://dtvt.org/