【GoRK3288】6.TSADC操作方法

请先在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下载。

时间: 2024-10-10 10:35:29

【GoRK3288】6.TSADC操作方法的相关文章

【GoRK3288】5.PWM操作方法

请先在https://github.com/tjCFeng/GoRK3288下载 GoRK3288 开源库. 这一节来看看PWM的操作方法.前面说到了GPIO7_A1是个复用端口,包括GPIO和PWM,那么这次还是使用这个端口把它变成PWM输出. 还是来看这张图 可以发现PWM在前,GPIO在后,也就是说默认的功能为PWM.如果想使用PWM功能的话,上电后可以直接使用了.不过为了能更加清楚的说明它是个复用端口,可以在上一节作为GPIO使用后,不要断电或重启,可以重新配置为PWM功能再来使用,其他

【GoRK3288】7.WatchDog操作方法

请先在https://github.com/tjCFeng/GoRK3288下载 GoRK3288 开源库. WatchDog在做服务器程序时很有用处,服务器在运行过程中,一旦发生死机.程序异常等情况,造成系统运行紊乱,可以通过WatchDog来自动控制整个系统重新启动,可以最大限度地减少人员维护的工作量. WatchDog也叫看门狗,它其实就是一个定时器,每隔一段时间检测一个标志位是否被程序赋值,即所谓的喂狗. 如果在某次检测中发现这个标志位没有被人为干预,那么意味着应用程序或系统不能正常运行

【GoRK3288】3.GPIO操作方法(1)

从这一节开始,正式讲述 GoRK3288 的使用方法.请先在https://github.com/tjCFeng/GoRK3288下载 GoRK3288 开源库 . 经过前两节的铺垫,大概了解了Go语言的结构,并且在开发板上每个功能都对应 GoRK3288 库中的一个文件,比如GPIO功能就是通过GPIO.go文件来实现的.而所有的示例代码都在上一层文件夹的Test.go中. 先来看Test.go中的第一段代码 func main() {} 函数前面的部分不用再重复叙述,从这个函数开始,是真正对

【GoRK3288】4.GPIO操作方法(2)

请先在https://github.com/tjCFeng/GoRK3288下载 GoRK3288 开源库. 上一节通过不靠谱的方法控制了WorkLED,那么对于一个具有功能复用的GPIO应该怎样操作呢?为了能够表达的更清楚一些,这次先不看代码,而是找一个具有代表性的端口来针对它说明. Firefly-RK3288有两排引出接口,从这里做文章吧 找来找去,发现GPIO7_A1这个口很好,是PWM和GPIO复用的端口,就对它下手. 由于它本身没有连接到任何地方,直接操作看不出效果,所以我翻箱倒柜找

【GoRK3288】2.Go语法简要说明及GoRK3288结构

Go语言的语句很简单,写起来像是动态语言那样简单.不过虽说代码符号简单,但是刚刚接触的时候却是有些不适应,这里就先把使用 GoRK3288库 的时候需要用到的语法列举一下,其他高深的东西以后再去学习吧. 1.操作符: +.-.*./.%.&.|.^.<<.>>.==.!=.|= 等这些和C语言是一样的,不过在取反的时候就不是~符号了,而是^.跟亦或是同一个符号,怎么区分呢?单目操作是取反,双目操作是亦或.另外要将某一位置0的话 &= ^x是不对的,而是 &^

Python文件和目录操作方法大全(含实例)

一.python中对文件.文件夹操作时经常用到的os模块和shutil模块常用方法.1.得到当前工作目录,即当前Python脚本工作的目录路径: os.getcwd()2.返回指定目录下的所有文件和目录名:os.listdir()               例: print os.listdir(r'E:\test_dir')3.函数用来删除一个文件:os.remove()4.删除多个目录:os.removedirs(r"c:\python")5.检验给出的路径是否是一个文件:os.

视图表单访问控制器操作方法的POST、GET方式对应关系

在视图中,表单默认访问方式是FormMethod.Post(不会将请求显示在地址栏中).在控制器中,操作方法不标注属性,默认为HttpGet属性.会有以前情况出现. 1.表单不指定访问方式(默认形式为Post),只有一个操作方法,且不标注属性,默认为HttpGet属性.则表单将数据提交至控制器HttpGet方法中. @using (Html.BeginForm())    {       <div class="form-group">           <labe

黄聪:Discuz!X/数据库操作方法、DB::table、C::t

函数 功能 DB::table($tablename) 获取正确带前缀的表名,转换数据库句柄, DB::delete($tablename, 条件,条数限制) 删除表中的数据 DB::insert($tablename, 数据(数组),是否返回插入ID,是否是替换式,是否silent) 插入数据操作 DB::update($tablename, 数据(数组)条件) 更新操作 DB::fetch(查询后的资源) 从结果集中取关联数组,注意如果结果中的两个或以上的列具有相同字段名,最后一列将优先.

Cluster 注册表操作方法

cluster的注册表和单机的注册表是不一样的,cluster注册表在cluster的每个node上都能看到,数据是同步的,所以cluster上的注册表的操作方法也不是一样的,详情可以参考 http://msdn.microsoft.com/en-us/library/aa369128(v=vs.85).aspx 下面示例怎么样操作cluster注册表,包括创建,打开,设置,查询值等. HCLUSTER cls = OpenCluster(NULL); if(!cls) { return fal