ZHCAAC5 October 2020 MSP430FR2433
电压监控对于电池供电和总线供电型应用至关重要,可起到在断电期间保存系统状态的作用。通常应将实时时间保存为时间戳来跟踪断电事件。通过利用内部模数转换器 (ADC) 及其内置窗口比较器、实时时钟 (RTC) 计数器和内部铁电随机存取存储器 (FRAM),MSP430FR2433 微控制器 (MCU) 可用作应对此问题的低成本解决方案。通过使用 UART 通信功能,主机可设置 POSIX 格式的初始时间,也可查询 MSP430™ MCU 来读取 POSIX 格式的当前时间。此外,在断电期间,实时时间会在 FRAM 中保存为时间戳,以供以后检索。首先,下载工程文件和演示此功能的示例代码。
该解决方案使用 MSP430FR2433 MCU 的内部 ADC 窗口比较器和外部电阻器来监控电源电压。图 1-1 展示了电阻 R1 和 R2 如何分配电源电压 (Vsupply),以及分压 (Vin) 如何连接至 ADC 输入通道。根据Equation1 计算输入电压。如果 Vsupply 为 3.3V,那么 Vin 将为 1.1V。
内部 1.5V 基准电压 (VREF) 被选作 ADC 基准电压,但可通过轻松更改固件来选择 AVCC 或外部基准电压。ADC 窗口比较器的初始高、低压阈值由固件中的 ADC_THR_HIGH_INIT 和 ADC_THR_LOW_INIT 宏定义,并分别根据Equation2 和Equation3 计算得出。
RTC 计数器模块用作外部 RTC,可提供 POSIX 格式的当前实时时间。主机可设置初始时间,然后通过 UART 接口读取当前时间。内部 32768Hz REFO 振荡器用作 FLL 基准的时钟源和 ADC 触发器的计时器。16MHz SMCLK 用作 RTC 计数器和 UART 模块的时钟源。或者,如果更改 MSP430FR2433 LaunchPad 开发套件上的晶体选择电阻器并将 __ENABLE_XT1__ 符号添加到 CCS 工程中的编译器设置,则可使用外部 32768Hz 晶体作为时钟源。
如果电源电压降至 3V 以下,Vin 会降至 1V 以下,低于 Vth(low)。如果电源电压升至 3.6V 以上,Vin 会升至 1.2V 以上,高于 Vth(high)。在以上任一情况下,都会触发 ADC 窗口比较器中断。在 ADC 中断服务例程 (ISR) 中,当前时间戳存储在 FRAM 中以记录断电或尖峰事件。通过更改电阻分压器以及固件中的 ADC_THR_HIGH_INIT 和 ADC_THR_LOW_INIT 宏,可根据特定应用要求监控不同的电压电平。
ADC 窗口比较器输入电压 (Vin) 根据分压器中两个电阻的比值设定。即使这一比值保持恒定,选择实际电阻值时也需要考虑一些权衡因素。电阻较低时,通过分压器的电流会增加。若要了解如何选择尺寸优化的电阻,请参阅优化比较器上的电阻分压器。
另一种情况是将分压器的接地端连接到 MCU 的某个 GPIO,而不是将电路板接地端直接连接到 R1 电阻。测量 Vin 时设置 GPIO 输出为低电平可代替连接到 R1 电阻的接地端,不测量 Vin 时设置 GPIO 输出为高电平则可降低分压电路的静态功耗。
MSP430FR2433 LaunchPad 开发套件用于测试此解决方案,但它可用于具有适当外设支持和代码迁移的任意 MSP430 MCU。LaunchPad 的 eZ-FET 反向通道 UART 接口可在 9600 波特下连接到 PC 终端程序或 GUI Composer,用于评估和进一步测试。
该固件采用以下 UART 通信协议:
命令 | D0 | D1 | D2 | D3 |
对于 READ 命令,请求将数据字节作为来自 MSP430 MCU 的响应。每个响应的命令字节都包含在内,以便更轻松地识别数据。对于 WRITE 命令,数据字节会发送至待处理的 MSP430 MCU。会首先向时间戳和阈值数据发送 LSB。时间戳数据应解释为 D3D2D1D0h,阈值数据应解释为 D1D0h。
RTC_READ_TIME 命令 | ||||||
00h | D0 | D1 | D2 | D3 | ||
RTC_WRITE_TIME 命令 | ||||||
01h | D0 | D1 | D2 | D3 | ||
RTC_READ_THR_HIGH 命令 | ||||||
02h | D0 | D1 | D2 | D3 | ||
RTC_READ_THR_LOW 命令 | ||||||
03h | D0 | D1 | D2 | D3 | ||
ADC_READ_THR_HIGH 命令 | ||||||
04h | D0 | D1 | ||||
ADC_READ_THR_LOW 命令 | ||||||
05h | D0 | D1 | ||||
ADC_WRITE_THR_HIGH 命令 | ||||||
06h | D0 | D1 | ||||
ADC_WRITE_THR_LOW 命令 | ||||||
07h | D0 | D1 | ||||
= 响应 | ||||
该解决方案使用 ADC 窗口比较器来监控电源电压,只要检测到断电或尖峰事件,就会在 FRAM 中存储一个时间戳。默认情况下,FRAM 具有写保护功能。FRAM 仅在必须存储时间戳时才不受保护,然后在写入后又再次受到保护。
使用 ADC 窗口比较器可轻松设置不同的电压阈值。与普通 ADC 输入相比,ADC 窗口比较器的主要优势是 CPU 不需要评估输入电压。这些阈值由 ADC 模块自动监控,无需唤醒 CPU,从而降低功耗并增加整体带宽。该解决方案使用外部电阻分压器,因此还可以监控高于 MCU 电源电压的电压。主机可通过发送 ADC_READ_THR_HIGH 和 ADC_READ_THR_LOW 命令从 MSP430 MCU 请求电流阈值。主机还可通过发送 ADC_WRITE_THR_HIGH 和 ADC_WRITE_THR_LOW 命令使用新阈值来更改电流阈值。
器件中的 RTC 计数器模块会每秒更新一次实时时间。主机可通过向 MSP430 MCU 发送 RTC_READ_TIME 命令来请求当前实时时间。如果必须更新实时时间,主机可发送 RTC_WRITE_TIME 命令以及当前实时时间。还可通过分别发送 RTC_READ_THR_HIGH 和 RTC_READ_THR_LOW 命令来请求高阈值和低阈值的最新时间戳。例如,在 MSP430 MCU 断电并重新上电后,主机可发送 RTC_READ_THR_LOW 命令来了解断电的发生时间。此外,只要超过阈值,固件就会自动向主机发送时间戳。
对于独立演示,可使用 PC 终端程序(例如 Docklight、Tera Term 等)作为主机。图 1-2 中显示了一个示例,该示例演示了所有命令和数据,包括读取初始 RTC 时间、设置新时间和读取时间以确认其已更新。注意 RTC_WRITE_TIME 命令已在 09:54:06 发送给 MSP430 MCU 并设为 78563412h。1 秒后(即 09:54:07)发送了 RTC_READ_TIME 命令,回复显示当前时间戳值递增至 78563413h,增幅为 1 秒。请注意,不受支持的命令 95h 也被发送,但该命令已被 MSP430 MCU 正确忽略。
对于 GUI 演示,GUI 可用作主机,如图 1-3 所示。可通过点击第一部分中的“CURRENT TIMESTAMP”按钮来读取 RTC。可通过在文本框中输入 8 位 POSIX 时间戳并按 Enter 来设置新时间戳。通过移动滑块或在文本框中输入新值,然后按 Enter,可在第二部分中调整 ADC 窗口比较器的高低阈值。此部分中的按钮还可用于从 MSP430 MCU 请求阈值。GUI 会自动防止阈值重叠或超过最大值。点击第三部分中的“HIGH THRESHOLD”和“LOW THRESHOLD”按钮(例如,在电源故障后),则可从 MSP430 MCU 请求最新的时间戳。否则,只要输入电压超过某个阈值,系统就会自动更新文本框中的时间戳。请注意,通过删除 CCS 工程中编译器设置中的 __ENABLE_GUI__ 符号,重新编译代码并对器件进行编程,可在独立模式下使用 GUI 演示代码。
器件型号 | 主要特性 |
---|---|
MSP430FR2433 | 16KB FRAM,4KB SRAM,10 位 ADC,UART/SPI/I2C,计时器 |
MSP430FR2422 | 8KB FRAM,2KB SRAM,10 位 ADC,UART/SPI/I2C,计时器 |