冰楓論壇

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

[討論] PIC16F690

[複製鏈接]

2609

主題

0

好友

1000

積分

金牌會員

Rank: 6Rank: 6

UID
373967
帖子
8867
主題
2609
精華
0
積分
1000
楓幣
15
威望
977
存款
34822
贊助金額
0
推廣
0
GP
1205
閱讀權限
70
在線時間
455 小時
註冊時間
2023-1-12
最後登入
2024-11-22

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

跳轉到指定樓層
1
發表於 2023-4-27 06:12:49 |只看該作者 |倒序瀏覽
製作PID控制器需要以下零件:

PIC16F690 微控制器
10K歐姆電阻器
0.1微法電容器
16x2 LCD顯示屏
L293D 馬達驅動模組
直流馬達
電源供應器
杜邦線
PIC16F690 的連接腳位:

RA0 - ADC輸入1
RA1 - ADC輸入2
RA2 - ADC輸入3
RA4 - 馬達正轉
RA5 - 馬達反轉
RC0 - LCD D4
RC1 - LCD D5
RC2 - LCD D6
RC3 - LCD D7
RC4 - LCD RS
RC5 - LCD E
RC6 - 調節器PWM輸出
RC7 - 馬達使能

以下是 PIC16F690 的 PID 控制器程式碼:


#include <xc.h>
#include <stdio.h>
#include "lcd.h"

#pragma config FOSC = INTOSCIO
#pragma config WDTE = OFF
#pragma config PWRTE = OFF
#pragma config MCLRE = OFF
#pragma config CP = OFF
#pragma config CPD = OFF
#pragma config BOREN = OFF
#pragma config IESO = OFF
#pragma config FCMEN = OFF
#pragma config LVP = OFF

#define _XTAL_FREQ 8000000

int kp = 10;
int ki = 5;
int kd = 2;

int setpoint = 50;
int error = 0;
int prev_error = 0;
int integral = 0;
int derivative = 0;
int output = 0;

void init_ADC(void)
{
    ADCON0 = 0b00000001;
    ADCON1 = 0b00000000;
    ANSEL = 0b00000111;
    TRISA = 0b00000111;
}

void init_PWM(void)
{
    PR2 = 249;
    T2CON = 0b00000101;
    CCP1CON = 0b00111100;
}

void init_LCD(void)
{
    lcd_init();
    lcd_puts("PID Controller");
    lcd_gotoxy(0, 1);
    lcd_puts("Setpoint: ");
    lcd_putc(setpoint + '0');
}

int read_ADC(int channel)
{
    ADCON0 &= 0b11000101;
    ADCON0 |= (channel << 3);
    __delay_us(10);
    GO_nDONE = 1;
    while (GO_nDONE);
    return (ADRESH << 8) | ADRESL;
}

int compute_PID(int input)
{
    error = setpoint - input;
    integral += error;
    derivative = error - prev_error;
    prev_error = error;
    output = kp * error + ki * integral + kd * derivative;
    return output;
}

void set_motor_speed(int speed)
{
    if (speed >= 0)
    {
        RA4 = 1;
        RA5 = 0;
        CCPR1L = speed >> 2;
        CCP1CON &= 0b11001111;
        CCP1CON |= (speed<< 2) & 0b00110000;
}
{
RA4 = 0;
RA5 = 1;
CCPR1L = (-speed) >> 2;
CCP1CON &= 0b11001111;
CCP1CON |= ((-speed) << 2) & 0b00110000;
}
}

void main(void)
{
OSCCON = 0b01110000;
init_ADC();
init_PWM();
init_LCD();

while (1)
{
    int input = read_ADC(0);
    int speed = compute_PID(input);
    set_motor_speed(speed);
    lcd_gotoxy(9, 1);
    lcd_putc((input / 100) + '0');
    lcd_putc(((input % 100) / 10) + '0');
    lcd_putc((input % 10) + '0');
    __delay_ms(100);
}
}



這個程式使用 ADC 讀取輸入,計算 PID 控制器輸出,並通過 PWM 控制馬達速度。

它還使用 LCD 顯示輸入和設置點,以及用於計算 PID 的係數 kp、ki 和 kd。
[發帖際遇]: 洪嵐峰 不幸喝到「英狗狼」的毒茶飲,因而獲得健康賠償 1 楓幣 幸運榜 / 衰神榜
收藏收藏0 推0 噓0


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

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

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

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

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

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

GMT+8, 2024-11-22 05:26

回頂部