Thiết kế mạch đọc nhiệt độ và điều khiển nhiệt độ cho mạch sử dụng điện áp 220VAC Hướng cần làm của đề tài: Thực hiện đọc nhiệt độ thực tế từ cảm biến, xác định hàm truyền để xây dựng bộ điều khiển PID, điều khiển điện áp cấp cho bóng đèn làm nóng(do nhóm em dùng Triac nên cần phải xác định điểm không của nguồn 220V để thực hiện điều khiển Triac.) Thiết kế mạch và mô phỏng trên phần mềm mô phỏng proteus. Lập trình cho vi điều khiển . Thiết kế mạch thực tế, kiểm tra các tính năng của mạch thật.
Trang 1MỤC LỤC
CHƯƠNG 1: MỤC TIÊU ĐỀ TÀI 1
CHƯƠNG 2: PHƯƠNG PHÁP TRIỂN KHAI ĐỀ TÀI 2
1 Chọn vi điều khiển 2
2 Cảm biến và các linh kiện liên quan 3
2.1 Cảm biến Pt100 3
2.2 Cảm biến LM35 5
2.3 Triac 6
3 Thiết kế mô phỏng và kết quả 6
3.1 Khối nguồn 6
3.2 Điều khiển nhiệt độ: 7
3.3Thiết kế mạch trên Altium 10
3.4 Xác định hàm truyền của hệ thống và bộ điều khiển PID 10
3.4 Thiết kế chương trình 11
CHƯƠNG 3: KẾT QUẢ THỰC NGHIỆM 12
CHƯƠNG 4: KẾT LUẬN 12
1 Những điểm làm được 12
2 Những điểm chưa làm được 12
PHỤ LỤC 13
Trang 2CHƯƠNG 1: MỤC TIÊU ĐỀ TÀI
Thiết kế mạch đọc nhiệt độ và điều khiển nhiệt độ cho mạch sử dụng điện áp 220VAC
Hướng cần làm của đề tài:
- Thực hiện đọc nhiệt độ thực tế từ cảm biến, xác định hàm truyền để xây dựng bộ điều khiển PID, điều khiển điện áp cấp cho bóng đèn làm nóng(do nhóm em dùng Triac nên cần phải xác định điểm không của nguồn 220V để thực hiện điều khiển Triac.)
- Thiết kế mạch và mô phỏng trên phần mềm mô phỏng proteus
- Lập trình cho vi điều khiển
- Thiết kế mạch thực tế, kiểm tra các tính năng của mạch thật
Các kết quả dự tính của đề tài:
- Mạch có thể đọc nhiệt độ từ cảm biến và hiển thị lên LCD hoặc LED 7 thanh
- Có thể điều khiển được độ sáng của đèn (thiết bị chấp hành) để từ đó điều khiển nhiệt độ của hộp nhiệt
- Mạch có khả năng tự điều chỉnh nhiệt độ bằng bộ PID
Các chỉ tiêu kỹ thuật của thiết bị:
- Nhiệt độ đo được phải khá chính xác
- Điện áp điều khiển phải ổn định khi đạt được nhiệt độ yêu cầu
Trang 3CHƯƠNG 2: PHƯƠNG PHÁP TRIỂN KHAI ĐỀ TÀI
Trong bài tập này chúng em sử dụng vi điều khiển STM32F401CCU6 Blue Pill theo sự gợi ý của thầy giáo Nguyễn…
Hình 1 Kit STM32F401CCU6 Blue Pill
Kit này có những ưu điểm:
- Bộ xử lý ARM Cortex-M4 với tần số hoạt động tối đa 84 MHz
- Bộ nhớ flash 256 KB và SRAM 64 KB
- Ổ đĩa USB 2.0 Full Speed, SPI, I2C, UART, CAN, và bộ điều khiển DMA
- Bộ chuyển đổi ADC 12-bit với tốc độ lên đến 2.4 MSPS và 16 kênh đầu vào
- Chế độ tiêu thụ điện năng thấp và các tính năng tiết kiệm năng lượng khác
- Tích hợp bộ đếm thời gian, bộ định thời và bộ đếm sự kiện
- Đơn giản, dễ sử dụng, là kit cơ bản cho người mới lập trình
- Đầy đủ chức năng cần thiết cho bài toán đặt ra
Trang 4- Dễ tìm kiếm trên thị trường, giá thành rẻ, hiệu quả cao
- Công cụ lập trình đều Free và đầy đủ tài liệu hỗ trợ
2 Cảm biến và các linh kiện liên quan
2.1 Cảm biến Pt100
Hay còn được gọi là cảm biến nhiệt độ RTD (Resistance Temperature Detectors) Đây là loại thiết bị dùng để đo nhiệt độ thông qua 1 que dò cảm biến
có tích hợp Platinium bên trong Thành phần Platinium được xem như là thành phần quan trọng nhất của cảm biến nhiệt độ pt100 Và đây cũng là lý do vì sao cảm biến nhiệt độ RTD (cảm biến nhiệt điện trở) thường được gọi chung là cảm biến nhiệt độ Pt100
Hình 2 Cảm biến Pt100
Cảm biến nhiệt độ Pt100 có 6 thành phần chính:
Đầu dò nhiệt: thành phần quan trọng nhất, thường được làm bằng platinium hoặc nickel
Dây kết nối tín hiệu với đầu ra dạng 2 dây, 3 dây, 4 dây
Chất cách điện: được làm bằng gốm giúp cách điện các dây nối từ vỏ bọc bảo vệ
Chất làm đầy: chứa bột alumina được làm khô và đổ đầy vào nhằm bảo vệ cảm biến khi bị rung động
Vỏ bảo vệ: là thành phần tiếp xúc trực tiếp với nguồn nhiệt cần đo, giúp bảo
vệ đầu dò cảm biến và dây tín hiệu của cảm biến
Đầu củ hành: thường làm bằng các vật liệu cách điện như : nhựa , nhôm hay gốm Khi có sự thay đổi nhiệt độ trên đầu dò thì dẫn đến sự thay đổi điện trở của ống trụ Mỗi giá trị nhiệt độ khác nhau tương ứng với mỗi giá trị điện trở khác nhau.Ở 10 ºC thì đo được giá trị điện trở RPT100 =107,6 Ω Khi tăng 1ºC thì RPT tăng sấp xỉ 0,4Ω Công thức điện trở phụ thuộc vào
Trang 5nhiệt độ của PT100: Rt = R0(1+ AT) Trong đó: A=0.004 ; T: nhiệt độ đo ; R0=100 (om)
Hình 3 Bảng thông số điện trở của PT100 ứng với nhiệt độ đo
Đọc dữ liệu cảm biến Pt100
Cảm biến Pt100 sẽ được nối với chân ADC 12bit của vi xử lý Đầu ngõ vào ADC của vi xử lý từ 0-3.6V, tín hiệu bit khi đọc tín hiệu điện áp từ Pt100 sẽ thay đổi từ
0000 0000 0000 – 1111 1111 1111 Vì vậy, khi điện áp thay đổi một khoảng
3.6
2 12 =0.88 mV thì tín hiệu của ADC sẽ dịch lên 1 bit
Trang 6Giả sử ta cấp dòng 1mA cho Pt100 qua IC LM334 Vì I ko đổi (nguồn dòng) nên U
sẽ thay đổi theo R Tuy nhiên sự thay đổi của U rất nhỏ nên phải cho qua mạch khuyếch đại để đựoc ngõ ra theo ý muốn có thể có ngõ ra là 1mV/oC, 10mV/oC, 100mV/oC tùy theo hệ số khuyếch đại của mạch. Tra hình 3 ta có, với sự thay đổi nhiệt độ từ 0-100 độ, ta sẽ có điện áp hai đầu Pt100 khi đưa vào vi xử lý là 100mV-140mV Từ đó, mỗi lần điện áp thay đổi 0.88mV thì nhiệt độ đọc được sẽ thay đổi 2.2 độ Chính vì vậy, để tăng độ chính xác ta sẽ phải lắp thêm mạch phân
áp và khuếch đại (có thể dùng OPAMP hoặc mua IC có sẵn) với hệ số khuếch đại K=2.75 Lưu ý, khi khuếch đại thì phải cách ly để đảm bảo nguồn dòng cấp không đổi
2.2 Cảm biến LM35
Hình 4 LM35
Trang 7Tuy vậy, để đơn giản và tiết kiệm linh kiện có sẵn, nhóm em sẽ sử dụng cảm biến LM35 cho đề tài lần này LM35 có thể đo nhiệt độ từ -55 đến 150 độ C với độ chính xác ±0,5 độ C ở nhiệt độ phòng Nó được thiết kế để tạo ra một điện áp đầu
ra tuyến tính với nhiệt độ, với tỷ lệ 10 mV/độ C.Điều này có nghĩa là, với mỗi độ C tăng/giảm nhiệt độ, giá trị điện áp đầu ra của cảm biến sẽ tăng/giảm 10mV Vì vậy,
để đọc giá trị nhiệt độ,chúng ta chỉ cần đo giá trị điện áp đầu ra của cảm biến LM35 và chia cho 10
2.3 Triac
Hình 5 Triac BTA12
Triac (Triode for alternating Current) là một linh kiện điện tử được dùng nhiều trong đóng cắt dòng điện xoay chiều Nói một cách đơn giản Triac cũng như một cái chuyển mạch thôi Nó được cấu tạo tương đương như 2 Thyristor mắc song song với chiều ngược nhau Tính năng hai chiều của Triac làm cho chúng chuyển đổi thuận tiện cho dòng điện xoay chiều (AC) Ngoài ra, áp dụng một kích hoạt ở góc pha điều khiển của AC trong mạch chính cho phép điều khiển dòng điện trung bình chảy vào tải (điều khiển pha) Điều này thường được sử dụng để kiểm soát tốc
độ của động cơ cảm ứng, đèn mờ, và kiểm soát máy sưởi điện Tuy nhiên người ta không sử dụng nó trong các ứng dụng chuyển mạch công suất cao – một trong những lý do là đặc tính chuyển mạch không đối xứng của nó
3 Thiết kế mô phỏng và kết quả
3.1 Khối nguồn
Nhóm chúng em sử dụng nguồn đầu vào là adapter 9VDC Mạch nguồn hạ áp 9V xuống 5V dùng IC LM7805 là một mạch rất phổ biến trong các ứng dụng điện tử, giúp cung cấp nguồn ổn định cho các linh kiện điện tử cần sử dụng điện áp ổn định 5V.Mạch nguồn này sử dụng IC LM7805, một IC ổn áp đơn với dải điện áp đầu vào từ 7V đến 35V, dòng điện tối đa 1A và đầu ra ổn định 5V Mạch cũng bao
Trang 8gồm một tụ điện bù (tụ C1) để giảm nhiễu và tăng độ ổn định của đầu ra Cấu trúc mạch nguồn hạ áp 9V xuống 5V dùng LM7805 như sau:
Bước 1: Kết nối đầu vào của LM7805 với nguồn điện áp 9V thông qua đường dây dương và âm
Bước 2: Kết nối đầu ra của LM7805 với các linh kiện cần sử dụng điện áp ổn định 5V thông qua đường dây dương và âm
Bước 3: Nối tụ C1 với đầu vào và đầu ra của LM7805, với mục đích giảm nhiễu và tăng độ ổn định của đầu ra
Đây là một mạch nguồn đơn giản, dễ thực hiện và sử dụng Tuy nhiên, khi sử dụng mạch nguồn này cần chú ý đến tản nhiệt của IC LM7805 để tránh quá nóng
và làm giảm tuổi thọ của nó Ngoài ra, cũng cần lưu ý đến độ chính xác của đầu ra 5V để đảm bảo độ ổn định và an toàn cho các linh kiện điện tử
3.2 Điều khiển nhiệt độ:
Hình 6 Mạch mô phỏng bắt điểm 0 của Triac
Khi dòng 220VAC 50Hz đi qua chỉnh lưu cầu, sóng sin sẽ được chuyển thành dao động chu kỳ dương với chu kỳ bằng nửa chu kỳ dao động của dòng điện(T=10ms) Khi điện áp qua diode quang lớn hơn 4.7V ( chiếm đa phần thời gian) , Led sẽ sáng, kích dẫn transitor nối với GND Lúc này, ngõ ra sẽ là 0V Khi điện áp qua diode quang nhỏ hơn 4.7V, Led không sáng, transitor không dẫn, chân tín hiệu kết nối với vi điều khiển được nối xuống nguồn Dựa vào điểm này, ta sử dụng ngắt
Trang 9ngoài của vi điều khiển để nhận biết tín hiệu đồng bộ của điện áp xoay chiều, tính góc mở của triac Ta chỉ điều khiển thời gian trong khoảng thời gian từ 1ms tới 9ms Vì điện áp cần có khoảng thời gian trễ để tăng lên tắt led
Hình 7 Mô phỏng bắt điểm 0
Hình 8 Mạch mô phỏng điều khiển nhiệt độ
MOC3021 : bên trong gồm 1 con diode phát quang ( hoặc LED) và 1 con triac quang Khi có dòng qua diode quang, sẽ làm diode sáng, kích dẫn triac trong MOC dẫn, cho dòng AC chạy qua Mạch phát hiện điểm 0 sẽ phát ra các xung đưa vào vi
Trang 10xử lý Vi xử lý xuất tín hiệu điều khiển mạch kích Triac từ đó điều khiển góc mở điện áp cấp cho bóng đèn
Hình 9 Tín hiệu điều khiển của mạch kích Triac
Hình 10 mô phỏng tín hiệu điều khiển Triac
Trang 113.3Thiết kế mạch trên Altium
Hình 11 Mạch tổng thể
3.4 Xác định hàm truyền của hệ thống và bộ điều khiển PID
Do thành phần nhiệt độ thay đổi không tuyến tính, nên để giảm sai số do thành phần D ta sẽ chọn bộ điều khiển PI Sau khi chọn bằng kinh nghiệm, ta thu được chỉ số Kp Ki như sau: Kp= ; Ki=
Trang 12Hình 12 Hàm truyền và bộ điều khiển PID
3.4 Thiết kế chương trình
Tín hiệu từ cảm biến LM35 sẽ được gửi về vi xử lý, sau đó hiển thị lên màn hình
LCD để người sử dụng dễ theo dõi Nhiệt độ đọc được sẽ được so sánh với giá trị đặt mà người sử dụng đặt thông qua UART Nếu người dùng không cài đặt giá trị nhiệt độ đặt ban đầu thì sẽ mặc định là 40℃ Giá trị sai lệch sẽ là đầu vào của bộ điều khiển PID số được lập trình trong vi điều khiển Đầu ra của bộ điều khiển sẽ
là giá trị nằm trong khoảng thời gian giữa 2 lần liên tiếp điểm 0 của Triac Sử dụng ngắt ngoài để đọc tín hiệu gửi về của mạch phát hiện điểm 0
Tại mỗi lần vi điều khiển nhận ngắt thì đấy chính là thời điểm có thể mở Triac với
độ mở lớn nhất Khi ta điều chỉnh thời gian mở Triac thì cũng là điều chỉnh điện áp cấp vào cho bóng đèn Bằng việc thực hiện làm chậm trễ khoảng thời gian kích dẫn dòng điện đến chân G của Triac là ta có thể điều khiển được
Trang 13CHƯƠNG 3: KẾT QUẢ THỰC NGHIỆM
Hình 13 Mạch đã hoàn thiện
CHƯƠNG 4: KẾT LUẬN
1 Những điểm làm được
- Phân tích được nguyên lý hoạt động, chọn được thiết bị cho mạch đọc và điều khiển nhiệt độ nguồn 220 VAC
- Tìm hiểu về cảm biến Pt100 và cách đọc
- Thiết kế và làm thành công phần cứng mạch đọc nhiệt độ từ cảm biến LM35 về vi điều khiển và hiển thị lên LCD khá chính xác
- Thiết kế mô phỏng phần điều khiển nhiệt độ trên nền tảng Proteus, lập trình được chương trình bắt điểm 0 và điều khiển góc mở TRIAC điều khiển bóng đèn
- Xác định hàm truyền đối tượng và chỉnh định bộ điều khiển PID
- Mạch đã có cầu chì và cách ly giữa điện áp 220V và vi điều khiển
2 Những điểm chưa làm được
- Phần bảo vệ còn hạn chế khiến nguy hiểm khi thực hiện Đặc biệt phần hàn đáy chưa được bảo vệ nên hạn chế động chạm
- Vấn đề tản nhiệt còn kém nên linh kiện dễ hỏng hóc( IC LM7805 )
Trang 14PHỤ LỤC
Thư viện hiển thị LCD ( sử dụng thư viện có sẵn trên mạng)
#include " i2c_lcd.h "
extern I2C_HandleTypeDef hi2c2; // change your handler here accordingly
#define SLAVE_ADDRESS_LCD 0x4E // change this according to ur setup
void lcd_send_cmd ( char cmd )
{
char data_u, data_l;
uint8_t data_t[ 4 ];
data_u = ( cmd & 0xf0 );
data_l = (( cmd << 4 )& 0xf0 );
data_t[ 0 ] = data_u| 0x0C ; //en=1, rs=0
data_t[ 1 ] = data_u| 0x08 ; //en=0, rs=0
data_t[ 2 ] = data_l| 0x0C ; //en=1, rs=0
data_t[ 3 ] = data_l| 0x08 ; //en=0, rs=0
HAL_I2C_Master_Transmit (&hi2c2, SLAVE_ADDRESS_LCD ,( uint8_t *)
data_t , 4 , 100 );
}
void lcd_send_data ( char data )
{
char data_u, data_l;
uint8_t data_t[ 4 ];
data_u = ( data & 0xf0 );
Trang 15data_l = (( data << 4 )& 0xf0 );
data_t[ 0 ] = data_u| 0x0D ; //en=1, rs=0
data_t[ 1 ] = data_u| 0x09 ; //en=0, rs=0
data_t[ 2 ] = data_l| 0x0D ; //en=1, rs=0
data_t[ 3 ] = data_l| 0x09 ; //en=0, rs=0
HAL_I2C_Master_Transmit (&hi2c2, SLAVE_ADDRESS_LCD ,( uint8_t *)
data_t , 4 , 100 );
}
void lcd_init ( void )
{
lcd_send_cmd ( 0x33 ); /* set 4-bits interface */
lcd_send_cmd ( 0x32 );
HAL_Delay ( 50 );
lcd_send_cmd ( 0x28 ); /* start to set LCD function */
HAL_Delay ( 50 );
lcd_send_cmd ( 0x01 ); /* clear display */
HAL_Delay ( 50 );
lcd_send_cmd ( 0x06 ); /* set entry mode */
HAL_Delay ( 50 );
lcd_send_cmd ( 0x0c ); /* set display to on */
HAL_Delay ( 50 );
lcd_send_cmd ( 0x02 ); /* move cursor to home and set data address to 0
*/
HAL_Delay ( 50 );
lcd_send_cmd ( 0x80 );
}
Trang 16void lcd_send_string ( char * str )
{
while (* str ) lcd_send_data (* str ++);
}
void lcd_clear_display ( void )
{
lcd_send_cmd ( 0x01 ); //clear display
}
void lcd_goto_XY ( int row , int col )
{
uint8_t pos_Addr;
if ( row == 1 )
{
pos_Addr = 0x80 + row - 1 + col ;
}
else
{
pos_Addr = 0x80 | ( 0x40 + col );
}
lcd_send_cmd (pos_Addr);
}
PID
#include " PID.h "
#include < math.h >
Trang 17float PIDcal ( float setpoint , float actual_position )
{
// static float pre_error = 0;
static float integral = 0 ;
float error;
// float derivative;
float output;
//Caculate P,I,D
error = setpoint - actual_position ;
//In case of error too small then stop intergration
if ( abs (error) > epsilon)
{
integral = integral + error*dt;
}
// derivative = (error - pre_error)/dt;
// output = Kp*error + Ki*integral + Kd*derivative;
output = Kp*error + Ki*integral ;
//Saturation Filter
if (output > MAX)
{
output = MAX;
}
else if (output <= MIN)
{
output = MIN;
}
//Update error
Trang 18// pre_error = error;
return output;
}
Hàm đọc giá trị nhận về
void HAL_TIM_PeriodElapsedCallback (TIM_HandleTypeDef * htim ){
if ( htim ->Instance == htim2.Instance){
// HAL_ADC_Start(&hadc1);
// HAL_ADC_PollForConversion(&hadc1, 1000);
// sensor_value = HAL_ADC_GetValue(&hadc1);
// temp = ((float)(sensor_value*3.3*100))/4096;
// HAL_ADC_Stop(&hadc1);
}
if ( htim ->Instance == htim9.Instance){
// for(int i =0 ;i<10;i++){
HAL_ADC_Start (&hadc1);
HAL_ADC_PollForConversion (&hadc1, 1000 );
sensor_value = HAL_ADC_GetValue (&hadc1);
HAL_ADC_Stop (&hadc1);
temp = (( float )(sensor_value* 3.3 * 100 ))/ 4096 ;
// temp+=temp1;
//}
// temp = temp/10;
thoigian = 10 - PIDcal (Nhietdodat,temp);
}
Trang 19if ( htim ->Instance == htim10.Instance){
count++;
if (count == 10 ){
//val_temp = (uint16_t)temp;
sprintf (&tam3, " %.1f " ,temp);
lcd_goto_XY ( , 10 );
lcd_send_string (&tam3);
count = 0 ;
}
}
}
Hàm hiển thị LCD
lcd_init ();
lcd_goto_XY ( 1 0 );
lcd_send_string ( " Setpoint: " );
lcd_goto_XY ( 1 10 );
sprintf (&temp_dat, " %d " ,Nhietdodat);
lcd_send_string (&temp_dat);
lcd_goto_XY ( 1 14 );
lcd_send_string ( " oC " );
lcd_goto_XY ( 2 0 );
lcd_send_string ( " Feedback: " );
lcd_goto_XY ( 2 14 );
lcd_send_string ( " oC " );
Hàm điều khiển góc mở Triac