在上次项目中用到了LTC6804这块片子,初次使用它的采集精度确实令我惊讶到了,设备用于监测2V的铅酸电池组,硬件上几乎没有加任何滤波,直接读取数据就能达到3mv以下的精度,片子真的很好用。

  下面总结一下自己的使用心得。

  ------------------------------------------------------------------------------------------------

  LTC6804是一款专门用来做多节电池电池组的监测芯片,最高可监测12节电池,官方误差是低于1.2mv,12 个通道的最快采样速度可以达到290us。

  芯片分为两种型号,6804-1和6804-2,区别在于,6804-1采用级联的形式(级联控制),6804-2采用并联形式(分开控制)。

  除开硬件连接之外,这两种型号的操作都是大同小异,基本可以视为一样,本文以6804-1为例进行讲解。

  

  原理图和手册中的推荐一样,就不贴出来了,MCU与芯片的通信方式采用四线SPI,这种通信方式很常见,各种MCU的驱动也好找。(看了数据手册,芯片似乎还支持IIC和2线通信,不过我没有用)

  驱动代码可以从官网下载:https://www.analog.com/cn/products/ltc6804-1.html

  下载下来的代码是C++文件,不能直接在STM32上使用,需要进行一些修改。

  首先修改后缀名,改成C文件,然后打开LTC6804.c文件。

  

第一步进行驱动的移植:

void spi_write_array(uint8_t len, // Option: Number of bytes to be written on the SPI portuint8_t data[] //Array of bytes to be written on the SPI port
                     )
{uint8_t i;for(i = 0; i < len; i++){SPI2_Send_byte((int8_t)data[i]);}
}

  

void spi_write_read(uint8_t tx_Data[],//array of data to be written on SPI portuint8_t tx_len, //length of the tx data arryuint8_t *rx_data,//Input: array that will store the data read by the SPI portuint8_t rx_len //Option: number of bytes to be read from the SPI port
                    )
{uint8_t i;for(i = 0; i < tx_len; i++){SPI2_Send_byte(tx_Data[i]);}for(i = 0; i < rx_len; i++){rx_data[i] = (uint8_t)SPI2_Receive_byte();}}

只需要把自己的SPI驱动替换上去就可以了。

void wakeup_idle()
{output_low(LTC6804_CS);delayMicroseconds(2); //Guarantees the isoSPI will be in ready mode
  output_high(LTC6804_CS);
}

自己把这个函数中间的部分实现,或者替换成自己的函数:

void wakeup_idle(void)
{output_low(LTC6804_CS);delay_ms(4); //Guarantees the isoSPI will be in ready mode
  output_high(LTC6804_CS);
}

下面是原版的初始化函数:

void LTC6804_initialize()
{quikeval_SPI_connect();spi_enable(SPI_CLOCK_DIV16); // This will set the Linduino to have a 1MHz Clock
  set_adc(MD_NORMAL,DCP_DISABLED,CELL_CH_ALL,AUX_CH_ALL);
}

我把它根据自己的实际情况修改一下 :

void LTC6804_initialize(void)
{Drive_LTC6804_Spi_Init();//SPI外设初始化init_cfg();        //配置LTC6804的寄存器set_adc(MD_FILTERED,DCP_DISABLED,CELL_CH_ALL,AUX_CH_GPIO1);//设置转换方式等wakeup_sleep();//唤醒芯片LTC6804_wrcfg(TOTAL_IC,tx_cfg);//把上面的设置写入芯片if (LTC6804_rdcfg(TOTAL_IC,rx_cfg) == -1)  //检查一下到底有没有配置成功{printf("LTC6804_MODULAR INIT NG!\n\r");}else{printf("LTC6804_MODULAR INIT OK!\n\r");}}

//手册第49页
/* 寄存器               8         7          6         5         4         3         2        1        */
//CFGR0       RD/WR   GPIO5     GPIO4      GPIO3     GPIO2     GPIO1     REFON     SWTRD    ADCOPT
//CFGR1       RD/WR   VUV[7]    VUV[6]     VUV[5]    VUV[4]    VUV[3]    VUV[2]    VUV[1]   VUV[0]
//CFGR2       RD/WR   VOV[3]    VOV[2]     VOV[1]    VOV[0]    VUV[11]   VUV[10]   VUV[9]   VUV[8]
//CFGR3       RD/WR   VOV[11]   VOV[10]    VOV[9]    VOV[8]    VOV[7]    VOV[6]    VOV[5]   VOV[4]
//CFGR4       RD/WR   DCC8      DCC7       DCC6      DCC5      DCC4      DCC3      DCC2     DCC1
//CFGR5       RD/WR   DCTO[3]   DCTO[2]    DCTO[1]   DCTO[0]   DCC12     DCC11     DCC10    DCC9
void init_cfg(void)
{int i;for(i = 0; i<TOTAL_IC;i++){tx_cfg[i][0] = 0xFE ;   //GPIO引脚下拉电路关断(bit8~bit4) | 基准保持上电状态(bit3) | SWTEN处于逻辑1(软件定时器) | ADC模式选择为0tx_cfg[i][1] = 0x00 ;   //不使用欠压比较功能tx_cfg[i][2] = 0x00 ;   //不使用过压比较功能tx_cfg[i][3] = 0x00 ;tx_cfg[i][4] = 0x00 ;   //不使用电池放电功能tx_cfg[i][5] = 0x00 ;   //放电超时时间
    }
}

这里只使用了最基本的电压采集,其他的功能都没有用。

上面的代码里面有一个宏 :TOTAL_IC。

这个宏是用来定义一共有几片LTC6804-1的,比如我这次使用了2片,那么它的值就是2.

上面的寄存器设置,可以参考手册:

比如需要追加一些别的功能,便可以根据手册的寄存器进行设置,比如设置报警,设置均衡,设置其他的功能。

以上初始化部分就完成了,或者说移植就完成了,然后便不必对代码文件进行任何修改就可以直接使用,接下来是采集部分:

我是把采集放在main中进行。

        /* 唤醒6804 */wakeup_sleep();/* 启动电压采集 */LTC6804_adcv();delay_ms(50);/* 读取电压 */res = LTC6804_rdcv(0, TOTAL_IC, vol_buff);

以上便可以采集出电压了。

※如果发现几个级联起来的6804,有些片子可以运行正常通信,有些又不可以运行甚至无法通信,在排除硬件的原因以后,可以查看一下这个地方:wakeup_sleep(),试着把唤醒时间设置的长一些。

最后:可以看出来,精度还是不错的~

 本文结束!

转载于:https://www.cnblogs.com/han-bing/p/10650345.html

基于STM32的LTC6804驱动代码解析相关推荐

  1. K_A11_002 基于STM32等单片机驱动DS18B20串口与OLED0.96双显示

    K_A11_002 基于STM32等单片机驱动DS18B20 串口与OLED0.96双显示 一.资源说明 二.基本参数 1.参数 2.引脚说明 三.驱动说明 时序 对应程序: 四.部分代码说明 1.接 ...

  2. K_A11_008 基于STM32等单片机驱动SHT30和SHT31 串口与OLED0.96双显示

    K_A11_008 基于STM32等单片机驱动SHT30和SHT31 串口与OLED0.96双显示 一.资源说明 二.基本参数 参数 引脚说明 三.驱动说明 时序 对应程序: 四.部分代码说明 1.接 ...

  3. K_A16_001 基于STM32等单片机驱动HX711称重模块 串口与OLED0.96双显示

    K_A16_001 基于STM32等单片机驱动HX711称重模块 串口与OLED0.96双显示 一.资源说明 二.基本参数 参数 引脚说明 三.驱动说明 对应程序: 四.部分代码说明 1.接线引脚定义 ...

  4. 基于STM32的斯特林驱动小车论文

    基于STM32的斯特林驱动小车论文 [内容摘要]:根据"第九届上海市大学生工程训练综合能力竞赛"的规则和要求,设计了一种采用斯特林技术和自动控制技术,自主设计并制作一台可将液态乙醇 ...

  5. K_A12_022 基于STM32等单片机驱动VL53L0X模块 串口与OLED0.96双显示

    K_A12_022 基于STM32等单片机驱动VL53L0X模块 串口与OLED0.96双显示 一.资源说明 二.基本参数 参数 引脚说明 三.驱动说明 UART对应程序: IIC对应程序: 四.部分 ...

  6. K_A32_002 基于STM32等单片机驱动红外接收模块 串口+OLED0.96显示

    K_A32_002 基于STM32等单片机驱动红外接收模块 串口+OLED0.96显示 所有资源导航 一.资源说明 二.基本参数 参数 引脚说明 三.驱动说明 时序: 对应程序: 四.部分代码说明 1 ...

  7. K_A12_007 基于STM32等单片机驱动AS608光学指纹识别模块 OLED0.96显示

    K_A12_007 基于STM32等单片机驱动AS608光学指纹识别模块 OLED0.96显示 一.资源说明 二.基本参数 参数 引脚说明 三.驱动说明 对应程序: 四.部分代码说明 1.接线引脚定义 ...

  8. K_A14_003 基于STM32等单片机驱动APDS9960手势运动模块 串口与OLED0.96双显示

    K_A14_003 基于STM32等单片机驱动APDS9960手势运动模块 串口与OLED0.96双显示 一.资源说明 二.基本参数 参数 引脚说明 三.驱动说明 时序 对应程序: 四.部分代码说明 ...

  9. K_A14_012基于STM32等单片机驱动GY-25倾斜度角度模块 串口与OLED0.96双显示

    K_A14_012基于STM32等单片机驱动GY-25倾斜度角度模块 串口与OLED0.96双显示 一.资源说明 二.基本参数 参数 引脚说明 三.驱动说明 对应程序: 四.部分代码说明 1.接线引脚 ...

最新文章

  1. 循环获取结构体中的健名与值的实现
  2. TFOD:基于TFOD API的官方模型案例对图片进行目标检测
  3. 【MFC】带背景的工具栏
  4. python中文编码正则_python的unicode编码问题(以正则表达式为例)
  5. 装逼 | 10个JS精简代码无形装逼集合,最为致命,记得收藏好
  6. java向量6_Java学习笔记6-数据结构
  7. 总结leetcode上【排列问题】【组合问题】【子集问题】回溯算法去重的两种写法!
  8. 5G+AIoT“零碳”解决方案 | 模组助力“4S” 融合的新一代智能汽车驶入快车道
  9. ITIL4考试练习题
  10. Java编译器:Javac
  11. 【实验】【视图】使用v$bgprocess视图获得所有后台进程信息
  12. Gateway一直访问本地
  13. 保护系统 WinXP故障恢复控制台完全指引
  14. 【转载】【收藏】汽车电子expert成长之路公众号系列文章列表
  15. python中迭代_python中的迭代什么意思
  16. 从董明珠雷军世纪之赌中看到什么样的格力和小米?
  17. 四象限工作法:四象限时间管理法则及四象限工作法软件
  18. Hive 热门数据分析笔试题(干货满满,持续更新中...)
  19. Thunderbolt4,雷电4与USB4
  20. 当电脑所有浏览器主页被篡改无法修改,一个不用工具解决的方法

热门文章

  1. 英语对一个程序员来说有多重要?
  2. 数据挖掘最前线:五种常用异常值检测方法
  3. Junit test EJB3
  4. android 仿ios悬浮窗,iOS仿微信悬浮窗
  5. Python 网络编程学习笔记(二)——DNS 域名解析客户端程序设计
  6. 婚礼上新郎的经典发言
  7. 打开的一篇word文档,保存到数据库的某个字段中
  8. iPhone手机通讯录如何导入另一部手机?
  9. java时钟中断_Linux之时钟中断详解
  10. html炫酷在线,程序猿必备的10款超炫酷HTML5 Canvas插件