一、項(xiàng)目介紹
注塑機(jī)是一種常用的制造設(shè)備,用于生產(chǎn)塑料制品。在注塑機(jī)的工作過(guò)程中,溶膠必須達(dá)到一定的溫度才能被注入模具中進(jìn)行成型。因此,在注塑機(jī)的生產(chǎn)過(guò)程中,溫度控制是非常重要的一環(huán)。
本項(xiàng)目基于MCS-51單片機(jī)設(shè)計(jì)了一款溫度控制系統(tǒng),主控芯片采用STC89C52,溫度傳感器采用鉑電阻。該系統(tǒng)主要應(yīng)用于注塑機(jī)的溶膠射嘴頭上進(jìn)行加熱控制,利用繼電器控制加熱器實(shí)現(xiàn)溫度加熱,控制系統(tǒng)檢測(cè)溫度是否到達(dá)設(shè)定閥值來(lái)控制繼電器。
本項(xiàng)目的設(shè)計(jì)思路是,利用鉑電阻溫度傳感器對(duì)溶膠進(jìn)行實(shí)時(shí)溫度監(jiān)測(cè),并將監(jiān)測(cè)到的溫度值通過(guò)LCD顯示屏實(shí)時(shí)顯示。控制器采用PID算法對(duì)溶膠溫度進(jìn)行精準(zhǔn)控制,當(dāng)溫度低于設(shè)定閥值時(shí),控制器將通過(guò)繼電器控制加熱器進(jìn)行加熱操作,直到溫度達(dá)到設(shè)定閥值后停止加熱操作。
通過(guò)本項(xiàng)目的應(yīng)用,可以實(shí)現(xiàn)對(duì)注塑機(jī)的溶膠溫度進(jìn)行精準(zhǔn)控制,從而提高注塑機(jī)的生產(chǎn)效率和產(chǎn)品質(zhì)量。同時(shí),該系統(tǒng)控制方式簡(jiǎn)單,易于操作和維護(hù),具有較高的實(shí)用性和可靠性。
二、技術(shù)說(shuō)明和功能描述
【1】STC89C52單片機(jī)作為主控芯片,具有高性能和豐富的外設(shè)接口。
【2】鉑電阻溫度傳感器用于測(cè)量溶膠射嘴頭的溫度,并將數(shù)據(jù)傳輸給單片機(jī)。
【3】繼電器用于控制加熱器的通斷,實(shí)現(xiàn)溫度加熱。
【4】溫度控制系統(tǒng)可以根據(jù)設(shè)定的溫度閾值來(lái)判斷是否需要進(jìn)行加熱,從而控制繼電器的狀態(tài)。
【5】系統(tǒng)可以通過(guò)LCD顯示屏顯示當(dāng)前溫度和設(shè)定的目標(biāo)溫度。
【6】當(dāng)溫度超過(guò)或低于設(shè)定的閾值時(shí),系統(tǒng)可以觸發(fā)報(bào)警裝置進(jìn)行警示。
三、系統(tǒng)設(shè)計(jì)思路
3.1 硬件選型說(shuō)明
【1】主控芯片:STC89C52單片機(jī)
- STC89C52是一款具有高性能和豐富外設(shè)接口的經(jīng)典51系列單片機(jī),適合中小型嵌入式系統(tǒng)應(yīng)用。
- 它具有8位CPU、8KB的內(nèi)部FLASH存儲(chǔ)器、256字節(jié)的RAM、3個(gè)定時(shí)器/計(jì)數(shù)器、串行通信接口等功能。
- 這款單片機(jī)運(yùn)算速度快,響應(yīng)迅速,可滿足本項(xiàng)目對(duì)性能和實(shí)時(shí)性的要求。
【2】溫度傳感器:鉑電阻溫度傳感器
- 鉑電阻溫度傳感器是一種常見(jiàn)的溫度傳感器,具有穩(wěn)定性好、精度高的特點(diǎn)。
- 它的工作原理是通過(guò)測(cè)量電阻值的變化來(lái)確定溫度變化,傳感器的電阻值與溫度呈線性關(guān)系。
- 在本項(xiàng)目中,鉑電阻溫度傳感器被用于測(cè)量溶膠射嘴頭的溫度,提供實(shí)時(shí)的溫度數(shù)據(jù)給單片機(jī)進(jìn)行控制。
【3】繼電器:用于控制加熱器
- 繼電器是一種電子開關(guān)設(shè)備,能夠在小電流的控制信號(hào)下控制大電流的通斷。
- 在本項(xiàng)目中,繼電器被用來(lái)控制加熱器的通斷狀態(tài),根據(jù)溫度控制的需要進(jìn)行加熱或停止加熱操作。
【4】LCD顯示屏:用于顯示溫度和設(shè)定值
- LCD顯示屏是一種常見(jiàn)的數(shù)字顯示裝置,具有低功耗、可視角度廣、反應(yīng)快速等特點(diǎn)。
- 在本項(xiàng)目中,LCD顯示屏用于顯示當(dāng)前實(shí)際溫度和設(shè)定的目標(biāo)溫度閾值,方便操作員進(jìn)行觀察和設(shè)置。
【5】按鈕開關(guān):用于設(shè)定目標(biāo)溫度閾值
- 按鈕開關(guān)是一種常用的輸入設(shè)備,用于實(shí)現(xiàn)用戶與系統(tǒng)的交互。
- 在本項(xiàng)目中,按鈕開關(guān)用于更新設(shè)定的目標(biāo)溫度閾值,供操作員根據(jù)需要進(jìn)行調(diào)整。
【6】報(bào)警裝置:用于溫度異常警示
- 報(bào)警裝置能夠發(fā)出聲音或光信號(hào),用于警示操作員溫度超過(guò)或低于設(shè)定的閾值。
- 在本項(xiàng)目中,報(bào)警裝置用于提醒操作員注意溫度異常,保證工作安全和質(zhì)量。
3.2 設(shè)計(jì)思路
【1】硬件連接:將鉑電阻溫度傳感器連接到單片機(jī)的模擬輸入端口,將LCD顯示屏連接到單片機(jī)的數(shù)據(jù)口,將繼電器接在單片機(jī)的輸出端口,通過(guò)繼電器控制加熱器的電源。
【2】溫度采集:通過(guò)鉑電阻溫度傳感器實(shí)時(shí)采集溶膠的溫度信號(hào),將信號(hào)轉(zhuǎn)換為數(shù)字信號(hào),通過(guò)單片機(jī)的模擬輸入端口輸入到單片機(jī)中。
【3】溫度控制:使用PID算法對(duì)溶膠的溫度進(jìn)行精準(zhǔn)控制。PID算法是一種經(jīng)典的控制算法,通過(guò)對(duì)比實(shí)際溫度和設(shè)定溫度的差異,計(jì)算出控制器輸出控制信號(hào)的大小來(lái)控制繼電器的開關(guān)狀態(tài),從而實(shí)現(xiàn)對(duì)加熱器的控制。
【4】溫度顯示:將溫度值通過(guò)LCD顯示屏實(shí)時(shí)顯示,方便操作人員監(jiān)測(cè)溫度變化。
【5】控制器編程:使用C語(yǔ)言編寫單片機(jī)的控制程序,實(shí)現(xiàn)溫度采集、PID算法控制、溫度顯示等功能。
本項(xiàng)目的設(shè)計(jì)思路是基于MCS-51單片機(jī)和PID算法實(shí)現(xiàn)溫度控制系統(tǒng),通過(guò)鉑電阻溫度傳感器實(shí)時(shí)采集溫度信號(hào),通過(guò)PID算法實(shí)現(xiàn)溫度控制,通過(guò)LCD顯示屏實(shí)現(xiàn)溫度顯示,最終通過(guò)繼電器控制加熱器實(shí)現(xiàn)溫度加熱控制。
四、代碼實(shí)現(xiàn)
4.1 溫度控制系統(tǒng)實(shí)現(xiàn)(PID算法)
使用STC89C52單片機(jī)、鉑電阻溫度傳感器、PCF8591模數(shù)轉(zhuǎn)換器和PID算法實(shí)現(xiàn)溫度控制并控制繼電器:
#include <reg52.h>
#define RELAY_PIN P1 // 繼電器控制引腳
// 溫度傳感器連接引腳
sbit TEMP_SENSOR_PIN = P2^0;
// PCF8591模數(shù)轉(zhuǎn)換器連接引腳
sbit PCF_SDA = P2^1; // I2C數(shù)據(jù)線
sbit PCF_SCL = P2^2; // I2C時(shí)鐘線
sbit PCF_EOC = P2^3; // 轉(zhuǎn)換結(jié)束標(biāo)志
// PID參數(shù)
float kp = 1.0; // 比例系數(shù)
float ki = 0.5; // 積分系數(shù)
float kd = 0.2; // 微分系數(shù)
// 溫度目標(biāo)值
float targetTemp = 100.0;
// PID控制誤差相關(guān)變量
float error = 0.0;
float prevError = 0.0;
float integral = 0.0;
float derivative = 0.0;
// PID控制輸出
float output = 0.0;
// 設(shè)置PWM占空比函數(shù)
void setPwmDutyCycle(unsigned char dutyCycle) {
TH0 = 256 - dutyCycle; // 設(shè)置高位
TL0 = 256 - dutyCycle; // 設(shè)置低位
}
// 定時(shí)器0初始化函數(shù)
void timer0Init() {
TMOD = 0x01; // 定時(shí)器0工作在模式1(16位定時(shí)器)
TH0 = 0; // 最初賦初值
TL0 = 0;
TR0 = 1; // 定時(shí)器0開始計(jì)時(shí)
}
// I2C總線開始信號(hào)函數(shù)
void i2cStart() {
PCF_SDA = 1;
PCF_SCL = 1;
PCF_SDA = 0;
PCF_SCL = 0;
}
// I2C總線停止信號(hào)函數(shù)
void i2cStop() {
PCF_SDA = 0;
PCF_SCL = 1;
PCF_SDA = 1;
}
// I2C寫數(shù)據(jù)函數(shù)
void i2cWriteByte(unsigned char dat) {
unsigned char i;
for (i = 0; i < 8; i++) {
PCF_SDA = (dat & 0x80) ? 1 : 0;
PCF_SCL = 1;
PCF_SCL = 0;
dat <<= 1;
}
PCF_SCL = 1;
PCF_SCL = 0;
PCF_SDA = 1;
}
// 從PCF8591讀取溫度值
unsigned char readTemperatureValue() {
unsigned char tempValue;
i2cStart();
i2cWriteByte(0x90); // PCF8591地址 + 寫操作
i2cWriteByte(0x00); // 設(shè)置輸入通道為0
i2cStart();
i2cWriteByte(0x91); // PCF8591地址 + 讀操作
tempValue = P0; // 讀取溫度值
i2cStop();
return tempValue;
}
// PID控制函數(shù)
void performPIDControl() {
error = targetTemp - readTemperatureValue(); // 計(jì)算誤差
integral += error; // 積分項(xiàng)
derivative = error - prevError; // 微分項(xiàng)
output = kp * error + ki * integral + kd * derivative; // PID輸出
if (output < 0) {
output = 0;
} else if (output > 255) {
output = 255;
}
setPwmDutyCycle((unsigned char)output); // 設(shè)置PWM占空比
prevError = error; // 更新上一次誤差
}
void main() {
timer0Init(); // 初始化定時(shí)器0
setPwmDutyCycle(0); // 初始化PWM占空比為0
while (1) {
performPIDControl(); // 進(jìn)行PID控制
if (readTemperatureValue() >= targetTemp) {
RELAY_PIN = 0; // 繼電器斷開,停止加熱
} else {
RELAY_PIN = 1; // 繼電器閉合,進(jìn)行加熱
}
}
}
以上代碼是溫度控制系統(tǒng)實(shí)現(xiàn)代碼,使用PID算法根據(jù)目標(biāo)溫度和當(dāng)前溫度進(jìn)行控制,并通過(guò)繼電器控制加熱器的通斷。需要通過(guò)I2C總線與PCF8591模數(shù)轉(zhuǎn)換器進(jìn)行通信,讀取鉑電阻溫度傳感器的數(shù)據(jù)。
4.2 LCD1602顯示屏
下面是使用STC89C52單片機(jī)和LCD1602液晶顯示屏實(shí)現(xiàn)數(shù)字顯示并封裝為函數(shù)調(diào)用的代碼:
#include <reg52.h>
#define LCD_RS P2_0 // 液晶RS引腳
#define LCD_RW P2_1 // 液晶RW引腳
#define LCD_EN P2_2 // 液晶EN引腳
#define LCD_DATA P0 // 液晶數(shù)據(jù)總線
// 延時(shí)函數(shù)
void delay(unsigned int t) {
unsigned int i, j;
for (i = 0; i < t; i++) {
for (j = 0; j < 110; j++);
}
}
// 液晶寫命令函數(shù)
void lcdWriteCmd(unsigned char cmd) {
LCD_RS = 0; // 設(shè)置為寫命令模式
LCD_RW = 0; // 設(shè)置為寫入模式
LCD_DATA = cmd; // 寫入命令
LCD_EN = 1; // 使能
delay(1); // 延時(shí)
LCD_EN = 0; // 禁止
delay(1); // 延時(shí)
}
// 液晶寫數(shù)據(jù)函數(shù)
void lcdWriteData(unsigned char dat) {
LCD_RS = 1; // 設(shè)置為寫數(shù)據(jù)模式
LCD_RW = 0; // 設(shè)置為寫入模式
LCD_DATA = dat; // 寫入數(shù)據(jù)
LCD_EN = 1; // 使能
delay(1); // 延時(shí)
LCD_EN = 0; // 禁止
delay(1); // 延時(shí)
}
// 液晶初始化函數(shù)
void lcdInit() {
lcdWriteCmd(0x38); // 設(shè)置16x2顯示,5x7點(diǎn)陣,8位數(shù)據(jù)接口
lcdWriteCmd(0x0C); // 顯示開,光標(biāo)關(guān)閉
lcdWriteCmd(0x06); // 光標(biāo)右移
lcdWriteCmd(0x01); // 清屏
}
// 在液晶上顯示數(shù)字函數(shù)
void lcdDisplayNumber(unsigned int num) {
unsigned char i;
unsigned char buffer[5]; // 緩沖區(qū),最大支持5位數(shù)
if (num == 0) {
lcdWriteData('0'); // 數(shù)字0特殊處理
return;
}
for (i = 0; i < 5; i++) {
buffer[i] = num % 10; // 從低位到高位依次取余數(shù)
num /= 10;
}
for (i = 5; i > 0; i--) {
if (buffer[i - 1] != 0 || i == 1) { // 從高位開始顯示直到遇到非零數(shù)字或者個(gè)位數(shù)
lcdWriteData(buffer[i - 1] + '0'); // 顯示數(shù)字
}
}
}
void main() {
lcdInit(); // 初始化液晶
while (1) {
unsigned int num = 12345; // 要顯示的數(shù)字
lcdWriteCmd(0x80); // 設(shè)置光標(biāo)位置為第一行第一個(gè)字符
lcdDisplayNumber(num); // 顯示數(shù)字
while (1); // 循環(huán)顯示
}
}
以上代碼是LCD數(shù)字顯示程序,使用LCD1602液晶顯示屏和STC89C52單片機(jī),通過(guò)封裝函數(shù)調(diào)用來(lái)實(shí)現(xiàn)數(shù)字在液晶屏上的顯示。需要進(jìn)行液晶的初始化操作,使用lcdDisplayNumber
函數(shù)將要顯示的數(shù)字傳入。在main
函數(shù)中給出了一個(gè)例子,以連續(xù)循環(huán)顯示數(shù)字12345為示例。