冰楓論壇

 找回密碼
 立即註冊
ads_sugarbook
搜索
查看: 497|回覆: 0
打印 上一主題 下一主題

[討論] Atmel ATmega8A-PU 製作溫控上下爐火烤箱(0~400度)

[複製鏈接]

2609

主題

0

好友

950

積分

高級會員

Rank: 4

UID
373967
帖子
7669
主題
2609
精華
0
積分
950
楓幣
8279
威望
929
存款
20000
贊助金額
0
推廣
0
GP
1205
閱讀權限
50
在線時間
415 小時
註冊時間
2023-1-12
最後登入
2024-5-31

2023端午節紀念勳章 2023中秋節紀念勳章 2023聖誕節紀念勳章

跳轉到指定樓層
1
發表於 2023-4-8 08:18:02 |只看該作者 |倒序瀏覽
製作溫控上下爐火烤箱需要以下零件:

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控制器,它將熱電偶的讀數轉換為攝氏溫度,並通過調整加熱器的輸出來維持目標溫度。
[發帖際遇]: 洪嵐峰 身為「IT高手」,協助「嫦蓉」公司揪出「紙菸」加料事件,獲得獎勵 1 楓幣 幸運榜 / 衰神榜
收藏收藏0 推0 噓0


把本文推薦給朋友或其他網站上,每次被點擊增加您在本站積分: 1骰子
複製連結並發給好友,以賺取推廣點數
簡單兩步驟,註冊、分享網址,即可獲得獎勵! 一起推廣文章換商品、賺$$
高級模式
B Color Image Link Quote Code Smilies |上傳

廣告刊登意見回饋關於我們管群招募本站規範DMCA隱私權政策

Copyright © 2011-2024 冰楓論壇, All rights reserved

免責聲明:本網站是以即時上載留言的方式運作,本站對所有留言的真實性、完整性及立場等,不負任何法律責任。

而一切留言之言論只代表留言者個人意見,並非本網站之立場,用戶不應信賴內容,並應自行判斷內容之真實性。

小黑屋|手機版|冰楓論壇

GMT+8, 2024-5-31 19:24

回頂部