2012-01-04 17:27:15 zhengmeifu 阅读数 8390
  • 巫妖王51单片机开发板配套视频课程

    本课程是巫妖王51单片机开发板的配套视频课程,本课程的目标是用少的时间带大家初级入门51单片机。配合巫妖王51单片机开发板,让大家花费少的时间少的钱就能轻松开启单片机学习之路。

    19003 人正在学习 去看看 朱有鹏

今天测试成功了单片机控制的双节锂电池电量显示电路。功能有:

1、显示8.4V两节锂电池的电量:按一下按钮,唤醒休眠,显示电量剩余值,7秒后自动熄灭,进入休眠状态。电池电压低于7.4V时能报警显示。检测电压值精度为0.1V。

2、带UART通讯口,能和ARM通讯,传送电池电压值和充电及放电状态。串口通讯能唤醒单片机。

3、休眠后的整体功耗低于1ma(微安级,手头的仪表测不出来有耗电)。

4、带EEPROM,能设定电池电压检测的修正偏移值,以补偿检测器件的误差。

双节8.4V锂电池充电电路也OK了,最大能达到1.2A充电电流,有充电、放电及故障状态指示。能自动检测电池是否在线。电池规格为8.4V/4700mah。

 产品应用:

1、移动互联网设备:上网本等,如MID的电池管理。

2、移动POS机。

3、PDA等带电池的手持设备。

2020-03-15 12:08:19 tanwanshuai 阅读数 58
  • 巫妖王51单片机开发板配套视频课程

    本课程是巫妖王51单片机开发板的配套视频课程,本课程的目标是用少的时间带大家初级入门51单片机。配合巫妖王51单片机开发板,让大家花费少的时间少的钱就能轻松开启单片机学习之路。

    19003 人正在学习 去看看 朱有鹏

锂电池充放电阈值设置

以4.2V供电锂电池为例:
满电电压 :4200mV
预充电电压 :3200mV
自动关机电压 :3400mV
正常开机电压 :3500mV
紧急开机电压 :3200mV
充电电流 :200mA

注:
1、根据实际情况和需求可进行适当调整。
2、如果有紧急开机功能,关机电压最好高于设备正常工作供电需求的10%,预留一部分电量。

电压计算

电压可分为三类:即时电压、平均电压、稳定电压
即时电压:AD直接采集到的实时电压;
平均电压:50个即时有效电压的平均值;
稳定电压:与平均电压相差超过正负50mV时,用平均电压值赋值给稳定电压;

注:
1、平均电压的样本数根据AD采样的波动大小而定,波动较大时可适当增加算法计算,如平方差计算方法;
2、 稳定电压赋值的相差值根据应用对电量的灵敏度需求而定;
3、当电压大于4000mV或者小于3600mV时,由于充放电曲线在该区域内变化较大,未防止显示的电量跳动太大,可以减小与平均电压相差值,来调整稳定电压变化的频率;

电量计算

通用计算公式:
当前电量=(满电电压-当前稳定电压)/(满电电压-自动关机电压);
特殊情况:
1、99%电量:充电时,大于4200mV,并不代表电池充电已经饱和,可适当延长99%的电量显示,保证电池充电电量;
2、100%电量:当已经显示100%后,由于锂电池特性,插拔充电线,反复充电,每次重新充电时,都会先显示99%在跳到100%,为解决该问题,充电状态下,首次计算得出的电量值,如果为99%,可以调整为100%;
1、1%电量:当电量放电严重,充电时,实际电压可能低于关机电压,此时固定显示1%;

注:
通用计算公式是按线性计算的,也可以根据选用电池的充放电曲线去生成特定的计算公式,更正确,但是通用性较差;根据具体需求而定。

2018-03-25 12:40:26 xhl1123456789 阅读数 7971
  • 巫妖王51单片机开发板配套视频课程

    本课程是巫妖王51单片机开发板的配套视频课程,本课程的目标是用少的时间带大家初级入门51单片机。配合巫妖王51单片机开发板,让大家花费少的时间少的钱就能轻松开启单片机学习之路。

    19003 人正在学习 去看看 朱有鹏

      首先说一下独立键盘检测,在单片机外围电路中  ,通常用到的按键都是机械弹性开关,当开关闭合时,线路导通,开关断开时,线路断开。单片机检测按键的原理:按键的一端接地,另一端与单片机的某个I/O口相连,开始先给I/O赋一高电平,然后让单片机不断检测该I/O口是否变为低电平,当按键闭合时,相当于I/O口与地相连,就会变为低电平。在单片机检测按键是否被按下时,电压的实际波形与理想波形时有一点=定差别的,波形在按下和释放瞬间都有抖动现象,抖动时间的长短和按键的机械特性有关 。所以单片机在检测键盘是否被按下都要加上去抖操作,所以在编写单片机的键盘检测程序时,一般在检测按下时加入去抖延时。独立键盘与单片机连接时每一个按键都需要一个I/O口,会过多占用I/O口资源。所以就引出了矩阵键盘。

     矩阵键盘的连接方式,每一行将每个按键的一端连接在一起构成行线,每一列将按键的另一端连接在一起构成列线。这样的话,16个按键排成4行4列就只要8根线。它的按键检测,简单点说,就是先送一列低电平,其余均为高电平,然后轮流检测,确认行列。

     这里就要提到另外一个东西,switch-case语句又称开关语句,它是一个专门用于处理多分支结构的条件选择语句。使用switch语句可直接处理多个分支。

    

    

2011-04-13 20:59:00 forest_1252 阅读数 10187
  • 巫妖王51单片机开发板配套视频课程

    本课程是巫妖王51单片机开发板的配套视频课程,本课程的目标是用少的时间带大家初级入门51单片机。配合巫妖王51单片机开发板,让大家花费少的时间少的钱就能轻松开启单片机学习之路。

    19003 人正在学习 去看看 朱有鹏

IO口检测高点平的问题,曾经而困扰我不少时间,呵呵。

这几天做一个项目,又有点晕呼了,查了不少资料,做了一个总结,和大家分享~~

 

1、51单片机的I/O 口检测高低电平是需要首先让该端口置为1的。此时这个引脚才被设置为输入。

2、如果是avr单片机,可以通过设置DDRx的值来设置输入输出(详见数据手册~~)

3、切忌要将单片机的检测端口设置为输入,否则可能影响被检测模块端口的电压(如:被拉低电平至0v,或被拉高)

4、注意单片机一般是TTL电平模式的,因此高电平的最低应该是2V,低电平的最高应该是0.8V。(具体还是见数据手册比较保险一点)


【每天进步一点点,让优秀成为一种习惯!!】

2020-01-19 21:45:38 zhongvv 阅读数 231
  • 巫妖王51单片机开发板配套视频课程

    本课程是巫妖王51单片机开发板的配套视频课程,本课程的目标是用少的时间带大家初级入门51单片机。配合巫妖王51单片机开发板,让大家花费少的时间少的钱就能轻松开启单片机学习之路。

    19003 人正在学习 去看看 朱有鹏

        如果说51单片机是通用型的单片机,那么应广单片是实用型的,适用于玩具,消费电子等产品开发.单片机内部集成了1.2V的band-gap参考电压,同时集成了比较器,这对于一些电池供电的产品,更具实用意义.

       下面我就贴上比较器应用的简单案例,如果电池未低压,那么指示灯亮.如果电池低压,那么指示灯闪烁.设置1.2V为比较器负输入.PA.4为比较器正输入.PA4需要分压电阻分压.如果使用锂电池,假如3.4V为低压,那么分压电阻接电源端选择22K,接地端设置为12K.不多说,上图,上代码

 

 

    这个代码适用于外部电阻测电压.内部电阻测电压的,请听下回分解.


#define DISABLE 0
#define ENABLE 1

#define EMPTY 0
#define FULL 1

#define ON 1
#define OFF 0

BIT     LED 	    :       PB.5;

BIT     POW_DET     :       PA.4;

#define RED_LED_ON  LED=0
#define RED_LED_OFF  LED=1
#define RED_LED_FLASH  {if(LED){LED=0;}else{ LED=1;}}


/*定时时间是否到了cinit*/
bit     FLAG_NMS;
/*计数值cinit*/
byte	count;
/*定时器初始化cinit*/
word	T16COUNTER;

word usSystick;


/*取得状态aint*/
word usPowEmpLoCnt;
word usPowEmpHiCnt;

/*ainit*/
byte ubPowEmp;
byte ubPowFul;
byte ubPowFulBak;

/*计数值Cinit*/
byte ucFlashTmrCnt;


/*比较器初始化*/
void InitCompare(void)
{
 /*b7@1=开启比较器
     b6@0=负输入大于正输入
     b5@0=比较器不用tm2_ck采样
     b4@0=比较结果没有极性相反
     b3:1@ 010=内部Band-gap电压
     b0@1=PA4输入*/
   gpcc=0b1_0_0_0_010_1;
 /*关闭数字输入*/
 $ padier	0b111_0_100_1;
}



/*冷启动初始*/
void ColdResetMem ( void )
{
	count=0;
	/*定时时间未到*/
    FLAG_NMS=0;

	ucFlashTmrCnt=0;

}



/***************************************/
void    TIME16_Init(void)
{
	/*计数值清零*/
	T16COUNTER	=488;
	/*ms标记reset*/
	FLAG_NMS	=0;
	
	/*使能定时器*/
	$	INTEN	T16;
	/*关中断*/
	INTRQ		=	0;
	
    /*停止定时器*/
   	T16M.5		=0;               

	STT16 T16COUNTER;
	
	/*计算方法16M/*/
	$	T16M	IHRC,/1,BIT11;     
}




/*工作时电源状态*/
void ResetPowStCnt(void)
{
     /*正输入PA4大于band-gap1.2V*/
	if(gpcc.6)
	{
		/*如果为0就低压*/
	    usPowEmpLoCnt=200;
	}
	/*band-gap电压大于pa4*/
	else
	{
		/*如果为0就非低压*/
		usPowEmpHiCnt=200;
	}
}

void GetPowSt(void)
{
    if(ubPowFulBak!=ubPowFul)
    {
		ubPowFulBak=ubPowFul;
		if(ubPowFul==EMPTY)
		{
			ubPowEmp=ON;
		}
		else
		{
			ubPowEmp=OFF;
			RED_LED_ON;
		}
    }
	
}


void AppInit(void)
{
   /*正输入PA4大于band-gap1.2V*/
   if(gpcc.6)
   {
	        ubPowFul=FULL;
		/*如果为0就低压*/
        usPowEmpLoCnt=200;
   }
   /*band-gap电压大于pa4*/
   else
   {
	      
	    ubPowFul=EMPTY;
	    usPowEmpHiCnt=200;
   }
	  
}
/*更新时间*/
void UpdateLedTmr(void)
{
   /*取得工作电源状态*/
   ResetPowStCnt();
		   
   /*更新led时钟*/
   if(FLAG_NMS)
   {

		if(ucFlashTmrCnt)
		{
			ucFlashTmrCnt--;
			if(!ucFlashTmrCnt)
			{
                /*在电池电量低状态下*/
                if(ubPowEmp)
                {
            		/*闪灯*/
            		RED_LED_FLASH;
            	}
			}
		}
		else
		{
			ucFlashTmrCnt=250;
		}
	    FLAG_NMS=0;
   }
}





void	FPPA0 (void)
{
   .ADJUST_IC	SYSCLK=IHRC/8,IHRC=16MHz, VDD=3.6V;
   $ CLKMD IHRC/8,En_IHRC,En_ILRC,En_WatchDog;
    byte ucTmp;
    
	/*检测输入*/
    $ POW_DET        in; 

	$ LED  out high;

    ColdResetMem();
	
    /*比较器初始*/
	InitCompare();
	
    /*定时器初始化*/
	TIME16_Init();

	ucTmp=200;
	while(ucTmp--)
	{
	   .delay 2000;
	    wdreset;
	}
    /*应用初始化*/
	AppInit();
	
	engint;
	
	while (1)
	{
	   /*更新led时间*/
       UpdateLedTmr();
	 
       GetPowSt();

	   wdreset;
	}
}


void	Interrupt ( void )
{
	pushaf;

	if ( Intrq.T16 )  
	{

		Intrq.T16	=	0;
		
		STT16 T16COUNTER;
		
		if ( count>0 )
		{
			count--;
		}
		else
		{
			count   =   9;
			/*1ms*/
			FLAG_NMS=   1;  

          
	   	    /*电平为高计数*/
	   	    if(usPowEmpHiCnt)
	   	    {
				usPowEmpHiCnt--;
				if(!usPowEmpHiCnt)
				{
					ubPowFul=FULL;
				}
	   	    }
			
			if(usPowEmpLoCnt)
	   	    {
				usPowEmpLoCnt--;
				if(!usPowEmpLoCnt)
				{
					ubPowFul=EMPTY;
				}
	   	    }
		   
    			
    	}
		usSystick++;

	}

	popaf;
}

有问题可以联系QQ:85547259,欢迎探讨应广单片机开发技巧!谢谢!

ADC 采集电池电量

阅读数 6746

没有更多推荐了,返回首页