查看: 2473|回复: 0

【LeMaker Guitar】GoS500库 -- 6.ADC及ATC2603C(完)

[复制链接]
  • TA的每日心情
    奋斗
    2022-9-16 05:52
  • 签到天数: 1368 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2016-5-23 10:10:28 | 显示全部楼层 |阅读模式
    分享到:
    GoS500系列差不多了,这次就作为最后一篇当个结尾吧。
        翻遍整个S500的手册也没有找到ADC,但是Guitar上却提供了ADC的接口,这是怎么做到的呢?原来Guitar用了一个非常强大的电源管理芯片,ATC2603C。可不要小看这个ATC2603C,它是一个炬力自主研发的电源管理芯片,一般搭配Cortex-A系列的芯片使用,不仅具有各种电源的管理功能,而且还具备可控的GPIO端口、中断、实时时钟等功能,而且居然还有音频的编解码功能,是不是有点越界的感觉。当然,对于S500这样的功能不太全的CPU来说,ATC2603C就是一个很好的补充了。本次所要使用的功能就是ATC2603C的ADC功能,它是通过TWI接口和S500通讯的。
        首先打开Guitar的原理图,在第一页的最前面就非常明确的注明了使用了S500的TWI0来连接。这就好办了,前面已经把TWI封装好了,拿过来直接用就OK。


        既然使用TWI,那就要有地址,在ATC2603C的手册中翻到TWI接口这一部分

       在地址寄存器中,可以看到它的默认7位地址是0x65。有了这些基本的东西,现在可以完成它们之间的通讯了。
        开始写程序。由于ATC2603C是一个单独的设备,所以我将ATC2603C.go文件放到了Device中,具体位置在https://github.com/tjCFeng/GoS500/blob/master/Device/ATC2603C.go文件。

        ATC2603C的功能很多,所以寄存器就更多,其他不用的暂时可以略过。首先定义用到接口为TWI0,接着就是地址。后面的那些东西例行公事,手册上是多少就定义成多少,不需要太关心。

        类的初始化。还记得TWI的例子吗,这里是一样的,只不过系统在启动时已经打开了TWI0,各个引脚已经配置好,所以这里注意不要再次重复配置,将参数SDA和SCL的GPIO设置为nil即可,也就是不指定,除非自己有完全的把握重新配置而不影响到系统的正常运行。让后再增加两个读写函数,通讯部分就算完成了。
        既然是使用ADC的功能,那么就要详细看看ADC这部分的内容。

        手册中对ATC2603C的ADC的介绍。别看只有短短的几个段落,这里其实包括很多内容。10位的AD、最大3V的输入都是要注意的地方,总共16个输入通道包括了方方面面,Guitar底板上ADC的接口就是AUXADC的那几个,也就是用户使用的。其他的都是和系统相关的,比如SystemPower、VBUS、WALL,而且居然可以计算出电流,功能很强大。需要注意的是,这几个电压是通过2.5V基准电压计算的,手册中也给出了计算公式:V = Data * LSB * 2.5。
        这个LSB是什么呢?大家都知道数据在传输的时候都是按照字节流来发送接收的,它们分为MSB、LSB等等,LSB的意思就是最低有效数据位。这里也不例外,因为ATC2603C的精度是10bit,也就是要占用2个字节才能完整的获取一组数据,Data[0]和Data[1],那么这个LSB就是Data[1],Data[0]就是高位的数据,算法很特别,不过倒是不难理解。
        如果需要获取外部电池的电压,它的基准电压就是2V而不是2.5V,所以计算公式是V = Data * LSB * 2,有这么一点差别。
        前面说过,不仅能够获取电压,还可以计算出电流,但是电流的计算就稍显麻烦了。比如要计算BAT的电流,就要另外取得ADC_DBG3和IREFADC的值,IBAT = ADC_DBG3 / IREFADC * 1545.75,结果是mA。好在只是读寄存器的值,这些寄存器都有定义,读出来计算一下而已。同样IWALL、IVBUS也是样计算,只不过对应的是DBG2、DBG1,同时系数也变成1527和1509。
        至于ICHG的数据就更麻烦一些,不仅要先读取DBG0和IREFADC的数据,还要根据版本号来选择系数为1546或2061。读取版本号的寄存器是ATC2603C_CHIP_VER(0xDC)。
        以上都是计算电压和电流的,而我更关心的是温度,如果过热我就要给板子加风扇了。温度是怎样计算的呢?Temp = Data * 0.1949 - 34.899,结果是摄氏度。Data的值是ADC_10通道获得的(0x4C)。
        了解完这些内容,用户接口的ADC就是最简单的了,把3V分成1024份,再乘以Data,不用多说了吧。这些我都封装好了,直接拿来用就是了。看看运行结果:


        板子的照片就不上了,连接ADC的时候我找了一个跳线帽,横着插是把ADC0和串口0的RX引脚连接,得到的结果是965左右,计算出的电压2829毫伏左右;竖着插就是把ADC0接到了地,得到的结果是0伏,看来还是比较准的。至于温度,没跑其他的程序46度,还是可以接受,不过如果满载那就必须加风扇了。
        所有的程序都在https://github.com/tjCFeng/GoS500/中,这里不再上传工程文件。GoS500库的制作到此结束,谢谢。
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-11-19 08:36 , Processed in 0.119081 second(s), 17 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.