冰楓論壇

標題: ATtiny84A [打印本頁]

作者: 洪嵐峰    時間: 2023-4-27 06:03
標題: ATtiny84A
製作PID控制器所需零件如下:

ATtiny84A 微控制器
溫度傳感器(例如DS18B20)
PWM調節器(例如L298N)
直流電源供應器
其他所需的電子元件和連接線
ATtiny84A有14個引腳,其中包括VCC和GND。它的連接方式如下:

ATtiny84A引腳        連接到
PB0        PWM調節器輸入A
PB1        PWM調節器輸入B
PB2        DS18B20數據線
PB3        不使用
PB4        不使用
PB5        不使用
PB6        不使用
PB7        不使用
VCC        正極電源
GND        地
下面是ATtiny84A PID控制器的示例代碼(使用Arduino IDE進行編寫):


#include <OneWire.h>
#include <PID_v1.h>

#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
byte addr[8];

double Setpoint, Input, Output;
PID myPID(&Input, &Output, &Setpoint, 2, 5, 1, DIRECT);

void setup()
{
  pinMode(0, OUTPUT); // PB0
  pinMode(1, OUTPUT); // PB1
  
  // 初始化溫度傳感器
  if (!oneWire.search(addr)) {
    Serial.println("No more addresses.");
    oneWire.reset_search();
    return;
  }
  
  if (OneWire::crc8(addr, 7) != addr[7]) {
    Serial.println("CRC is not valid!");
    return;
  }
  
  if (addr[0] != 0x28) {
    Serial.println("Device is not a DS18x20 family device.");
    return;
  }
  
  oneWire.reset();
  oneWire.select(addr);
  oneWire.write(0x44, 1);
  
  // 初始化PID控制器
  Setpoint = 25.0; // 設定溫度
  myPID.SetMode(AUTOMATIC);
  myPID.SetOutputLimits(0, 255);
}

void loop()
{
  // 讀取溫度
  oneWire.reset();
  oneWire.select(addr);
  oneWire.write(0xBE);
  byte data[12];
  for (int i = 0; i < 9; i++) {
    data[i] = oneWire.read();
  }
  int16_t raw = (data[1] << 8) | data[0];
  Input = (double)raw * 0.0625;
  
  // PID控制
  myPID.Compute();
  analogWrite(0, Output); // PB0
  analogWrite(1, 0); // PB1
  delay(1000);
}
該示例代碼使用了Arduino的PID庫和OneWire庫,以實現一個簡單的溫度控制器。

具體的實現方式可能因具體的應用場景而異,需要進行適當的調整和優化。





歡迎光臨 冰楓論壇 (https://bingfong.com/) Powered by 冰楓