1. Trang chủ >
  2. Kỹ thuật >
  3. Giao thông - Vận tải >

CHƯƠNG 3: THIẾT KẾ, LẬP TRÌNH THIẾT BỊ THU THẬP VÀ TRUYỀN DỮ LIỆU

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (12.58 MB, 123 trang )


-



Tín hiệu thời gian phun nhiên liệu được lấy từ chân tín hiệu #10 hoặc #20 hoặc #30 hoặc

#40 sau một trong bốn kim phun qua một con điện trở 10KΩ về chân digital 3 trên board

Arduino.

 Sử dụng board Arduino và microchip MCP 4921 để giả tín hiệu cảm biến vị trí bàn

đạp ga điều khiển động cơ:



Hình 3.1: Mạch in thiết kế trên Protues điều khiển và thu thập

-



Tín hiệu analog giả tín hiệu cảm biến vị trí bàn đạp ga (VPA) được thu thập từ chân tín



-



hiệu số 8 trên Microchip MCP 4921 thứ I được đưa vào chân A0 board Arduino.

Tín hiệu analog giả tín hiệu cảm biến vị trí bàn đạp ga (VPA2) được thu thập từ chân tín



-



hiệu số 8 trên Microchip MCP 4921 thứ II được đưa vào chân A1 board Arduino.

Chân số 1 và số 6 của cả hai MCP 4921 nối với nhau và nối với chân 5V board Arduino.

Chân số 2 MCP 4921 thứ I nối với chân ra số 10 board Arduino để nhận xung điều chỉnh.

Chân số 2 MCP 4921 thứ II nối với chân ra số 9 board Arduino để nhận xung điều chỉnh.

Chân số 3 của cả hai MCP 4921 nối với nhau và nối về chân ra 13 board Arduino.

Chân số 4 của cả hai MCP 4921 nối với nhau và nối với chân ra 11 board Arduino.

Chân số 5 và 7 của cả hai MCP 4921 nối với nhau và nối về chân GND board Arduino.

Chân số 8 MCP 4921 thứ I đưa tín hiệu đi điều khiển giả tín hiệu chân VPA của cảm



-



biến bàn đạp ga trên ECU động cơ.

Chân số 8 MCP 4921 thứ II đưa tín hiệu đi điều khiển giả tín hiệu chân VPA2 của cảm

biến bàn đạp ga trên ECU động cơ.



-



Và một điều quan trọng là chúng ta cần nối chân GND của Arduino với cực âm của Accu

khởi động trên xe để đồng bộ hóa dữ liệu.



Hình 3.2: Mạch thiết kế 3D trên Protues

 Thiết kế mạch OR bảo vệ bàn đạp ga và linh kiện mạch:



- Mỗi mạch OR gồm 2 điốt và 1 điện trở 1k. Mỗi đầu Anot của điốt được nối với tín hiệu

đi điều khiển. Hai đầu Katot của điốt được nối với nhau và nối với một đầu của điện trở

và nối xuống mass. Từ đầu Katot tạo một ngõ ra thực hiện chức năng điều khiển.



Hình : Các chế độ hoạt động của cổng OR.

- Nguyên lí hoạt động của cổng OR:

- Nếu cả hai đầu A và B đều ở mức 1 thì lúc này 2 điốt được phân cực

thuận và dòng điện sẽ đi qua điốt, khi đó tại đầu A và B sẽ ở mức 1(5V).

Dòng điện k đi xuống GND vì điện trở ở đây có trở kháng lớn. Nếu đầu



A ở mức 1 và đầu B ở mức 0 thì D1 được phân cực thuận và D2 được

phân cực nghịch. Khi đó có dòng chạy qua D1 mà không qua D2 nên

A+B vẫn ở mức 1. Còn nêu A ở mức 0 mà B ở mức 1 thì khi đó có dòng

chạy qua D2 mà không qua D1 nên A+B cũng ở mức 1. Trong trường

hợp Avà B cùng ở mức 0 thì đầu ra A+B ở mức 0 bởi vì khi đó 2 điốt

phân cực nghịch khơng cho dòng chạy qua điốt nên A+B khơng có dòng

điện.

- Hình c là bảng chân lí giá trị vào ra của cổng OR.

- Hình d là giản đồ xung và giản đồ xung đầu ra của cổng OR.

- Thiết kế mạch cổng OR trên board để điều khiển:



Hình 3.1: Mạch “OR” thiết kế trên mơ hình thật



Hình 3.4: Hình vẽ mơ phỏng mạch điện tổng thể



Hình 3.5: Thiết kế hộp bộ thu thập và điều khiển động cơ



3.2. Thiết kế phần mềm

3.2.1. Chương trình Arduino

Arduino sau khi thu thập dữ liệu qua các chân trên board Arduino sẽ gửi dữ liệu qua giắc

nối USB type B trên Arduino của một đầu cáp nối đến đầu nối còn lại USB type A trên máy

tính.



Hình 3.1: Cáp kết nối Arduino và máy tính

Máy tính sử dụng Serial để giao tiếp với Arduino thơng qua Serial Monitor: máy tính sẽ

mở cổng COM sau đó các nội dung trong output buffer của Arduino sẽ được truyền qua máy

tính và lưu ở input buffer. Máy tính đọc những dòng đó rồi quy ra lệnh (Serial Command),

đồng thời trên Arduino cũng song song tồn tại phương thức ấy.



Hình 3.2: Giao tiếp giữa máy tính và Arduino

-



Sơ đồ khối đọc tín hiệu từ 5 chân Analog trong chương trình Arduino:



Hình 3.3: Sơ đồ khối đọc tín hiệu từ các chân tín hiệu

-



Sơ đồ khối đọc tín hiệu xung IGT và tín hiệu xung #10 hoặc #20:



Hình 3.4: Sơ đồ khối đọc tín hiệu xung IGT

-



Gửi tín hiệu đọc được từ Arduino lên máy tính:



Hình 3.5: Sơ đồ khối Gửi tín hiệu đọc được từ Arduino lên máy tín



 Chương trình lập trình trên Arduino

1- #include "SPI.h" // necessary library

2- byte comdata[2] = {0}, receive = 0;

3- int n = 0, flag = 0, led_analog1 = 0, led_analog2 = 0, analog_read1 = 0,

analog_read2 = 0, digital_read1 = 0, digital_read2 = 0;

4- int del=0; // used for various delays

5- word outputValue1 = 0, outputValue2 = 0; // a word is a 16-bit number

6- byte data = 0; // and a byte is an 8-bit number

7- int THA, THW, VG, VTA;

8- const int pin1 = 3;

9- const int pin0 = 2;

10- unsigned long thoigianmuccao1, biencux1, biencuy1, thoigianmucthap1;

11- unsigned long thoigianmuccao0, biencux0, biencuy0, thoigianmucthap0;

12- unsigned long chuky, tocdo;

13- void setup()

14- { Serial.begin(115200);

//set pin(s) to input and output

15- pinMode(10, OUTPUT);

16- pinMode(9, OUTPUT);

17- SPI.begin(); // wake up the SPI bus.

18- SPI.setBitOrder(MSBFIRST);

19- digitalWrite(10, HIGH);

20- digitalWrite(9, HIGH);

21- pinMode(3, INPUT_PULLUP);

22- pinMode(2, INPUT_PULLUP);

23- attachInterrupt(1, ngat1, FALLING);

24- attachInterrupt(0, ngat0, FALLING);

252627282930313233343536-



}

void ngat1()

{

detachInterrupt(1);

if (digitalRead(pin1) == LOW)

{

thoigianmuccao1 = micros() - biencuy1;

biencux1 = micros();

attachInterrupt(1, ngat1, RISING);

}

else

{



3738394041-



thoigianmucthap1 = micros() - biencux1;

biencuy1 = micros();

attachInterrupt(1, ngat1, FALLING);

}

}



42434445464748495051525354555657-



void ngat0() {

detachInterrupt(0);

if (digitalRead(pin0) == LOW)

{

thoigianmuccao0 = micros() - biencuy0;

biencux0 = micros();

attachInterrupt(0,ngat0,RISING);

}

else

{

thoigianmucthap0 = micros() - biencux0;

biencuy0 = micros();

attachInterrupt(0,ngat0,FALLING);

}

chuky = thoigianmuccao0 + thoigianmucthap0;

}



585960616263646566676869707172-



void loop()

{

if (Serial.available() > 0)

{

receive = Serial.read();

n++;

if (receive == 'a')

{

flag = 1;

n = 0;

}

if (receive == 'b')

{

flag = 2;

}



73747576-



if ((flag == 1) & (n != 0))

{

comdata[n - 1] = receive;

}



77- led_analog1 = comdata[0];

78- led_analog2 = comdata[1];

7980818283848586878889-



}

outputValue1 = map(led_analog1,0,100,647,2875); // VPA: 0.8V --> 3.54V

outputValue2 = map(led_analog1,0,100,1248,3521); // VPA2: 1.2V --> 4.33V

digitalWrite(10, LOW);

data = highByte(outputValue1);

data = 0b00001111 & data;

data = 0b00110000 | data;

SPI.transfer(data);

data = lowByte(outputValue1);

SPI.transfer(data);

digitalWrite(10, HIGH);



9091929394959697-



digitalWrite(9, LOW);

data = highByte(outputValue2);

data = 0b00001111 & data;

data = 0b00110000 | data;

SPI.transfer(data);

data = lowByte(outputValue2);

SPI.transfer(data);

digitalWrite(9, HIGH);



98- tocdo = 1000000 * 60 / chuky;

99- int a0 = analogRead(A0);

100int a1 = analogRead(A1);

101THA = analogRead(A2);

102THW = analogRead(A3);

103VG = analogRead(A4);

104VTA = analogRead(A5);

105Serial.print('a');

106Serial.print(a0);

107Serial.print('b');

108Serial.print(a1);

109Serial.print("c");

110- Serial.print(THA);

111- Serial.print("d");

112-Serial.print(THW);

113- Serial.print("e");

114- Serial.print(VG);

115- Serial.print("f");

116- Serial.print(VTA);



117- Serial.print("g");

118- Serial.print(thoigianmuccao0);

119- Serial.print("h");

120Serial.print(thoigianmucthap1);

121Serial.print("i");

122Serial.print(tocdo);

123}

 Giải thích code

 Khai báo biến

#include "SPI.h" // necessary library

byte comdata[2] = {0}, receive = 0;

int n = 0, flag = 0, led_analog1 = 0, led_analog2 = 0, analog_read1 = 0,

analog_read2 = 0, digital_read1 = 0, digital_read2 = 0;

int del=0; // used for various delays

word outputValue1 = 0, outputValue2 = 0; // a word is a 16-bit number

byte data = 0; // and a byte is an 8-bit number

int THA, THW, VG, VTA;

const int pin1 = 3;

const int pin0 = 2;

unsigned long thoigianmuccao1, biencux1, biencuy1, thoigianmucthap1;

unsigned long thoigianmuccao0, biencux0, biencuy0, thoigianmucthap0;

unsigned long chuky, tocdo;



Dòng 1-12: khai báo thư viện sử dụng (SPI), khai báo biến dữ liệu để điều khiển bàn đạp ga,

biến dữ liệu cho chương trình con để ngắt và xử lí xung.



Kiểu dữ liệu

Int



Ý nghĩa

Kiểu Int là kiểu số nguyên. Kiểu int chiếm 2 byte bộ nhớ.

Có giá trị từ -32,768 đến 32,767 (từ ) (16 bit).



Byte



Là một kiểu dữ liệu biểu diễn số nguyên nằm trong khoảng từ 0 đến 255. Mỗi biến

mang kiểu byte chiếm 1 byte bộ nhớ



word



Kiểu dữ liệu này là kiểu số nguyên 16 bit không âm (chứa các giá trị từ 0 đến

65535), và nó chiếm 2 byte bộ nhớ.



Unsigned long



Là kiểu số nguyên nằm trong khoảng từ 0 đến 4,294,967,295 ( 0 đến . Mỗi biến

mang kiểu dữ liệu này chiếm 4 byte bộ nhớ.



Const int



Giống như khai báo kiểu int nhưng giá trị của biến cố định được gán

cho các chân ( như chương trình trên pin1 gán cho chân digital 3).



 Chương trình setup( )

Ở phần này khi chương trình được khởi động, bạn có thể sử dụng nó để khai báo

biến, khai báo thư viện. thiết lập các thông số, khởi tạo chương trình ngắt, đặt chế

độ cho các chân (nhận hay xuất tín hiệu) ,…. Hàm setup() này chỉ chạy một lần

sau khi cấp nguồn hoặc reset mạch.

 Bắt đầu từ dòng 13-25:

Dòng 14: Serial.begin(115200);

Thư viện Serial được dùng trong giao tiếp giữa các board mạch với nhau (hoặc

board mạch với máy tính hoặc với các thiết bị khác). Tất cả các mạch Arduino

đều có ít nhất 1 cổng Serial (hay còn được gọi là UART hoặc USART). Giao tiếp

Serial được thực hiện qua 2 cổng digital 0(RX) VÀ 1(TX) hoặc qua cổng USB tới

máy tính. Vì vậy ở dòng 14 của chương trình chúng ta khởi tạo giao tiếp. Giá trị

baudrate được đặt là 115200. Khi sử dụng bảng Serial monitor trong Arduino IDE

ta chọn giá trị baudrate giống như khi lập trình.

 Dòng 15-16, 21-22:

pinMode(10, OUTPUT);

pinMode(9, OUTPUT);

pinMode(3, INPUT_PULLUP);

pinMode(2, INPUT_PULLUP);

Hàm pinMode(pin, mode) với pin là chân digital mà mình muốn thiết đặt và mode

là cấu hình một pin quy định hoạt động như là một đầu vào (INPUT) hoặc đầu ra



Xem Thêm
Tải bản đầy đủ (.docx) (123 trang)

×