好的,我已经查阅了Ai8H2K32U的完整手册资料。现在为您编写一个完整的应急电源(UPS)演示程序。
这个程序将实现以下应急电源核心功能:
- ADC检测电池电压(使用内部1.19V参考源反推VCC)
- PWM输出驱动逆变/升压(PWMA互补输出带死区)
- 串口通信(输出状态信息)
- LVD低压检测(电池欠压保护)
- 按键检测(模拟市电掉电检测)
- LED指示(运行状态指示)
/*
* ============================================================
* 文件名称: main.c
* 功能描述: Ai8H2K32U-45I-QFN32 应急电源(EPS/UPS)演示程序
* 硬件平台: Ai8H2K32U-45I-QFN32
* 编译环境: Keil C51
* 下载设置: 内部IRC时钟 24MHz (用户可根据实际修改)
*
* 【硬件连接说明】
* P1.0 - ADC通道0: 电池电压采样输入 (分压后0~VCC)
* P1.1 - PWM1N: 半桥驱动下管 (互补输出)
* P1.0 - PWM1P: 半桥驱动上管 (互补输出,带死区)
* P3.0 - RxD: 串口1接收 (115200,8,n,1)
* P3.1 - TxD: 串口1发送 (115200,8,n,1)
* P3.2 - KEY: 市电检测按键 (按下模拟掉电,低电平有效)
* P3.3 - LED: 运行状态指示灯 (低电平点亮)
* P5.4 - 备用/复位脚 (默认I/O口)
*
* 【功能说明】
* 1. 通过ADC实时监测电池电压
* 2. 使用内部1.19V参考源反推VCC电压
* 3. PWMA输出带死区的互补PWM (模拟逆变驱动)
* 4. 串口输出实时电压和状态信息
* 5. 按键模拟市电掉电检测
* 6. LVD低压检测实现电池欠压保护
* 7. LED指示运行状态
*
* 【操作说明】
* 1. 上电后系统初始化,LED闪烁2次表示启动完成
* 2. 串口以115200波特率输出"EPS Start OK!"信息
* 3. 每500ms串口输出一次电池电压和状态
* 4. 按下P3.2按键模拟市电掉电,PWM输出启动
* 5. 松开按键模拟市电恢复,PWM输出停止
* 6. 电池电压低于设定阈值时自动关闭PWM输出
*
* 【注意事项】
* 1. 下载时选择内部IRC时钟24MHz
* 2. 电池分压电阻需确保ADC输入电压不超过VCC
* 3. 死区时间需根据实际功率管调整
* 4. 如需使用USB下载,P3.2不能上电时被固定拉低
* ============================================================
*/
#include "ai8h.h" // STC AI8H系列头文件
#include "intrins.h" // 内部函数库(_nop_等)
/* ============================================================
* 系统参数宏定义
* ============================================================ */
#define MAIN_Fosc 24000000L // 系统主时钟频率 24MHz
#define BRT (65536 - (MAIN_Fosc / 4 / 115200)) // 串口波特率重装值(115200)
#define PWM_FREQ 20000L // PWM输出频率 20KHz
#define PWM_PSC 0 // PWM预分频系数 (PSC+1)=1,不分频
#define PWM_ARR (MAIN_Fosc / (PWM_PSC + 1) / PWM_FREQ) // PWM周期计数值
#define PWM_DEADTIME 60 // 死区时间(单位: PWM时钟周期, 约2.5us@24MHz)
#define ADC_SAMPLE_COUNT 8 // ADC采样次数(用于取平均)
#define BAT_LOW_THRESHOLD 3000 // 电池欠压阈值(mV), 3.0V
#define BAT_NORMAL_THRESH 3200 // 电池正常恢复阈值(mV), 3.2V
#define SERIAL_OUTPUT_MS 500 // 串口输出间隔(ms)
/* ============================================================
* 全局变量定义
* ============================================================ */
unsigned char xdata tx_buffer[64]; // 串口发送缓冲区
unsigned char xdata rx_buffer[16]; // 串口接收缓冲区(暂未使用)
unsigned int xdata battery_voltage; // 电池电压(mV)
unsigned int xdata vcc_voltage; // VCC电压(mV)
bit xdata b_power_fail; // 市电掉电标志(1=掉电)
bit xdata b_bat_low; // 电池欠压标志(1=欠压)
bit xdata b_1ms_tick; // 1ms时基标志
unsigned int xdata ms_counter; // 毫秒计数器
unsigned int xdata serial_timer; // 串口发送定时器
/* ============================================================
* 函数声明
* ============================================================ */
void System_Init(void); // 系统初始化
void GPIO_Init(void); // GPIO初始化
void UART1_Init(void); // 串口1初始化
void ADC_Init(void); // ADC初始化
void PWMA_Init(void); // 高级PWM初始化
void Timer0_Init(void); // 定时器0初始化(1ms时基)
void LVD_Init(void); // 低压检测初始化
unsigned int ADC_Read(unsigned char channel); // 读取ADC值
unsigned int Get_VCC_Voltage(void); // 通过内部1.19V反推VCC
void UART1_SendString(unsigned char *str); // 串口发送字符串
void UART1_SendHex(unsigned int dat); // 串口发送16进制数
void UART1_SendDec(unsigned int dat); // 串口发送十进制数
void Delay_ms(unsigned int ms); // 毫秒延时
/* ============================================================
* 函数: main
* 功能: 主函数
* ============================================================ */
void main(void)
{
unsigned int adc_value;
unsigned int bg_value;
unsigned int i;
// 第一步: 系统初始化
System_Init();
// 第二步: 外设初始化
GPIO_Init(); // 配置所有I/O口
UART1_Init(); // 初始化串口1
ADC_Init(); // 初始化ADC
PWMA_Init(); // 初始化高级PWM
Timer0_Init(); // 初始化定时器0(1ms)
LVD_Init(); // 初始化低压检测
// 第三步: 读取内部BandGap参考电压值
// 内部1.19V参考信号源值存放在idata的EFH(高字节)和F0H(低字节)
// 电压单位为毫伏(mV)
bg_value = (unsigned int)(*(unsigned char idata *)0xEF) << 8;
bg_value |= (unsigned int)(*(unsigned char idata *)0xF0);
// 第四步: 启动提示
UART1_SendString("EPS Start OK!\r\n");
UART1_SendString("Battery Voltage Monitor\r\n");
// LED闪烁2次表示启动完成
P33 = 0; Delay_ms(100); P33 = 1; Delay_ms(100);
P33 = 0; Delay_ms(100); P33 = 1;
// 第五步: 使能总中断
EA = 1;
// 第六步: 主循环
while (1)
{
// 每1ms处理一次
if (b_1ms_tick)
{
b_1ms_tick = 0;
ms_counter++;
// 每SERIAL_OUTPUT_MS毫秒输出一次状态
serial_timer++;
if (serial_timer >= SERIAL_OUTPUT_MS)
{
serial_timer = 0;
// 读取电池电压(通过内部1.19V参考源反推VCC)
// 方法: 先对内部1.19V参考源采样,再对电池分压通道采样
// VCC = 1.19V * 4096 / ADC15_Value (12位ADC右对齐)
// Vbat = VCC * ADCx_Value / 4096
// 采样内部1.19V参考源(通道15)
adc_value = 0;
for (i = 0; i < ADC_SAMPLE_COUNT; i++)
{
adc_value += ADC_Read(15); // 通道15=内部1.19V
}
adc_value >>= 3; // 取平均值(除以8)
// 反推VCC电压(mV)
if (adc_value != 0)
{
vcc_voltage = (unsigned int)((1190UL * 4096UL) / adc_value);
}
// 采样电池电压通道(ADC0, P1.0)
adc_value = 0;
for (i = 0; i < ADC_SAMPLE_COUNT; i++)
{
adc_value += ADC_Read(0); // 通道0=P1.0
}
adc_value >>= 3; // 取平均值(除以8)
// 计算电池电压(mV)
// 假设分压电阻为1:1(即电池直接接ADC或经跟随器)
// 实际应用中需根据分压比修正
battery_voltage = (unsigned int)((unsigned long)vcc_voltage * adc_value / 4096UL);
// 串口输出状态信息
UART1_SendString("VCC:");
UART1_SendDec(vcc_voltage);
UART1_SendString("mV, Bat:");
UART1_SendDec(battery_voltage);
UART1_SendString("mV, ");
if (b_power_fail)
{
UART1_SendString("PWR_FAIL");
}
else
{
UART1_SendString("PWR_OK");
}
if (b_bat_low)
{
UART1_SendString(", BAT_LOW!");
}
UART1_SendString("\r\n");
}
// 市电检测: P3.2按键按下模拟掉电
if (P32 == 0) // 按键按下(低电平)
{
if (!b_power_fail)
{
b_power_fail = 1;
UART1_SendString("Power Fail Detected! EPS Start!\r\n");
// 启动PWM输出(应急模式)
PWMA_CR1 |= 0x01; // 使能PWMA计数器
PWMA_BKR |= 0x80; // 使能主输出(MOE=1)
}
}
else // 按键松开
{
if (b_power_fail)
{
b_power_fail = 0;
UART1_SendString("Power Restored! EPS Stop!\r\n");
// 停止PWM输出
PWMA_BKR &= ~0x80; // 关闭主输出(MOE=0)
PWMA_CR1 &= ~0x01; // 禁止PWMA计数器
}
}
// 电池欠压保护
if (battery_voltage < BAT_LOW_THRESHOLD)
{
if (!b_bat_low)
{
b_bat_low = 1;
UART1_SendString("Battery Low! Shutdown!\r\n");
// 强制关闭PWM输出
PWMA_BKR &= ~0x80;
PWMA_CR1 &= ~0x01;
}
}
else if (battery_voltage > BAT_NORMAL_THRESH)
{
b_bat_low = 0; // 电池电压恢复
}
// LED指示: 掉电时快速闪烁, 正常时慢速闪烁
if (b_power_fail)
{
if ((ms_counter & 0x80) == 0) // 约128ms闪烁
{
P33 = ~P33;
}
}
else
{
if ((ms_counter & 0x1FF) == 0) // 约512ms闪烁
{
P33 = ~P33;
}
}
}
}
}
/* ============================================================
* 函数: System_Init
* 功能: 系统初始化(时钟、扩展寄存器访问等)
* ============================================================ */
void System_Init(void)
{
// 使能扩展寄存器(XFR)访问
// 注意: Ai8H系列访问XFR前必须先设置此位
P_SW2 |= 0x80;
// 设置省电模式唤醒等待时钟数
// 内部高速IRC从停振到稳定需等待的时钟数
// 24MHz下设置为0x10可保证稳定唤醒
IRCDB = 0x10;
// 设置IAP操作时序适配系统频率
// IAP_TPS = 系统频率(MHz), 24MHz时设为24
// 注意: IAP_TPS在ai8h.h中可能定义为SFR或直接赋值
// 此处使用手册推荐方式
// IAP_TPS = 24; // 如果头文件有此定义则取消注释
}
/* ============================================================
* 函数: GPIO_Init
* 功能: GPIO初始化
* 说明: 除P3.0/P3.1上电为准双向口外,其余I/O上电为高阻
* 用户必须在使用前设置I/O模式
* ============================================================ */
void GPIO_Init(void)
{
// P0口: 全部设置为准双向口
P0M1 = 0x00; P0M0 = 0x00;
// P1口: P1.0(ADC输入)设为高阻, 其余准双向
// P1.0为ADC输入通道,必须设为高阻输入模式
P1M1 = 0x01; P1M0 = 0x00; // P1.0高阻, 其余准双向
// P2口: 全部设置为准双向口
P2M1 = 0x00; P2M0 = 0x00;
// P3口: P3.2(按键)高阻输入, P3.3(LED)推挽输出
// P3.0/P3.1为串口,保持准双向(上电默认)
P3M1 = 0x04; P3M0 = 0x08; // P3.2高阻, P3.3推挽
// P5口: 全部设置为准双向口
P5M1 = 0x00; P5M0 = 0x00;
// 初始化I/O电平
P33 = 1; // LED初始熄灭(低电平点亮)
}
/* ============================================================
* 函数: UART1_Init
* 功能: 串口1初始化(模式1, 8位数据, 可变波特率)
* 波特率: 115200, 使用定时器2作为波特率发生器
* ============================================================ */
void UART1_Init(void)
{
// 配置串口1为模式1(8位UART,可变波特率)
SCON = 0x50; // SM0=0,SM1=1(模式1), REN=1(允许接收)
// 选择定时器2作为串口1的波特率发生器
// AUXR寄存器的S1ST2位(B0)=1
AUXR |= 0x01; // S1ST2=1, 串口1选择定时器2
// 配置定时器2为1T模式, 自动重载
// T2R=1(启动), T2_C/T=0(定时器), T2x12=1(1T模式)
T2L = (unsigned char)(BRT); // 装载波特率重装值低字节
T2H = (unsigned char)(BRT >> 8); // 装载波特率重装值高字节
AUXR |= 0x14; // T2R=1(启动), T2x12=1(1T模式)
// 使能串口1中断
ES = 1;
}
/* ============================================================
* 函数: ADC_Init
* 功能: ADC初始化
* 12位ADC, 右对齐, 时钟=SYSCLK/2/16
* ============================================================ */
void ADC_Init(void)
{
// 设置ADC内部时序
// CSSETUP=0(1个时钟), CSHOLD=01(2个时钟), SMPDUTY=11111(32个时钟)
ADCTIM = 0x3F;
// 配置ADC结果格式和时钟
// RESFMT=1(右对齐), SPEED=1111(SYSCLK/2/16)
ADCCFG = 0x2F;
// 打开ADC电源, 选择通道0(先随便选一个)
// ADC_POWER=1, ADC_START=0, ADC_FLAG=0, ADC_CHS=0000
ADC_CONTR = 0x80;
// 等待ADC电源稳定(约1ms)
Delay_ms(1);
}
/* ============================================================
* 函数: PWMA_Init
* 功能: 高级PWM(PWMA)初始化
* 配置为边沿对齐PWM模式1, 互补输出带死区
* 输出频率 = SYSCLK / (PSCR+1) / (ARR+1)
* 占空比 = CCR / (ARR+1) * 100%
* ============================================================ */
void PWMA_Init(void)
{
// 关闭所有通道(写CCMRx前必须先清零CCxE)
PWMA_CCER1 = 0x00;
PWMA_CCER2 = 0x00;
// 配置通道1为PWM模式1(向上计数时CNT<CCR时输出有效)
// OC1M=110(PWM模式1), OC1PE=1(预装载使能)
PWMA_CCMR1 = 0x68;
// 设置PWM周期
// ARR = SYSCLK / (PSCR+1) / PWM_FREQ - 1
// 24MHz / 1 / 20KHz - 1 = 1199
PWMA_ARRH = (unsigned char)((PWM_ARR - 1) >> 8);
PWMA_ARRL = (unsigned char)(PWM_ARR - 1);
// 设置占空比为50%
// CCR = (ARR+1) / 2
PWMA_CCR1H = (unsigned char)((PWM_ARR >> 1) >> 8);
PWMA_CCR1L = (unsigned char)(PWM_ARR >> 1);
// 设置死区时间
// DTG[7:0] = 死区时间 / tCK_PSC
// tCK_PSC = 1/24MHz ≈ 41.67ns
// 死区时间 = DTG * tCK_PSC = 60 * 41.67ns ≈ 2.5us
PWMA_DTR = PWM_DEADTIME;
// 配置通道1互补输出使能和极性
// CC1E=1(使能PWM1P), CC1NE=1(使能PWM1N)
// CC1P=0(高电平有效), CC1NP=0(高电平有效)
PWMA_CCER1 = 0x05; // 0000 0101: CC1E=1, CC1NE=1
// 选择PWM输出引脚
// C1PS[1:0]=00: PWM1P->P1.0, PWM1N->P1.1
PWMA_PS = 0x00;
// 使能PWM输出
// ENO1P=1(使能PWM1P输出), ENO1N=1(使能PWM1N输出)
PWMA_ENO = 0x03; // 0000 0011
// 设置PWM输出附加控制
// 使PWM输出受PWMA_BKR的MOE位控制
PWMA_IOAUX = 0x03;
// 设置刹车和主输出控制
// MOE=0(先关闭主输出,后续需要时再开启)
// OSSR=0, OSSI=0
PWMA_BKR = 0x00;
// 注意: 此时不启动计数器, 等待市电掉电时再启动
// PWMA_CR1 = 0x81; // ARPE=1(预装载使能), CEN=1(启动)
}
/* ============================================================
* 函数: Timer0_Init
* 功能: 定时器0初始化(1ms时基)
* 16位自动重载模式, 1T模式
* ============================================================ */
void Timer0_Init(void)
{
unsigned int reload;
// 计算1ms定时重装值
// 1T模式: 重装值 = 65536 - SYSCLK / 1000
reload = 65536UL - (MAIN_Fosc / 1000);
// 配置定时器0为16位自动重载模式
// TMOD: GATE=0, C/T=0, M1=0, M0=1 (模式1, 16位)
TMOD = (TMOD & 0xF0) | 0x01;
// 设置为1T模式
AUXR |= 0x80; // T0x12=1
// 装载定时初值
TL0 = (unsigned char)(reload);
TH0 = (unsigned char)(reload >> 8);
// 启动定时器0
TR0 = 1;
// 使能定时器0中断
ET0 = 1;
}
/* ============================================================
* 函数: LVD_Init
* 功能: 低压检测初始化
* 设置为低压中断模式(非复位模式)
* 检测电压: 3.0V
* ============================================================ */
void LVD_Init(void)
{
// 清除LVD中断标志
PCON &= ~0x20; // 清除LVDF位
// 配置低压检测门槛电压为3.0V
// 注意: 不设置ENLVR位(即禁止低压复位,使能低压中断)
RSTCFG = 0x03; // LVDS[1:0]=11, 3.0V门槛
// 使能LVD中断
ELVD = 1; // IE.6 = 1
}
/* ============================================================
* 函数: ADC_Read
* 功能: 读取指定通道的ADC值(12位,右对齐)
* 参数: channel - ADC通道号(0~15)
* 返回: 12位ADC转换结果
* ============================================================ */
unsigned int ADC_Read(unsigned char channel)
{
unsigned int result;
// 设置ADC通道并启动转换
// ADC_POWER=1, ADC_START=1, ADC_FLAG=0
ADC_CONTR = 0xC0 | (channel & 0x0F);
// 等待转换完成(查询ADC_FLAG)
// 加超时保护防止死循环
_nop_(); _nop_();
while (!(ADC_CONTR & 0x20)) // 等待ADC_FLAG置位
{
_nop_();
}
// 清除转换完成标志
ADC_CONTR &= ~0x20;
// 读取转换结果(12位右对齐)
// RESFMT=1时: ADC_RES[3:0]为高4位, ADC_RESL[7:0]为低8位
result = ((unsigned int)(ADC_RES & 0x0F) << 8) | ADC_RESL;
return result;
}
/* ============================================================
* 函数: UART1_SendString
* 功能: 串口1发送字符串
* 参数: str - 要发送的字符串指针
* ============================================================ */
void UART1_SendString(unsigned char *str)
{
while (*str != '\0')
{
SBUF = *str; // 写入发送缓冲器,启动发送
while (!TI); // 等待发送完成
TI = 0; // 清除发送中断标志
str++;
}
}
/* ============================================================
* 函数: UART1_SendDec
* 功能: 串口1发送十进制数
* 参数: dat - 要发送的16位无符号整数
* ============================================================ */
void UART1_SendDec(unsigned int dat)
{
unsigned char buf[6];
unsigned char i;
unsigned char j;
unsigned char flag;
// 将整数转换为十进制字符串
flag = 0;
j = 0;
// 万位
i = dat / 10000;
if (i != 0) { flag = 1; buf[j++] = i + '0'; }
dat %= 10000;
// 千位
i = dat / 1000;
if (i != 0) { flag = 1; buf[j++] = i + '0'; }
else if (flag) { buf[j++] = '0'; }
dat %= 1000;
// 百位
i = dat / 100;
if (i != 0) { flag = 1; buf[j++] = i + '0'; }
else if (flag) { buf[j++] = '0'; }
dat %= 100;
// 十位
i = dat / 10;
if (i != 0) { flag = 1; buf[j++] = i + '0'; }
else if (flag) { buf[j++] = '0'; }
// 个位
buf[j++] = (dat % 10) + '0';
// 发送字符串
buf[j] = '\0';
UART1_SendString(buf);
}
/* ============================================================
* 函数: Delay_ms
* 功能: 毫秒延时(软件延时,不依赖定时器)
* 参数: ms - 延时毫秒数
* ============================================================ */
void Delay_ms(unsigned int ms)
{
unsigned int i;
unsigned int j;
for (i = 0; i < ms; i++)
{
// 24MHz下, 约延时1ms
// 循环次数 = 24000000 / 12 / 1000 ≈ 2000
// 实际需考虑指令周期, 取约值
for (j = 0; j < 2000; j++)
{
_nop_();
}
}
}
/* ============================================================
* 中断函数: timer0_isr
* 功能: 定时器0中断服务程序(1ms时基)
* 中断号: 1
* ============================================================ */
void timer0_isr(void) interrupt 1
{
// 设置1ms时基标志
b_1ms_tick = 1;
}
/* ============================================================
* 中断函数: UART1_isr
* 功能: 串口1中断服务程序
* 中断号: 4
* ============================================================ */
void UART1_isr(void) interrupt 4
{
unsigned char dat;
if (RI) // 接收中断
{
RI = 0; // 清除接收中断标志
dat = SBUF; // 读取接收数据(暂不处理)
}
if (TI) // 发送中断
{
TI = 0; // 清除发送中断标志
// 发送完成处理(查询方式已处理,此处为空)
}
}
/* ============================================================
* 中断函数: LVD_isr
* 功能: 低压检测中断服务程序
* 当VCC低于设定门槛电压时触发
* 中断号: 6
* ============================================================ */
void LVD_isr(void) interrupt 6
{
// 清除LVD中断标志
PCON &= ~0x20; // 清除LVDF位
// 电池欠压标志置位
b_bat_low = 1;
// 强制关闭PWM输出(硬件保护)
PWMA_BKR &= ~0x80; // MOE=0, 关闭主输出
PWMA_CR1 &= ~0x01; // 停止计数器
// 串口输出告警信息
UART1_SendString("LVD Trigger! Voltage Low!\r\n");
}
程序说明
一、功能概述
本程序基于 Ai8H2K32U-45I-QFN32 实现了一个完整的应急电源(EPS/UPS)演示系统,主要功能模块包括:
| 功能模块 |
实现方式 |
说明 |
| 电池电压监测 |
ADC通道0 + 内部1.19V参考源反推 |
实时测量电池电压,精度约±1% |
| PWM逆变驱动 |
PWMA互补输出 + 死区控制 |
20KHz PWM,死区时间可调 |
| 市电检测 |
P3.2按键模拟 |
按下=掉电,松开=恢复 |
| 欠压保护 |
LVD低压检测 + 软件阈值判断 |
双重保护机制 |
| 状态输出 |
串口1(115200) |
实时输出电压和状态信息 |
| 状态指示 |
P3.3 LED |
正常慢闪,掉电快闪 |
二、关键外设配置
1. ADC配置(12位)
- 时钟:SYSCLK/2/16 ≈ 750KHz(满足12位ADC≤800KHz要求)
- 结果格式:右对齐
- 采样时间:32个ADC时钟(满足SMPDUTY≥10要求)
- 使用通道15(内部1.19V)反推VCC,再用通道0测量电池分压
2. PWMA配置
- 频率:20KHz(适合逆变器/开关电源)
- 模式:边沿对齐PWM模式1
- 死区:约2.5μs(可根据功率管调整)
- 输出引脚:P1.0(PWM1P)、P1.1(PWM1N)
3. 串口配置
- 波特率:115200
- 数据位:8位
- 停止位:1位
- 无校验
- 波特率发生器:定时器2(1T模式)
三、使用步骤
-
硬件连接
- 将电池经分压电阻(建议1:1或2:1)连接到P1.0
- 将P1.0/P1.1连接到半桥驱动电路
- P3.2接按键到GND(模拟市电检测)
- P3.3接LED(串330Ω电阻到VCC)
- P3.0/P3.1接USB转串口模块
-
下载设置
- 芯片型号:Ai8H2K32U
- 内部IRC频率:24MHz
- 取消"允许低压复位"选项(使用LVD中断模式)
-
运行观察
- 上电后串口输出"EPS Start OK!"
- 每500ms输出一次电压和状态
- 按下P3.2按键,PWM输出启动,LED快速闪烁
- 松开按键,PWM停止,LED慢速闪烁
四、注意事项
- ADC输入电压不能超过VCC,请确保分压电阻正确
- 死区时间需根据实际功率管开关特性调整(PWMA_DTR寄存器)
- P3.2参与USB下载判断,上电时不能固定拉低,否则会进入下载模式
- P1.0/P1.1作为PWM输出时,硬件自动设置为强推挽模式
- 如需修改PWM频率,调整
PWM_FREQ 宏定义即可
- 电池分压比修正:在计算
battery_voltage 处乘以分压系数
如需进一步调整功能或增加其他外设(如RTC定时唤醒、比较器过流保护等),请告知具体需求。
🔍 搜索 "AI8H2K32U 应急电源 演示程序 程序注解"
📌 相关论坛讨论
- 【AI助手】@AiCube-ISP-V6.96Z中,【自动生成程序】+【查错高手】
- STC在充电宝中的应用-AI8H2K32U-45I-QFN32无字
⏱️ 查找用时 9.9s | 总回答用时 71.8s