- UID
- 373967
- 帖子
- 8867
- 主題
- 2609
- 精華
- 0
- 積分
- 1000
- 楓幣
- 15
- 威望
- 977
- 存款
- 34822
- 贊助金額
- 0
- 推廣
- 0
- GP
- 1205
- 閱讀權限
- 70
- 在線時間
- 455 小時
- 註冊時間
- 2023-1-12
- 最後登入
- 2024-11-22
|
製作溫控上下爐火烤箱需要以下零件:
ATmega8A-PU 微控制器
16x2 字元 LCD 液晶顯示器
熱電偶溫度感應器
結晶管三相電源 SSR
電源變壓器
NTC 10K 溫度感應器
電源線、焊接板、杜邦線等
連接腳位:
ATmega8A-PU 微控制器:可以參考上述的連接腳位。
16x2 字元 LCD 液晶顯示器:VSS 連接地、VDD 連接 5V、V0 接入可變電阻器的中點、RS 連接 PB0、RW 連接地、E 連接 PB1、D4-D7 分別連接 PC0-PC3。
熱電偶溫度感應器:+ 連接 VCC、- 連接 ADC0。
結晶管三相電源 SSR:SSR 1 腳位連接 AC 輸入、SSR 2 腳位連接 AC 輸出、SSR 3 腳位連接地、SSR 4 腳位連接 VCC。
電源變壓器:AC 輸入連接插座,AC 輸出連接 SSR 的 AC 輸入。
NTC 10K 溫度感應器:一端接地,另一端接入 ADC1。
程式碼:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <stdio.h>
#include "lcd.h"
#define F_CPU 1000000UL // 1MHz
volatile int temp;
ISR(ADC_vect) // ADC 中斷服務程序
{
int low = ADCL; // 低 8 位
int high = ADCH; // 高 2 位
temp = (high << 8) | low; // 合成 10 位溫度值
}
void ADC_init()
{
ADMUX |= (1 << REFS0); // 參考電壓設為 AVCC
ADCSRA |= (1 << ADEN) | (1 << ADIE) | (1 << ADPS2) | (1 << ADPS1); // 啟用 ADC,設定分頻為 64,開啟 ADC 中斷
sei(); // 開啟全域中斷
}
void SSR_init()
{
DDRD |= (1 << PD2); // 設定為輸出
}
void SSR_on()
{
PORTD |= (1 << PD2); // SSR 輸出高電平
}
void SSR_off()
{
PORTD &= ~(1 << PD2); // SSR 輸出低電平
}
int main()
{
ADC_init
#include <avr/io.h>
#include <util/delay.h>
#define F_CPU 8000000UL
#define BAUD 9600
#define UBRR (F_CPU/16/BAUD-1)
#define relay1Pin PB0
#define relay2Pin PB1
#define upTempPin PC0
#define downTempPin PC1
#define Kp 50
#define Ki 2
#define Kd 100
#define setTemp 200
uint16_t adcValue;
float adcVoltage, temperature;
int error, lastError, pidTerm;
float pid_kp = Kp, pid_ki = Ki, pid_kd = Kd;
int pwmValue = 0;
int dir = 1;
void setup()
{
// 設置輸出腳位
DDRB |= (1 << relay1Pin) | (1 << relay2Pin);
// 設置ADC輸入通道
ADMUX |= (1 << ADLAR) | (1 << REFS0);
// 啟用ADC,設置頻率分頻為64
ADCSRA |= (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1);
// 設置PWM輸出模式
TCCR0A |= (1 << WGM00) | (1 << WGM01) | (1 << COM0A1);
// 設置頻率分頻為64
TCCR0B |= (1 << CS01) | (1 << CS00);
// 設置計時器0的比較值為255
OCR0A = 255;
// 設置UART通訊波特率為9600
UBRRH = (uint8_t)(UBRR >> 8);
UBRRL = (uint8_t)UBRR;
// 設置UART傳輸格式為8位數據位,無校驗位,1位停止位
UCSRC |= (1 << UCSZ1) | (1 << UCSZ0);
// 啟用UART收發功能
UCSRB |= (1 << RXEN) | (1 << TXEN);
}
void loop()
{
// 讀取上下溫度
adcValue = analogRead(upTempPin);
adcVoltage = (float)adcValue * 5 / 1024;
temperature = (adcVoltage - 0.5) * 100;
error = setTemp - temperature;
pidTerm = (int)(pid_kp * error + pid_ki * (error + lastError) + pid_kd * (error - lastError));
lastError = error;
pwmValue += pidTerm;
if (pwmValue > 255)
{
pwmValue = 255;
}
else if (pwmValue < 0)
{
pwmValue = 0;
}
OCR0A = pwmValue;
_delay_ms(10);
// 讀取下溫度
adcValue = analogRead(downTempPin);
adcVoltage = (float)adcValue * 5 / 1024;
temperature = (adcVoltage - 0.
// 定義熱電偶腳位
#define THERMOCOUPLE_PIN 0
// 定義加熱器腳位
#define HEATER_PIN 1
// 定義最大和最小的溫度
#define MAX_TEMP 400
#define MIN_TEMP 0
// 定義溫度死區範圍
#define DEAD_ZONE 5
// 定義PID控制器的參數
#define KP 1.0
#define KI 0.2
#define KD 0.1
// PID控制器變數
float setpoint = 0.0;
float input = 0.0;
float output = 0.0;
float error = 0.0;
float last_error = 0.0;
float integral = 0.0;
float derivative = 0.0;
// 輸出控制器
void update_output() {
output = KP * error + KI * integral + KD * derivative;
if (output < 0) {
output = 0;
}
if (output > 255) {
output = 255;
}
analogWrite(HEATER_PIN, output);
}
// PID控制器
void pid_controller() {
// 讀取熱電偶溫度
int raw = analogRead(THERMOCOUPLE_PIN);
// 將讀數轉換為攝氏溫度
float temperature = (raw * 5.0 / 1024.0 - 0.5) * 100.0;
// 更新誤差
error = setpoint - temperature;
// 更新積分項
integral += error;
// 更新微分項
derivative = error - last_error;
// 更新輸出
update_output();
// 記錄上一次的誤差
last_error = error;
}
void setup() {
// 設置加熱器腳位為輸出
pinMode(HEATER_PIN, OUTPUT);
}
void loop() {
// 設置目標溫度
setpoint = 200.0;
// PID控制器
pid_controller();
}
這是一個基本的PID控制器,它將熱電偶的讀數轉換為攝氏溫度,並通過調整加熱器的輸出來維持目標溫度。 |
|