《5(100%开源)蓝牙心率防水运动手环_电池电量检测.docx》由会员分享,可在线阅读,更多相关《5(100%开源)蓝牙心率防水运动手环_电池电量检测.docx(8页珍藏版)》请在第一文库网上搜索。
1、蓝牙心率防水运动手环电池电量检测疯壳-智能穿戴开发系列配套资料:https:/www.fengke.club/GeekMart/su_fkZyGYgrp.jsp配套视频:https:/www.fengke.club/GeekMart/su_fTSgUL3y3.jsp电量检测1 ADC简介ADC (Analog-to-Digital Converter),模/数转换器或者模数转换器,是指将连续变化的模拟信号转换为离散的数字信号的器件。我们DA14580集成一个高速超低功耗的10位通用模数转换器。可以工作于单端模式也可以工作于差分模式。ADC模块有一个1.2V的电压校准器,作为满量程的参考电压。该
2、ADC模块是10位动态模数转换,转换时间为65ns;最大的采样率为3.3MHz;超低功耗(在lOOKHz的采样速率下典型供电电流为5uA);有单端与差分两个输入比例;有4个单端或者2个差分输入通道;电池检测功能;斩波器功能;偏移和零刻度调整;公共端模式输入电平调整。由于电池电压与其放电时长成负相关关系,我们就可以通过DA14580的ADC测量电池电压,直接判断我们所使用的电池剩余电量大小。2 硬件设计本次DA14580采用P01脚直接测量电源电压。Il*13bJ2NETkW-12C0N2图13 软件设计软件开始,第一步要进行的是系统初始化。SetWordl6(CLK_AMBA_REG, 0x0
3、0);/ 设置 16MHz 时钟SetWordl6(SET_FREEZE_REG,FRZ_WDOG);/ 关闭看门狗SetBitsl6(SYS_CTRL_REG,PAD_LATCH_EN,l);使能管脚SetBitsl6(SYS_CTRL_REG,DEBUGGER_ENABLE,l);打开 debuggerSetBitsl6(PMU_CTRL_REG, PERIPH_SLEEP,0);/ 打开外围电源由于我们要使用串口打印,就要配置我们要使用的串口。首先,要点调用GPIO_ConfigurePin(UART2_GPIO_PORT, UART2_TX_PIN, OUTPUT, PID_UART2
4、_TX,false) GPIO_ConfigurePin(UART2_GPIO_PORT/ UART2_RX_PIN/ INPUT,PID_UART2_RX,false)配置我们使用的串口管脚,然后使用 SetBitsl6(CLK_PER_REG, UART2_ENABLE,1)来使能我们要使用的串口 2 ,最后调用uart2_init(UART2_BAUDRATEzUART2_DATALENGTH)初始化串口。完成以上的3个流程,就可以通过串口打印信息了。关于ADC采集电压,主要是调用下边的函数uint32_t adc_get_vbat_sample(bool sample_vbatlv)(
5、uint32_t adc_sample, adc_sample2;adc_init(GP_ADC_SE, GP_ADC_SIGN, GP_ADC_ATTN3X);adc_usDelay(20);if (sample_vbatlv)adc_enable_channel(ADC_CHANNEL_VBATlV);elseadc_enable_channel(ADC_CHANNEL_VBAT3V);adc_sample = adc_get_sample();adc_usDelay(l);adc_init(GP_ADC_SEz 0, GP_ADC_ATTN3X);if (sample_vbatlv)ad
6、c_enable_channel(ADC_CHANNEL_VBATlV);elseadc_enable_channel(ADC_CHANNEL_VBAT3V);adc_sample2 = adc_get_sample();/We have to divide the following result by 2 if/the 10 bit accuracy is enoughadc_sample = (adc_sample2 + adc_sample);adc_disable();return adc_sample;在这个函数中, 首先是采用 adc_init(uintl6_t mode, ui
7、ntl6_t sign, uintl6_tattn),对ADC进行初始化。第一个参数mode是ADC模式选择,0表示差分模式,GP_ADC_SE(0x800)表示单端模式,我们采用的是GP_ADC_SE,单端模式。第二个参数sign,。表示默认模式,这里用GP_ADC_SIGN(0x0400),选择通过相反的ADC符号获取两个采样值来取消内部的偏置电压。最后的参数attn设置输入最大电压值,0对应1.2v,这里选GP_ADC_ATN3X(0x0002)对应3.6vo完成ADC初始化后,就要使能相关的ADC通道。adc_enable_channel(uintl6_tinput_selection
8、),本次使用的是通道 ADC_CHANNEL_VBAT3Vo完成ADC的初始化和通道使能后,就可以调用adc_get_sample(void)获取数字电压。int adc_get_sample(void)(int cnt = ADC_TIMEOUT;SetBitsl6(GP_ADC_CTRL_REG, GP_ADC_START, 1); 开始 AD 转换while (ent- & (GetWordl6(GP_ADC_CTRL_REG) & GP_ADC_START) != 0x0000);等待转换结束SetWordl6(GP_ADC_CLEAR_INT_REG, 0x0000); / 清除转换
9、中断标志位return GetWordl6(GP_ADC_RESULT_REG); 获取转换结果最后就是通过下面函数将数字电压转换为剩余电量百分比。uint8_t batt_cal_cr2032(uintl6_t adc_sample)(uint8 t batt Ivl;if (adc_sample 1705)batt_lvl = 100;else if (adc_sample 1584)batt_lvl = 28 + (uint8_t)( (adc_sample -1584) 16)/(1705 -1584) * 72 ) 16);else if (adc_sample 1360)batt_
10、lvl = 4 + (uint8_t)( (adc_sample - 1360) 16)/(1584 -1360) * 24 ) 16);else if (adc_sample 1136)batt_lvl = (uint8_t)( (adc_sample -1136) 16)/(1360 -1136) * 4 ) 16);elsebatt Ivl = 0;return battjvl;这是函数采用的分段的形式,这是由于我们的电池电压与电池剩余电量的关系是一条曲线,通过分段计算,可以提高精度。当然,大家也可以根据自己的实际情况改动上述函数。4 实验现象首先,插好川nk和USB转串口,然后打开打开
11、串口调试助手。选择串口号,我们图中是COM1,这个根据实际情况选择。 配置串口参数,波特率为115200,数据位8,停止位1,没有校验位和控制流,与下图一致。点击打开串口。I 界 SSCOM3.2 (作者:聂J组(TT), JShttpy/www.mcuS, Email: mcu52l -|n|x|串口号|COM1文件名也开串口 3帮助发送文件I逃在窗口J溃除蜜旦HEX显示WWW.MCUS1.COMFCB打样那家强?当然就是嘉立创!官网】嘉寺创PCB打样-SMT贴片一元器件商城一条龙服拿打样话加助理粱雁垣的QQ: 800058315环情特术:品汤推行中】Fi/Srs/GPS【安信可射频检组】【
12、点次里升级为SSC0M5. 13版】可在winlOi云行!打开文件:/ww.mcu51.corCOM1 已关闭 115200bps CTS=O DSR=O RL A率位位位特据止蛉吱数停校二115200 y8二1二None FSDTR 厂 RTSf时发送00。次厂HEX发送厂发送新行字符串输入框:发法IenoN图2配置完串口之后,打开我们提供的代码。(1)点击仿真按键。图3(2)点击运行代码。图4完成之后,就能看到串口调试助手接收框信息如下。I R SSCOM3.2 (作者:聂小君(TT),主页http:www.mcu5Lcom, Email: meIB Tf Jk 1*) T7不小不小不不不
13、不不小不不不不不不不小不小m x aijl 1u x 不不不不不不不不不不不小不小不小不小不小ADC: 0% ADC: 0% ADC: 0% ADC: 0% ADC: 0% ADC: 0% ADC: 0% ADC: 0% ADC: 0% ADC: 0%ADC: 0% ADC: 0%ADC: 0%ADC: 0%ADC: 0%ADC: 0%ADC: 0%ADC: 0%ADC: 0%ADC: 0%ADC:0% ADC: 0% ADC:0% ADC:0% ADC:0% ADC:0% ADC:0% ADC:0% ADC:0% ADC:0% ADC:0%ADC: 0% ADC: 0%ADC: 0%ADC:
14、 0%ADC: 0%ADC: 0%ADC: 0%ADC: 0%ADC: 0%ADC: 0%ADC:0% ADC: 0% ADC:0% ADC:0% ADC:0% ADC:0% ADC:0% ADC:0% ADC:0% ADC:0% ADC:0%ADC: 0% ADC: 0%ADC: 0%ADC: 0%ADC: 0%ADC: 0%ADC: 0%ADC: 0%ADC: 0%ADC: 0%ADC:0% ADC: 0% ADC:0% ADC:0% ADC:0% ADC:0% ADC:0% ADC:0% ADC:0% ADC:0% ADC:0%ADC: 0% ADC: 0%ADC: 0%ADC: 0%ADC: 0%ADC: 0%ADC: 0%ADC: 0%ADC: 0%ADC: 0%ADC:0% ADC: 0% ABC:0% ADC:0% ADC:0% ADC:0% ADC:0% ADC:0% ADC:0% ADC:0% ADC:0%ADC: 0% ADC: 0%ADC: 0%ADC: 0%ADC: 0%ADC: 0%ADC: 0%ADC: 0%ADC: 0%ADC: 0%ADC:0% ADC: 0% ADC:0% ADC:0% ADC:0% ADC:0%