Firefly开源社区

打印 上一主题 下一主题

【GoRK3288】6.TSADC操作方法

230

积分

23

威望

20

贡献

技术达人

Rank: 2

积分
230

突出贡献

【GoRK3288】6.TSADC操作方法

发表于 2015-5-13 09:24:39      浏览:14894 | 回复:1        打印      只看该作者   [复制链接] 楼主
     请先在https://github.com/tjCFeng/GoRK3288下载 GoRK3288 开源库


    Rockchip RK3288中有好多ADC,HS-ADC(High Speed ADC)、TS-ADC(Temperature Sensor ADC)。其中HS-ADC 主要用于传输数据,例如手册中说的GPS数据等;而TS-ADC顾名思义,就是采集各种温度传感器的数据了。
    咱们先从简单的开始,所以想办法使用TS-ADC取得各种温度。
    由于温度传感器是集成在CPU内部的,所以本次试验不需要使用任何外部的硬件模块或开发板,直接通过程序来获取结果。

   来看看示例程序吧




    这次的程序更简单,简单到3条语句就够了。 不过是不是这个代码和C语言差别有些大了?这里面其实有两个要点,前面也曾提到过:
单例模式和多返回值。

    1.单例模式:
        在设计模式中有一种叫单例模式,它的作用就是让某一个类在程序运行期间内只被创建一次,即使被重复创建了, 那么返回的也是已经存在的实例,而不再重新创建。不要被那么高深的名字唬住,使用中理解为全局变量就行了。一般的静态语言中这个方法会在构造函数中实现,然而Go语言是个特例,它没有构造函数,所以呢我只能用个普通的函数来代替构造函数了。
        至于为什么非要把TSADC类作为单例来使用,这是因为在RK3288中,TSADC虽然有四个通道,但是它们被控制的寄存器只有一组,不能对每个通道分别控制,也就是要启动一起启动,要停止一起停止。为了避免多个实例化之间造成操作上的冲突,所以我认为单例模式更适合TSADC。

    2.多返回值:
        多返回值是Go语言的一大特色,其他的静态语言是不具备的。而且对于TSADC来说,四个通道的数据是一起开始采集并且可以同时得到结果,而不是一个一个的完成,所以多返回值使用起来可能更方便一些。其实这么写也是有意突出语言特色,而且这个还是在写这一节之前刚刚改成这样的,原来的方法是标准的传递参数来获取指定结果。这两种方法无所谓好坏,如果使用起来不习惯的话可以增加一个指定通道的函数。

    又说了这么多,回到正题。代码中RK3288.ITSADC()就是获得TS-ADC类的实例,如果没有其他地方再需要使用这个实例的话,后面可以直接调用方法函数GetData()。
    再看这个函数的前半部分,_, Data, _, _是保存结果的变量,_部分为不关心的结果,可以不保存值,但是必须被占位。
    整条语句的意思为获取TS-ADC第1通道的结果,获取四个通道的结果应该写为
Data1, Data2, Data3, Data4 := RK3288.ITSADC().GetData()
    Go语言是不是很有意思?

    后面的就简单了,TS-ADC是12位的,Data保存的结果是ADC的数据, 使用GetTemperature函数来将这个数据转化为温度值就是最终想要的结果了。
    实际上,这个数值和温度的变化不是线性的,所以手册里给出了一个映射表



    根据这个映射表进行换算可以得到温度,具体的方法在TSADC.go中,感兴趣的可以看一下。

     运行程序,看看结果


    CPU温度33.x度,不知道准不准。

    这里还有一个问题,手册中说明通道1为CPU温度,通道2为GPU温度,但是获取通道2的数据始终为0,不知道为什么,有时间还要请教一下Firefly的高手。





总结一下TSADC类的方法:
    ITSADC:获得TASDC的实例
    FreeTSADC:释放TSADC
    GetData:获得ADC数据(多返回值)
    GetTemperature:将ADC数据转化为温度值(小数部分保留一位就可以了)

    GoRK3288库请在https://github.com/tjCFeng/GoRK3288下载。
  


回复

使用道具 举报

16

积分

0

威望

0

贡献

技术小白

积分
16
发表于 2019-11-18 17:13:21        只看该作者  沙发
tjCFeng你好!按照你的TSADC操作方法调试遇到两个问题,恳请指点。
1. 首次运行程序结果正确,第二次以后运行结果不正确,如图:

代码:
defer RK3288.FreeRK3288()
        //所有的单例没有创建是否成功的返回值,直接使用
        _, Data, _, _:= RK3288.ITSADC().GetData()
       fmt.Println(Data)
       fmt.Println(RK3288.ITSADC().GetTemperature(Data))
       RK3288.FreeTSADC()

2. 编译后的程序只能通过sudo运行,其他用户运行出错,结果如下:
linaro@linaro-alip:~/go/bin$ ./tsadc
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x7753c]

goroutine 1 [running]:
panic(0xabe00, 0x1040a010)
        /usr/lib/go-1.7/src/runtime/panic.go:500 +0x33c
github.com/tjCFeng/GoRK3288/RK3288.ITSADC(0x0)
        /home/linaro/go/src/github.com/tjCFeng/GoRK3288/RK3288/TSADC.go:48 +0xac4
main.main()
        /home/linaro/go/src/tsadc/Test.go:18 +0x3c
环境: 硬件 AIO-3288C, 系统 debian

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

友情链接 : 爱板网 电子发烧友论坛 云汉电子社区 粤ICP备14022046号-2
快速回复 返回顶部 返回列表