冰楓論壇

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

[討論] PIC18F4520

[複製鏈接]

2609

主題

0

好友

1003

積分

金牌會員

Rank: 6Rank: 6

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

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

跳轉到指定樓層
1
發表於 2023-5-1 15:00:45 |只看該作者 |倒序瀏覽
具有電流保護、過放保護和過壓保護的 PIC18F4520 電池保護板需要以下零件:

N 沟道 MOSFET(例如IRF5305)- 用於斷開電池與輸出之間的連接,以防止過放或過充。
整流二極管(例如1N4007)- 用於保護 MOSFET 免受反向電壓。
保險絲 - 用於保護電路免受過流。
電容(例如100uF)- 用於穩定輸出電壓。
電感(例如10uH)- 用於穩定輸出電流。
電壓檢測電路(例如LM358)- 用於檢測電池電壓。
電流檢測電路(例如INA219)- 用於檢測輸出電流。

下面是具有電流保護、過放保護和過壓保護的 PIC18F4520 電池保護板

程式碼(使用 C 語言和 MPLAB X IDE):



c

#include <xc.h>
#include <stdbool.h>
#include "ina219.h"

#pragma config OSC = INTIO67 // 使用內部晶振
#pragma config WDT = OFF     // 關閉看門狗計時器
#pragma config LVP = OFF     // 關閉低電壓編程模式

#define FOSC 8000000        // 內部晶振頻率
#define FCY (FOSC/4)        // 計數器頻率 (Fcy = Fosc/4)

// 腳位定義
#define LED LATBbits.LATB0   // LED 輸出腳
#define MOSFET LATBbits.LATB1// MOSFET 控制腳
#define CURRENT RB2          // 電流檢測腳

// 定義 INA219 地址和校正係數
#define INA219_ADDR 0x40
#define INA219_CALIBRATION 10280.0

// 計時器 1 初始化
void T1_Init(void) {
    T1CONbits.TMR1ON = 0;       // 停止計數器
    T1CONbits.TMR1CS = 0;       // 使用內部時鐘
    T1CONbits.T1CKPS = 0b11;    // 設置分頻器 1:8
    TMR1 = 0;                   // 計數器

PR1 = 62499;                // 設置計數器溢出時間(62500 個週期 @ 8 MHz)
T1CONbits.TMR1ON = 1;       // 啟動計數器
}

// ADC 初始化
void ADC_Init(void) {
ANSELB = 0b00000100; // 啟用 RB2 腳位的 ADC
ADCON0 = 0b00001101; // 設置 ADC 為單次模式,使用 Fosc/8 時鐘
ADCON1 = 0b00000000; // 設置 ADC 為左對齊模式,使用 VDD 和 VSS 參考電壓
ADCON2 = 0b10101110; // 設置 ADC 週期為 12 TAD,使用 TAD = Fosc/64
}

// 計算電流值
float Get_Current(void) {
float current;
current = INA219_Get_Current(INA219_ADDR, INA219_CALIBRATION);
return current;
}

void main(void) {
// 腳位初始化
TRISB = 0b00000100; // 設置 RB2 為輸入,RB0 和 RB1 為輸出
MOSFET = 0; // 初始化 MOSFET 為關閉狀態
LED = 0; // 初始化 LED 為關閉狀態

// INA219 初始化
INA219_Init(INA219_ADDR, INA219_CALIBRATION);

// 計時器 1 初始化
T1_Init();

// ADC 初始化
ADC_Init();

while (1) {
    if (ADC_Read(2) > 600) {    // 檢測電池電壓是否低於閾值
        MOSFET = 0;             // 關閉 MOSFET
        LED = 1;                // 打開 LED
    }
    else {
        MOSFET = 1;             // 打開 MOSFET
        LED = 0;                // 關閉 LED
    }

    // 檢測輸出電流是否超過閾值
    if (Get_Current() > 1.0) {
        MOSFET = 0;             // 關閉 MOSFET
        LED = 1;                // 打開 LED
    }

    // 檢測過壓
    if (ADC_Read(2) > 1400) {   // 如果電池電壓高於 14V
        MOSFET = 0;             // 關閉 MOSFET
        LED = 1;                // 打開 LED
        while (1) {
            // 等待手動重啟
        }
    }

    __delay_ms(10);             // 延遲 10 毫秒
}
}



此程式碼的作用如下:

設置 PIC18F4520 的輸入和輸出腳位。
初始化 INA219
初始化計時器 T1 和 ADC。
在 while 循環中,不斷檢測電池的電壓、輸出電流和過壓狀態。
如果電池電壓低於閾值(600),關閉 MOSFET,打開 LED。
如果輸出電流超過閾值(1.0A),關閉 MOSFET,打開 LED。
如果電池電壓高於閾值(1400),關閉 MOSFET,打開 LED,進入無限循環等待手動重啟。
在每次循環中延遲 10 毫秒。
這個程式碼利用計時器 T1 和 ADC 監控電池的電壓和輸出電流,並根據閾值控制 MOSFET 的開關,實現了對電池的過放保護、電流保護和過壓保護。
當電池處於過放或過壓狀態時,程式會自動斷開輸出,並通過 LED 提示用戶。
當輸出電流超過閾值時,程式也會自動斷開輸出。
如果電池處於過壓狀態,程式會進入無限循環等待手動重啟。
[發帖際遇]: 洪嵐峰 支持『反黑箱課綱』活動,因而獲得民主獎勵 1 楓幣 幸運榜 / 衰神榜
收藏收藏0 推0 噓0


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

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

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

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

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

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

GMT+8, 2024-12-22 11:47

回頂部