- UID
- 373967
- 帖子
- 9008
- 主題
- 2609
- 精華
- 0
- 積分
- 1003
- 楓幣
- 0
- 威望
- 980
- 存款
- 35891
- 贊助金額
- 0
- 推廣
- 0
- GP
- 1205
- 閱讀權限
- 70
- 在線時間
- 460 小時
- 註冊時間
- 2023-1-12
- 最後登入
- 2024-12-22
|
製作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庫,以實現一個簡單的溫度控制器。
具體的實現方式可能因具體的應用場景而異,需要進行適當的調整和優化。
|
|