基于MSP430F413水果电池供电的低功耗时钟
我最早接触MSP430时候,看到书的第一页就是一张水果电池的图片,一直以来想做一个低功耗的可以水果电池供电的系统,毕业之后的下半年选择MSP430F413单片机来画了一个低功耗的板子,一直没有调试成功,液晶显示太暗几乎看不到,最近又拿出来调试,更换偏压电阻,最终更换液晶后才可以正常显示,先看下最终效果:
最终效果
电路图:
调试过程
最初调试时,先准备好苹果一个,电池正负极(铜锌),程序是显示一个数字,效果如下:
突发奇想,用自来水试了一下,效果也是杠杠的(程序中间修改过,这是显示较多的液晶段):
时钟调试效果(这里电池没有接入电路,调试时所用,当时没有拿下来,用跳线帽接到水果供电的电路上):
刚刚调试时,万用表测试水果电池电压接近0.9V,短路电流25-30uA,接上电路仅显示数字7的时候,电流12uA,4节水果电池电压从3.4降到2.6V;水(普通自来水,每个地方水中含有离子数量不一样,获得电压电流都有区别)每节电池0.8V,短路电流接近40uA。
程序换为时钟时,水果电池3.4V降到2.2V,大约维1个多小时,液晶完全没有显示,电极片换个位置重新插一下,时钟可以继续运行,测试电压和新做水果电池一样,苹果都要变干的时候,电压低一些,液晶明显变暗。
后来,电路中提供液晶偏压电压的电阻有330K改为1M后,系统电流降到大约10uA,水果电池大约可以维持3-4小时,用水做的电池可以维持24小时以上
功耗分析
这个低功耗的电路还有优化空间,单片机的不用的引脚可以再做优化,现有线路中有一般的液晶段引脚没有使用,却也提供的驱动波形,这里相对现有系统应当是浪费电流最大的一部分;另外一个优化空间是4个按键的上拉电阻太小,10K,3V的时候,按键按下瞬间,电流可以达到300uA,用水果电池的时候,按键功能不能使用,现在调试的时候,都是先拿CR2302供电,调节好时间后,再用水果(水)电池供电。
进一步优化功耗后,电流应当可以降到5uA以下。
程序
按键程序继续使用之前程序库中的按键程序;
RTC计时使用TI的RTC软件库
段码液晶的程序由程序库中的数码管程序移植而来:
#include <msp430x41x.h>
#include "segment_lcd_btl006.h"
/*宏定义,数码管a-h各段对应的比特,更换硬件只用改动以下8行*/
#define a 0x01 // AAAA
#define b 0x02 // F B
#define c 0x04 // F B
#define d 0x80 // GGGG
#define e 0x40 // E C
#define f 0x10 // E C
#define g 0x20 // DDDD HH
#define h 0x08 //小数点
/*用宏定义自动生成段码表,很好的写法,值得学习*/
/*更换硬件无需重写段码表*/
const char tab[] = {
a + b + c + d + e + f, // Displays "0"
b + c, // Displays "1"
a + b + d + e + g, // Displays "2"
a + b + c + d + g, // Displays "3"
b + c + f + g, // Displays "4"
a + c + d + f +g, // Displays "5"
a + c + d + e + f + g, // Displays "6"
a + b + c, // Displays "7"
a + b + c + d + e + f + g, // Displays "8"
a + b + c + d + f + g, // Displays "9"
a + b + c + e + f + g, // Displays "A"
c + d + e + f + g, // Displays "B"
a + d + e + f, // Displays "C"
b + c + d + e + g, // Displays "D"
a + d + e + f + g, // Displays "E"
a + e + f + g, // Displays "F"
a + c + d + e + f, // Displays "G"
b + c + e + f + g, // Displays "H"
e + f, // Displays "I"
b + c + d + e, // Displays "J"
b + d + e + f + g, // Displays "K"
d + e + f, // Displays "L"
a + c + e + g, // Displays "M"
a + b + c + e + f, // Displays "N"
c + e + g, // Displays "n"
c + d + e + g, // Displays "o"
a + b + c + d + e + f, // Displays "O"
a + b + e + f + g, // Displays "P"
a + b + c + f + g, // Displays "Q"
e + g, // Displays "r"
a + c + d + f +g, // Displays "S"
d + e + f + g, // Displays "t"
a + e + f , // Displays "T"
b + c + d + e + f, // Displays "U"
c + d + e, // Displays "v"
b + d + f + g, // Displays "W"
b + c + d + f + g, // Displays "Y"
a + b + d + e + g, // Displays "Z"
g, // Displays "-"
h, // Displays "."
0 // Displays " "
};
#undef a
#undef b
#undef c
#undef d
#undef e
#undef f
#undef g
void lcd_init()
{
// Initialize LCD
LCDCTL = LCDP1+LCDP0+LCD4MUX+LCDON; // 4-Mux LCD, segments S0-S23
BTCTL = BTFRFQ1; // Set freqLCD = ACLK/128
P5SEL = 0xFC; // Set Rxx and COM pins for LCD
// Clear LCD memory to clear display
for (int i=0; i<12; i++)
{
LCDMEM[i] = 0x00;
}
}
void lcd_clear()
{
for (int i=0; i<12; i++)
{
LCDMEM[i] = 0x00;
}
}
//不影响小数点或者冒号
void lcd_display_char(char ch,char addr)
{
addr = addr*2+2;
LCDMEM[addr] = ((tab[ch]&0x0f)<<4)|(LCDMEM[addr]&0x80);
LCDMEM[addr+1] = (tab[ch]&0xf0);//|(LCDMEM[addr+1]&0x80)
}
计时程序,每隔1s中断运行一次,计时则秒增1,设置则显示对应设置界面:
#include <msp430x41x.h>
#include "RTC_Calendar.h"
#include "RTC_TA.h"
#include "segment_lcd_btl006.h"
#include "time.h"
char state = 0; //1-6:年月日 时分秒
void time_init()
{
lcd_init();
setDate(2015,9,13);
setTime( 0, 0, 0, 1); // initialize time to 12:00:00 AM
TACCR0 = 32768-1;
TACTL = TASSEL_1+MC_1; // ACLK, upmode
TACCTL0 |= CCIE; // enable TA0CCRO interrupt
}
//两位时间显示,格式十六进制高地位 地址0低位,1高位
void time_display(char time,char addr)
{
addr = addr*2;
lcd_display_char(time>>4,addr+1);
lcd_display_char((time&0x0f),addr);
}
//4位时间显示,year,格式十六进制各个位
void year_display(int year)
{
lcd_display_char(year>>12,3);
lcd_display_char((year>>8)&0x0f,2);
lcd_display_char((year>>4)&0x0f,1);
lcd_display_char((year)&0x0f,0);
}
//计时标志,冒号闪烁
void tick()
{
LCDMEM[1]&=~0X80;
LCDMEM[2]^=0x80;
time_display(get24Hour(),1);
time_display(TI_minute,0);
}
void setting()
{
LCDMEM[1]=0X80;
switch(state)
{
case 1:
year_display(TI_year);
break;
case 2:
time_display(TI_month==9?TI_month+7:TI_month+1,1);
break;
case 3:
time_display(TI_day,0);
break;
case 4:
time_display(get24Hour(),1);
LCDMEM[2]|=0x80;
break;
case 5:
time_display(TI_minute,0);
LCDMEM[2]|=0x80;
break;
case 6:
time_display(TI_second,0);
LCDMEM[2]|=0x80;
break;
default:
state = 0;
break;
}
}
// Timer A0 interrupt service routine
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
incrementSeconds();
if(state == 0)
{
tick();
}
else
{
setting();
}
__bic_SR_register_on_exit(LPM3_bits);
}
主函数,根据按键更改操作状态,并且设置时间值:
#include <msp430x41x.h>
#include "RTC_Calendar.h"
#include "RTC_TA.h"
#include "segment_lcd_btl006.h"
#include "time.h"
#include "key.h"
int main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
FLL_CTL0 |= XCAP14PF; // Configure load caps
time_init();
KeyInit();
__bis_SR_register(GIE);
while(1)
{
__bis_SR_register(LPM3_bits); // enter LPM3, clock will be updated
char key = ReadKey();
if(key=='0'&&state==1)
{
setDate(2015,TI_month>9?TI_month-5:TI_month+1,(TI_day>>4)*10+(TI_day&0x0f));
}
if(key=='1')
{
if(++state == 7)
{
state = 0;
}
}
if(key=='2')
{
switch(state)
{
case 1:
incrementYears();
break;
case 2:
incrementMonths();
break;
case 3:
incrementDays();
break;
case 4:
incrementHours();
break;
case 5:
incrementMinutes();
break;
case 6:
incrementSeconds();
break;
default:
state = 0;
break;
}
}
if(state!=0)
{
lcd_clear();
setting();
}
else
{
tick();
}
}
return 0;
}
最新运行效果
上午刚刚拍的,昨天(2015-10-02)晚上,发觉液晶有些暗,水里面加了一些盐,显示效果更好一些,运行时间应该也会更久:
基于MSP430F413水果电池供电的低功耗时钟的更多相关文章
- 单片机课程设计——《基于AT89S52单片机和DS1302时钟芯片的电子时钟(可蓝牙校准)》
引言 本设计以AT89S52单片机为控制核心,时钟芯片DS1302提供时钟源,配合LCD1602液晶显示模块,组成基本硬件系统,同时利用HC-05嵌入式蓝牙串口通讯模块,可在手机端进行日期.时间的校准 ...
- 基于Verilog HDL 的数字时钟设计
基于Verilog HDL的数字时钟设计 一.实验内容: 利用FPGA实现数字时钟设计,附带秒表功能及时间设置功能.时间设置由开关S1和S2控制,分别是增和减.开关S3是模式选择:0是正常时钟 ...
- 基于FPGA的简易数字时钟
基于FPGA的可显示数字时钟,设计思路为自底向上,包含三个子模块:时钟模块,进制转换模块.led显示模块.所用到的FPGA晶振频率为50Mhz,首先利用它得到1hz的时钟然后然后得到时钟模块.把时钟模 ...
- 基于canvas的原生JS时钟效果
概述 运用html5新增画布canvas技术,绘制时钟效果,无需引用任何插件,纯js. 详细 代码下载:http://www.demodashi.com/demo/11935.html 给大家介绍一个 ...
- 一种基于PTP 协议的局域网高精度时钟同步方法(转)
原文地址 http://www.dzsc.com/data/html/2011-1-17/88338.html 1 引言 在分布式系统中, 常常需要一个全局时间, 用来确定系统中各种事件发生的先后.协 ...
- (数字IC)低功耗设计入门(五)——RTL级低功耗设计(续)
二.RTL级低功耗设计(续) 前面一篇博文我记录了操作数隔离等低功耗设计,这里就主要介绍一下使用门控时钟进行低功耗设计. (4)门控时钟 门控时钟在我的第一篇博客中有简单的描述,这里就进行比较详细的描 ...
- STM32学习笔记2-系统时钟知识及程序配置
一:基本知识 1. STM32F103ZE有5个时钟源:HSI.HSE.LSI.LSE.PLL. ①.HSI是快速内部时钟,RC振荡器,频率为8MHz,精度不高. ②.HSE是快速外部时钟, ...
- 基于Verilog HDL 各种实验
菜鸟做的的小实验链接汇总: 1.基于Verilog HDL 的数字时钟设计 2.乘法器 3.触发器(基本的SR触发器.同步触发器.D触发器) 4.基于Verilog HDL的ADC ...
- STM32实战应用(一)——1602蓝牙时钟1液晶的显示测试
前言 从51到STM32F4学习这么久了,总算找到点头绪了,目前学习了GPIO,中断,定时器,看门狗的基本使用,所以想试着看看能不能做个什么东西,就是想复习一下最近学习的知识.正好上学期单片机课程设计 ...
随机推荐
- iOS开发——高级技术&通讯录功能的实现
通讯录功能的实现 iOS 提供了对通讯录操作的组建,其中一个是直接操作通讯录,另一个是调用通讯录的 UI 组建.实现方法如下: 添加AddressBook.framework到工程中. 代码实现: 1 ...
- 《精通移动app测试实战:技术、工具和案例》新书上市
本书是测试专家.性能测试专家.专业畅销书作者--于涌,多年实战经验的总结,涵盖主流的测试工具,包括众多的测试实例,涵盖单元测试.功能测试.性能测试.UI测试.手游测试.自动化测试.测试用例管理.持续集 ...
- MyBatis 查询
User.java package com.mycom.mybatis_1.bean; import java.io.Serializable; public class User implement ...
- Apache和tomcat服务器使用ajp_proxy模块
首先我们先介绍一下为什么要让Apache与Tomcat之间进行连接.事实上Tomcat本身已经提供了HTTP服务,该服务默认的端口是8080,装好tomcat后通过8080端口可以直接使用Tomcat ...
- Md5加密方法
package com.atguigu.surveypark.util; import java.security.MessageDigest; /** * 数据 */ public class Da ...
- 让树莓派说出自己的IP地址
当亲爱的树莓派没有显示器时如何控制它?对,就是ssh,但是ssh需要IP地址啊,树莓派的IP地址是多少?这个问题问的好,目前大约有这样几种解决方案:. 获取到IP地址后将地址发到邮箱:前提是树莓派能上 ...
- 解决 NDP40-KB2468871不能安装
新机子 成功装了vs2010,然后装sql2012提示让装vs2012sp1,下载了sp1,装的时候,装到最后一个包NDP40-KB2468871的时候报错了 KB2468871安装失败 错误: Ex ...
- http协议读书笔记1-概述
1.http协议在网络中的位置: http协议位于TCP协议的上层,http试用tcp来传输其报文数据,tcp在ip的上层. 2.浏览器发起连接的过程 上述图的过程是: 浏览器从url中解析出服务区的 ...
- 清除mac os svn密码命令行缓存
删除认证缓存设置即可,如下:rm -rf ~/.subversion/auth by yytong
- 给Number类型增加加法、减、乘、除函数,解决float相加结果精度错乱的问题
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...