简化能源消耗,提高电池安全性,并改善整体系统效率。
A
A
硬件概览
它是如何工作的?
BATT-MAN 3 Click基于ADP5350,这是由Analog Devices提供的先进电池管理PMIC,具有感应升压LED和三个LDO稳压器。它结合了一个高性能降压稳压器用于单锂离子/锂离子聚合物电池充电(也可以在左侧标记为BUCK的端口上使用)、一个燃料计量器、一个高度可编程的升压稳压器用于LED背光照明、一个超低静态电流的低压差(LDO)稳压器以及两个通用LDO稳压器。此外,它支持优化的USB 5V输入的USB连接。ADP5350在涓流充电模式和恒流(CC)/恒压(CV)快速充电模式下工作。它还具有一个内部场效应晶体管(FET),允许在系统电源侧隔离电池。ADP5350燃料计量器是一种低电流消耗的解决方案,适用于可充电锂离子电池供电的设备。其升压稳压器以1.5MHz的开关频率工作。它可以用作恒压稳压器或VOUT4端子的多个LED背光驱动
器的补充恒流稳压器。该LED驱动器可以支持各种LED背光配置,可以并联或串联多个LED,连接在右上方的板载端口上。此Click board™还具有升压稳压器的反馈感应,可以通过将标记为MODE SEL的SMD跳线置于标记为STAL和LED的适当位置来选择独立或LED工作模式。用户还可以通过安装或移除R11和R9两个跳线来激活或停用板子的升压和LED部分。BATT-MAN 3 Click使用标准I2C两线接口与MCU通信,以读取数据和配置设置,最大频率为400kHz。此外,它使用多个GPIO引脚,其中一个是中断引脚,连接到mikroBUS™插座的INT引脚,用作“故障”指示器,当发生故障时立即通知主机。ADP5350顶部端子标记为VOUT1至VOUT3的低压差(LDO)稳压器优化为在低关闭电流和静态电流下运行,以延长电池寿命。该设备是一个可以打开或关闭的负载开关。I2C接口使所
有参数的可编程性,包括操作监控和安全控制的状态位回读。此Click board™使用两个LED指示灯,标记为PGOOD和BATT OK,分别用作电源良好和充电状态指示器,以及板子左上方保留的用于锂离子/锂离子聚合物电池的连接器。PGOOD指示良好的输入电源,而BATT OK显示电池电压的实时状态。它还具有通过连接到板载端子标记为NTC的内部或外部热敏电阻进行的电池组温度感应功能。当电池组温度超过规定范围时,这种感应将阻止充电。可以通过将标记为TMP SEL的SMD跳线置于标记为EXT和INT的适当位置来选择热敏电阻。此Click board™只能在5V逻辑电压水平下运行。因此,在使用不同逻辑电平的MCU之前,必须进行适当的逻辑电压电平转换。此外,此Click board™配备了包含函数和示例代码的库,可用作进一步开发的参考。
功能概述
开发板
Flip&Click PIC32MZ 是一款紧凑型开发板,设计为一套完整的解决方案,它将 Click 板™的灵活性带给您喜爱的微控制器,使其成为实现您想法的完美入门套件。它配备了一款板载 32 位 PIC32MZ 微控制器,Microchip 的 PIC32MZ2048EFH100,四个 mikroBUS™ 插槽用于 Click 板™连接,两个 USB 连接器,LED 指示灯,按钮,调试器/程序员连接器,以及两个与 Arduino-UNO 引脚兼容的头部。得益于创
新的制造技术,它允许您快速构建具有独特功能和特性的小工具。Flip&Click PIC32MZ 开发套件的每个部分都包含了使同一板块运行最高效的必要组件。此外,还可以选择 Flip&Click PIC32MZ 的编程方式,使用 chipKIT 引导程序(Arduino 风格的开发环境)或我们的 USB HID 引导程序,使用 mikroC、mikroBasic 和 mikroPascal for PIC32。该套件包括一个通过 USB 类型-C(USB-C)连接器的干净且调
节过的电源供应模块。所有 mikroBUS™ 本身支持的 通信方法都在这块板上,包括已经建立良好的 mikroBUS™ 插槽、用户可配置的按钮和 LED 指示灯。Flip&Click PIC32MZ 开发套件允许您在几分钟内创建新的应用程序。它由 Mikroe 软件工具原生支持,得益于大量不同的 Click 板™(超过一千块板),其数量每天都在增长,它涵盖了原型制作的许多方面。
微控制器概述
MCU卡片 / MCU

建筑
PIC32
MCU 内存 (KB)
2048
硅供应商
Microchip
引脚数
100
RAM (字节)
524288
使用的MCU引脚
mikroBUS™映射器
“仔细看看!”
Click board™ 原理图

一步一步来
项目组装
实时跟踪您的结果
应用程序输出
1. 应用程序输出 - 在调试模式下,“应用程序输出”窗口支持实时数据监控,直接提供执行结果的可视化。请按照提供的教程正确配置环境,以确保数据正确显示。

2. UART 终端 - 使用UART Terminal通过USB to UART converter监视数据传输,实现Click board™与开发系统之间的直接通信。请根据项目需求配置波特率和其他串行设置,以确保正常运行。有关分步设置说明,请参考提供的教程。

3. Plot 输出 - Plot功能提供了一种强大的方式来可视化实时传感器数据,使趋势分析、调试和多个数据点的对比变得更加直观。要正确设置,请按照提供的教程,其中包含使用Plot功能显示Click board™读数的分步示例。在代码中使用Plot功能时,请使用以下函数:plot(insert_graph_name, variable_name);。这是一个通用格式,用户需要将“insert_graph_name”替换为实际图表名称,并将“variable_name”替换为要显示的参数。

软件支持
库描述
该库包含 BATT-MAN 3 Click 驱动程序的 API。
关键功能:
battman3_get_battery_voltage
- 读取电池电压水平battman3_set_ldo_vout
- 设置LDO的电压输出battman3_set_charge_termination_voltage
- 设置充电终止电压
开源
代码示例
完整的应用程序代码和一个现成的项目可以通过NECTO Studio包管理器直接安装到NECTO Studio。 应用程序代码也可以在MIKROE的GitHub账户中找到。
/*!
* @file main.c
* @brief BATT-MAN3 Click example
*
* # Description
* This example showcases ability of device to charge battery,
* and outputs and supply 4 different devices with 3 LDO's and
* 1 boost channel.
*
* The demo application is composed of two sections :
*
* ## Application Init
* Initialization of the communication modules(UART, I2C) and 3 additional
* input pins(power good, battery ok, and interrupt). Configures device
* to enable charging, battery voltage monitoring, sets charging termination
* to 3.7V, charging threshold to 3.1V and dead battery to 2.5V. Enables all
* 3 LDO's( channel 1 -> 3.3V, channel 2 -> 1.5V, and channel 3 -> 2.5V ).
*
* ## Application Task
* Reads battery voltage level and logs it. Besides that reads status and logs
* every change on charging and battery status. If power good flag occurs(PGD
* pin goes low) disables LDO's, and reenables them when battery is full(when
* battery reaches charging termination voltage).
*
* @author Luka Filipovic
*
*/
#include "board.h"
#include "log.h"
#include "battman3.h"
/**
* @brief BATT-MAN 3 Click LOG delay.
* @details Macro that specifies delay between logs of battery voltage.
*/
#define LOG_THRESHOLD_1SEC 10
#define LOG_THRESHOLD_3SEC 30
#define LOG_THRESHOLD_5SEC 50
static battman3_t battman3;
static log_t logger;
/**
* @brief Parse charge status.
* @details This function reads charge status 1 and 2
* and logs @b CHAGER_STATUS and @b BATTERY_STATUS on change.
* @return Nothing.
*/
static void battman3_charge_status ( void );
/**
* @brief Enable/Disable all 3 LDO's.
* @details This function sets state of all 3 LDO's.
* @param[in] enable : Enable/Disable.
* @return Nothing.
*/
static void battman3_ldo( uint8_t enable );
void application_init ( void )
{
log_cfg_t log_cfg; /**< Logger config object. */
battman3_cfg_t battman3_cfg; /**< Click config object. */
/**
* Logger initialization.
* Default baud rate: 115200
* Default log level: LOG_LEVEL_DEBUG
* @note If USB_UART_RX and USB_UART_TX
* are defined as HAL_PIN_NC, you will
* need to define them manually for log to work.
* See @b LOG_MAP_USB_UART macro definition for detailed explanation.
*/
LOG_MAP_USB_UART( log_cfg );
log_init( &logger, &log_cfg );
log_info( &logger, " Application Init " );
// Click initialization.
battman3_cfg_setup( &battman3_cfg );
BATTMAN3_MAP_MIKROBUS( battman3_cfg, MIKROBUS_1 );
if ( I2C_MASTER_ERROR == battman3_init( &battman3, &battman3_cfg ) )
{
log_error( &logger, " Communication init." );
for ( ; ; );
}
if ( BATTMAN3_ERROR == battman3_default_cfg ( &battman3 ) )
{
log_error( &logger, " Default configuration." );
for ( ; ; );
}
uint8_t temp_data = 0;
battman3_reg_read( &battman3, BATTMAN3_REG_MANUFACTURE_AND_MODEL_ID, &temp_data );
log_printf( &logger, " > ID: 0x%.2X\r\n", ( uint16_t )temp_data );
battman3_reg_read( &battman3, BATTMAN3_REG_SILICON_REVSION, &temp_data );
log_printf( &logger, " > REV: 0x%.2X\r\n", ( uint16_t )temp_data );
//Charging voltage termination
battman3_set_charge_termination_voltage( &battman3, 3.7 );
//Charging voltage threshold
battman3_set_charge_voltage_threshold( &battman3, BATTMAN3_VTRK_DEAD_2p5V, 3.1 );
//LDO 1
battman3_set_ldo_state( &battman3, BATTMAN3_LDO1, BATTMAN3_ENABLE );
battman3_set_ldo_vout( &battman3, BATTMAN3_LDO1, BATTMAN3_LDO_3p30V );
//LDO 2
battman3_set_ldo_state( &battman3, BATTMAN3_LDO2, BATTMAN3_ENABLE );
battman3_set_ldo_vout( &battman3, BATTMAN3_LDO2, BATTMAN3_LDO_1p50V );
//LDO 3
battman3_set_ldo_state( &battman3, BATTMAN3_LDO3, BATTMAN3_ENABLE );
battman3_set_ldo_vout( &battman3, BATTMAN3_LDO3, BATTMAN3_LDO_2p50V );
log_info( &logger, " Application Task " );
Delay_ms ( 500 );
}
void application_task ( void )
{
static uint8_t counter = 0;
static uint8_t ldo_enable = 1;
float vbat = 0;
if ( !battman3_get_power_good( &battman3 ) && ldo_enable )
{
battman3_ldo( BATTMAN3_DISABLE );
log_printf( &logger, " > Power is not good - LDO disabled\r\n" );
ldo_enable = 0;
}
else if ( battman3_get_power_good( &battman3 ) && !ldo_enable )
{
battman3_ldo( BATTMAN3_ENABLE );
log_printf( &logger, " > Power is good - LDO enabled\r\n" );
ldo_enable = 1;
}
battman3_charge_status( );
if ( counter >= LOG_THRESHOLD_3SEC )
{
counter = 0;
battman3_get_battery_voltage( &battman3, &vbat );
log_printf( &logger, " > Battery voltage: %.2f\r\n", vbat );
log_printf( &logger, "****************************************************\r\n" );
}
counter++;
Delay_ms ( 100 );
}
int main ( void )
{
/* Do not remove this line or clock might not be set correctly. */
#ifdef PREINIT_SUPPORTED
preinit();
#endif
application_init( );
for ( ; ; )
{
application_task( );
}
return 0;
}
static void battman3_charge_status ( void )
{
static uint8_t charge_status1 = 0;
static uint8_t charge_status2 = 0;
uint8_t temp_data = 0;
battman3_reg_read( &battman3, BATTMAN3_REG_CHARGER_STATUS1, &temp_data );
temp_data &= 0x7;
if ( charge_status1 != temp_data )
{
charge_status1 = temp_data;
switch ( charge_status1 )
{
case BATTMAN3_CHARGE_STATUS1_OFF:
{
log_printf( &logger, " > Charge status: off\r\n" );
break;
}
case BATTMAN3_CHARGE_STATUS1_TRICLE_CHARGE:
{
log_printf( &logger, " > Charge status: tricle charge\r\n" );
break;
}
case BATTMAN3_CHARGE_STATUS1_FAST_CHARGE_CC:
{
log_printf( &logger, " > Charge status: fast charge(CC mode)\r\n" );
break;
}
case BATTMAN3_CHARGE_STATUS1_FAST_CHARGE_CV:
{
battman3_ldo( BATTMAN3_ENABLE );/*< Battery is full reenable LDO's*/
log_printf( &logger, " > Charge status: fast charge(CV mode)\r\n" );
break;
}
case BATTMAN3_CHARGE_STATUS1_CHARGE_COMPLETE:
{
log_printf( &logger, " > Charge status: charge complete\r\n" );
break;
}
case BATTMAN3_CHARGE_STATUS1_SUSPEND:
{
log_printf( &logger, " > Charge status: suspend\r\n" );
break;
}
case BATTMAN3_CHARGE_STATUS1_TIMER_EXPIRED:
{
log_printf( &logger, " > Charge status: ticle, fast or safety charge timer expired\r\n" );
break;
}
case BATTMAN3_CHARGE_STATUS1_BATTERY_DETECTION:
{
log_printf( &logger, " > Charge status: battery detection\r\n" );
break;
}
default:
{
log_error( &logger, " Status." );
break;
}
}
}
battman3_reg_read( &battman3, BATTMAN3_REG_CHARGER_STATUS2, &temp_data );
temp_data &= 0x07;
if ( charge_status2 != temp_data )
{
charge_status2 = temp_data;
switch ( charge_status2 )
{
case BATTMAN3_CHARGE_STATUS2_BATTERY_MONITOR_OFF:
{
log_printf( &logger, " > Battery monitor off\r\n" );
break;
}
case BATTMAN3_CHARGE_STATUS2_NO_BATTERY:
{
log_printf( &logger, " > No battery\r\n" );
break;
}
case BATTMAN3_CHARGE_STATUS2_VBSNS_LESSTHEN_VTRK:
{
log_printf( &logger, " > Battery voltage less then trickle threshold\r\n" );
break;
}
case BATTMAN3_CHARGE_STATUS2_VBSNS_MIDDLE_VRK_VWEAK:
{
log_printf( &logger, " > Battery voltage in middle between tricle and weak threshold\r\n" );
break;
}
case BATTMAN3_CHARGE_STATUS2_VBSNS_MORETHEN_VWEAK:
{
log_printf( &logger, " > Battery voltage more then weak threshold\r\n" );
break;
}
default:
{
log_error( &logger, " Status." );
break;
}
}
}
}
static void battman3_ldo( uint8_t enable )
{
battman3_set_ldo_state( &battman3, BATTMAN3_LDO1, enable );
battman3_set_ldo_state( &battman3, BATTMAN3_LDO2, enable );
battman3_set_ldo_state( &battman3, BATTMAN3_LDO3, enable );
}
// ------------------------------------------------------------------------ END