冰楓論壇

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

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

[複製鏈接]

2609

主題

0

好友

949

積分

高級會員

Rank: 4

UID
373967
帖子
7589
主題
2609
精華
0
積分
949
楓幣
1905
威望
928
存款
26000
贊助金額
0
推廣
0
GP
1205
閱讀權限
50
在線時間
413 小時
註冊時間
2023-1-12
最後登入
2024-5-22

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

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

ATmega8A-PU微控制器
MAX6675熱電偶模組
SSD1306 OLED顯示屏
杜邦線
K型熱電偶線
綠色LED指示燈
紅色LED指示燈
蜂鳴器
雙極性電容器
NPN晶體管
電位器
電源開關
電源插座
電源轉換器
烤箱熱插頭
AC插頭
2路繼電器模塊
PID控制器模組
以下是ATmega8A-PU的連結腳位:

rust
Copy code
MAX6675模組:
VCC  ->  5V
GND  ->  GND
SCK  ->  PB5
CS   ->  PB4
SO   ->  PB3

SSD1306顯示屏:
VCC  ->  5V
GND  ->  GND
SCL  ->  PC5
SDA  ->  PC4

綠色LED指示燈:
正極 ->  PD0
負極 ->  GND

紅色LED指示燈:
正極 ->  PD1
負極 ->  GND

蜂鳴器:
正極 ->  PD2
負極 ->  GND

繼電器模塊:
VCC  ->  5V
GND  ->  GND
IN1  ->  PD3
IN2  ->  PD4

PID控制器模組:
OUT  ->  PD6
GND  ->  GND
VIN  ->  5V

AC插頭:
N    ->  接地線
L    ->  VCC
V    ->  繼電器模塊COM
下面是ATmega8A-PU製作PID溫控上下爐火烤箱的程式碼。這段程式碼使用PID控制器來控制烤箱溫度,並顯示溫度信息在OLED顯示屏上,同時使用蜂鳴器和LED燈來指示烤箱狀態。


#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include "Max6675.h"
#include "SSD1306.h"

#define SSR_DDR    DDRD
#define SSR_PORT   PORTD
#define SSR_PIN    PD6

#define BUZZER_DDR DDRD
#define BUZZER_PORT PORTD
#define BUZZER_PIN PD2

#define GREEN_LED_DDR DDRD
#define GREEN_LED_PORT PORTD
#define GREEN_LED_PIN PD0

#define RED_LED_DDR DDRD
#define RED_LED_PORT PORTD
#define RED_LED
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

#define HEATER_DDR DDRB
#define HEATER_PORT PORTB
#define HEATER_PIN PB1

#define TEMP_SENSOR_PIN PINC0

double Setpoint, Input, Output;
double Kp=2, Ki=5, Kd=1;
unsigned long lastTime;
double elapsedTime, cumError, rateError;

void setup() {
  HEATER_DDR |= (1 << HEATER_PIN); // set heater pin as output
  ADC_init(); // initialize ADC
  PWM_init(); // initialize PWM
  Timer_init(); // initialize timer
}

void loop() {
  // compute PID output and adjust PWM duty cycle
  unsigned long now = millis();
  elapsedTime = (double)(now - lastTime);
  Input = readTemperature();
  cumError += (Input - Setpoint) * elapsedTime;
  rateError = (Input - Setpoint) / elapsedTime;
  Output = Kp * (Input - Setpoint) + Ki * cumError + Kd * rateError;
  if (Output < 0) {
    Output = 0;
  } else if (Output > 255) {
    Output = 255;
  }
  analogWrite(HEATER_PIN, Output);
  lastTime = now;
}

double readTemperature() {
  // read temperature from LM35 sensor
  int val = analogRead(TEMP_SENSOR_PIN);
  double mv = (val / 1024.0) * 5000;
  double cel = mv / 10;
  return cel;
}

void ADC_init() {
  // initialize ADC
  ADMUX |= (1 << REFS0); // use AVcc as reference voltage
  ADCSRA |= (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); // set prescaler to 128
  ADCSRA |= (1 << ADEN); // enable ADC
}

void PWM_init() {
  // initialize PWM
  TCCR1A |= (1 << COM1A1) | (1 << WGM11); // set non-inverting mode and Fast PWM mode with TOP=ICR1
  TCCR1B |= (1 << WGM12) | (1 << WGM13) | (1 << CS11); // set Fast PWM mode with TOP=ICR1 and prescaler to 8
  ICR1 = 255; // set TOP value
}

void Timer_init() {
  // initialize timer
  TCCR0 |= (1 << CS02) | (1 << CS00); // set prescaler to 1024
  TIMSK |= (1 << TOIE0); // enable timer overflow interrupt
  sei(); // enable global interrupts
}

ISR(TIMER0_OVF_vect) {
  // interrupt service routine for timer overflow
  loop();
}
[發帖際遇]: 洪嵐峰 在良心企業「義美」打工,領取工資 1 楓幣 幸運榜 / 衰神榜
收藏收藏0 推0 噓0


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

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

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

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

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

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

GMT+8, 2024-5-22 18:43

回頂部