32 Sơ đồ mạch điện mô hình điều khiển góc đánh lửa động cơ

Một phần của tài liệu Mô hình điều khiển góc đánh lửa động cơ (Trang 48)

Nguyên lý làm việc

Khi cấp nguồn cho mô hình hoạt động thì Arduino sẽ nhận và xử lí các tín hiệu từ các cảm biến như tín hiệu tốc độ động cơ điện gửi về cảm biến tốc độ NJK5002C, tín hiệu nhiệt độ của cảm biến nhiệt độ nước làm mát, tín hiệu kích nổ, tín hiệu thay đổi tốc độ và giả lập độ mở bướm ga (tải) của biến trở. Từ những cơ sở lý thuyết ban đầu được lập trình cho Arduino thì Arduino sẽ đóng vai trò thay thế cho ECU động cơ để xử lí tín hiệu và điều khiển thay đổi góc đánh lửa sao cho tối ưu nhất với các chế độ làm việc khác nhau.

Hình 3. 33 Sơ đờ thuật tốn điều khiển  Lập trình điều khiển

Sử dụng phần mềm Arduino IDE để lập trình cho Arduino. Arduino IDE là một phần mềm mã nguồn mở chủ yếu được sử dụng để viết và biên dịch mã vào module Arduino. Đây là một phần mềm Arduino chính thức, giúp cho việc biên dịch mã trở nên dễ dàng mà ngay cả một người bình thường không có kiến thức kỹ thuật cũng có thể làm được. Nó có các phiên bản cho các hệ điều hành như MAC, Windows, Linux và chạy trên nền tảng Java đi kèm với các chức năng và lệnh có sẵn đóng vai trò quan trọng để gỡ lỗi, chỉnh sửa và biên dịch mã trong môi trường. Có rất nhiều các module Arduino như Arduino Uno, Arduino Mega, Arduino Leonardo, Arduino Micro và nhiều module khác. Mỗi module chứa một bộ vi điều khiển trên bo mạch được lập trình và chấp nhận thông tin dưới dạng mã. Mã chính, còn được gọi là sketch, được tạo trên nền tảng IDE sẽ tạo ra một file Hex, sau đó được chuyển và tải lên trong bộ điều khiển trên bo. Môi trường IDE chủ yếu chứa hai phần cơ bản: Trình chỉnh sửa và Trình biên dịch, phần đầu sử dụng để viết mã được yêu cầu và phần sau được sử dụng để biên dịch và tải mã lên module Arduino. Môi trường này hỗ trợ cả ngôn ngữ C và C ++.

CHƯƠNG 4: THỰC NGHIỆM VÀ ĐÁNH GIÁ KẾT QUẢ

Nhóm chúng em đã cho mô hình hoạt động thực nghiệm ở tất cả các chế độ như trong bảng số liệu đề ra ban đầu và nhận thấy rằng mô hình hoạt động đúng như tính tốn thiết kế. Dưới đây là mợt sớ hình ảnh kết quả trong quá trình thực nghiệm

 Chế độ tải là 0%, tốc độ < 1500v/p thì góc đánh lửa đang là 18 độ.

 Chế độ tải 20%, tốc độ 1500-3000v/p thì góc đánh lửa là 31,75 độ.

 Chế độ tải 40%, tốc độ 1500-3000v/p, thì góc đánh lửa là 32,75 độ

 Chế độ tải 40%, tốc độ 1500-3000v/p, thì góc đánh lửa là 32,75 độ

 Chế độ tải 100%, tốc độ > 7500v/p, thì góc đánh lửa là 34,66 độ.

Qua những hình ảnh trong quá trình hoạt động thì ta nhận thấy mô hình hoạt động đúng theo những thông số ban đầu chọn, với những ảnh hưởng của tốc độ, mức độ tải, nhiệt độ nước làm mát và cảm biến kick nổ sẽ làm cho góc đánh lửa thay đổi từ đó làm tối ưu góc đánh lửa từ đó cải thiện được công suất cơ

KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN

Qua quá trình thực hiện và hoàn thiện đề tài nhóm có rút ra được một số kết luận về đề tài như sau:

Mô hình tự động điều khiển thay đổi góc đánh lửa phù hợp với tốc độ và tải như thông số đề ra ban đầu.

Mô hình giảm được góc đánh lửa khi xảy ra hiện tượng kích nổ. Bên cạnh đó có thể tăng, giảm được góc đánh lửa khi thay đổi nhiệt độ.

Hướng phát triển:

Vì còn hạn chế về thời gian và năng lực nên đề tài chỉ dừng ở mức nghiên cứu chế tạo mô hình hoạt động được trên cơ sở lý thuyết chứ chưa thực nghiệm thực tế trên một động cơ. Trong tương lai có thể phát triển đề tài theo các hướng như:

 Đĩa phát tín hiệu có nhiều răng để Arduino có thể tính toán góc đánh lửa nhanh và chính xác hơn

 Biên độ của các dải tốc độ và tải nhỏ lại để tối ưu và phù hợp với chế độ hoạt động thực tế của động cơ

 Lắp đặt hồn chỉnh trên đợng cơ thực tế để có thể đánh giá được hiệu quả, từ đó phát triển thành sản phẩm thương mại.

TÀI LIỆU THAM KHẢO

[1] Tài liệu “kết cấu động cơ đốt trong”,ThS.Nguyễn Lê Châu Thành. [2] Lê Đức Thắng “Tổng quan về hệ thống đánh lửa trên ô tô”, 2020. [3] Vương Ngọc Sang “Thiết kế hệ thống đánh lửa trên ô tô”

PHỤ LỤC

TCCR1B = _BV(CS00) | _BV(CS01); //Prescale = 64, but a little faster, maybe

TIMSK1 |= (1 << OCIE1A); // enable timer compare interrupt: sei(); // enable global interrupts:

}

//----------------------------------------------------------------------- //Interrupt 0 ISR

//Capture the 3 South Hall Semsor Falling Pulse for use in reading RPMs //Not used at present

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

void beam_interrupt() //Capture 3 South magnets, Hall Effect sensor Falling pulse,

{

++_hits;

}

//Interrupt 1 ISR

//Capture the North Hall Sensor signal for use in trigger signal and also //use it in reading RPMs

//------------------------------------------------------------------------ void beam_interruptN()

{

//Develop "oneDegree" by counting the time between N Magnets on the rotor //This is THE KEY value I use to calculate ignition timing and rpm

unsigned long etCorrected =elapsedTime +1980; oneDegree = etCorrected/360.0;

previousStartTime = currentMicros;

//Start timer1, using Prescale value of 64 TCCR1B = _BV(CS00) | _BV(CS01);

}

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

//Timer1 Compare Match ISR: This routine fires at the end of the icnition timing delay period

ISR(TIMER1_COMPA_vect) {

//global disable interrupts cli();

TCCR1B &= ~(_BV(CS10) | _BV(CS11) | _BV(CS12)); // Stop the counter TCNT1 = 0; //Rest the counter to zero

digitalWrite(7, !digitalRead(7)); //This line is here for debugging, only to toggle an LED on Pin 7

//whenever timer1 reaches compare match to prove that the timer IS working

makeSparks(); //Coil charging function. sei(); //Global enable interrupts

}

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

//times out, and ends with a spark and a Strobe LED void makeSparks()

{

if(sparkOn) {

digitalWrite(triggerPin, HIGH); //This is where coil charging begins

delayMicroseconds(3000); //This fixes Coil Charge peroid at 3 milliseconds (strobe 50 usec + 2950 usec)

digitalWrite(triggerPin, LOW); //This is where the spark actually occurs.

digitalWrite(strobeLed, HIGH);

delayMicroseconds(50); //This is the on-period for the strobe. digitalWrite(strobeLed, LOW);

} }

//--------------Main Loop To Calculate RPM, Update LCD Display and Serial Monitor------ ----------

void loop() {

//Beginning of Code to measure loop time unsigned long startLoopCount = micros(); //End of Code to measure loop time

rpm =1000000 * 60/(oneDegree * 360); // time for one revolution;

advance = ((((180 + sparkTimingDegrees)* oneDegree)-3000)/4); //This divide by 4 works well,

// displayRPM_LCD(); //Only turned on for testing. Takes too long!!! displayRPM_Serial(); //Much shorter than I2C LCD.

//Ignition delay calculations here: //---------------------------------

if (rpm <130) {

//0 to 100 rpms; too slow, no sparks sparkOn = false; sparkTimingDegrees = 10; } else if (rpm < 1001) {

// 101 to 1000 rpms; cranking, make 10 degree retarded sparks advancePeriod = (oneDegree * 10); sparkOn = true; sparkTimingDegrees = 10; } else if (rpm < 2600) {

// 1001 to 5600 rpms; running okay, make 20 degree advanced sparks advancePeriod = (oneDegree *-20);

sparkOn = true;

sparkTimingDegrees = -20; }

else

if (rpm < 2900) {

//retard spark to 40 degrees advancePeriod = (oneDegree * 40); sparkOn = true; sparkTimingDegrees = 40; } else if (rpm < 3000) //if (advanceRange <(5172 - 20))

{// 5801 to infinity rpms; hard overspeed range; no sparks //sparkOn = false;

sparkTimingDegrees = 60; }

//End ignition delay code //-----------------------

//Last part of Code to measure loop time unsigned long end = micros();

delta = end - startLoopCount;

//End of Code to measure loop time }

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

//End of the Loop-----End of the Loop----End Of The Loop==== //-----------------------------------------------------------

{

lcd.setCursor(0, 1);

lcd.print(" "); //To clear the previous reading lcd.setCursor(0, 1); lcd.print(rpm); lcd.setCursor(0, 3); lcd.print(" "); lcd.setCursor(0, 3); lcd.print(delta); } void displayRPM_Serial() { Serial.print(rpm); Serial.print(" "); Serial.print(delta); Serial.print(" "); Serial.print(oneDegree); Serial.print(" "); Serial.print(OCR1A); Serial.print(" "); Serial.print(OCR1A/rpm); Serial.print(" "); Serial.println(rpm/OCR1A); }

Một phần của tài liệu Mô hình điều khiển góc đánh lửa động cơ (Trang 48)

Tải bản đầy đủ (PDF)

(64 trang)