- UID
- 373967
- 帖子
- 8844
- 主題
- 2609
- 精華
- 0
- 積分
- 999
- 楓幣
- 0
- 威望
- 976
- 存款
- 34672
- 贊助金額
- 0
- 推廣
- 0
- GP
- 1205
- 閱讀權限
- 50
- 在線時間
- 453 小時
- 註冊時間
- 2023-1-12
- 最後登入
- 2024-11-17
|
製作PID控制器所需的零件如下:
PIC16F628 微控制器
LCD 顯示屏
光敏電阻或其他類比感測器
電位計或其他類比輸出裝置
電容、電阻、二極管、晶體等元件
電源供應器和開關
下面是PIC16F628的腳位連接圖:
+-------------+
VDD -|1 18|- VSS
RA0 -|2 17|- RA1
RA2 -|3 16|- RA3
RA4 -|4 15|- RA5
RB0 -|5 14|- RB7
RB1 -|6 13|- RB6
RB2 -|7 12|- RB5
RB3 -|8 11|- RB4
RC0 -|9 10|- RC1
+-------------+
以下是一個PID控制程式碼示例:
#include <16F628.h>
#fuses HS, NOWDT, NOPROTECT, NOBROWNOUT, PUT, NOLVP
#use delay(clock=20000000)
#include <lcd.c>
float setpoint, pv, error, last_error, integral, derivative, output;
float kp = 1.0, ki = 0.5, kd = 0.1; // PID係數
void main()
{
setup_adc_ports(AN0); // 設置模擬輸入腳位
setup_adc(ADC_CLOCK_DIV_8);
lcd_init(); // 初始化LCD顯示屏
printf(lcd_putc, "PID Controller"); // 顯示歡迎信息
while(1)
{
setpoint = 25.0; // 設置目標溫度
pv = read_adc(); // 讀取感測器數據
error = setpoint - pv; // 計算偏差
integral = integral + error; // 計算積分項
derivative = error - last_error; // 計算微分項
output = kp * error + ki * integral + kd * derivative; // 計算輸出
last_error = error; // 保存上一次偏差
printf(lcd_putc, "\f"); // 清屏
printf(lcd_putc, "SP:%2.2f PV:%2.2f", setpoint, pv); // 顯示目標和實際溫度
printf(lcd_putc, "\n"); // 換行
printf(lcd_putc, "Output:%2.2f", output); // 顯示輸出
delay_ms(1000); // 延遲1秒
}
}
|
|