开发者学堂课程【HaaS 物联网应用开发课程:陀螺仪小球_软件详解】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/801/detail/13850
陀螺仪小球_软件详解
内容介绍:
一、陀螺仪小球的应用代码入口
二、主页面逻辑
三、MPU6050驱动
一、陀螺仪小球的应用代码入口
陀螺仪小球的应用层的代码是放在 application/example 应用程序下面,在 edu-demo/k1-apps/gyroscope/ gyroscope.c 这个文件里面。
它也是 edu-demo 的一个子页面,所有的页面都需要实现一个叫 MENU-TYP 的结构体,在 HaaS EDU K1 上电之后,按左右也就是 K1,K2键进行切换应用的时候,切换到陀螺仪小球的页面,这两个 API 就会被一次的呼叫,在进入这个页面的时候, gyroscope-init 这个函数就会被呼叫,在退出这个页面的时候,gyroscope-uninit 这个函数就会被呼叫。
设定是在下面结构体里面进行设定的。
二、主页面逻辑
在 gyroscope-uninit 的函数里边,它首先会对 MPU6050进行初始化,清空 OLED 的屏幕目的是将之前显示的信息全部清除掉,不要影响这次陀螺仪小球的绘制过程,再有它会启动 gyroscope-task,这个函数就退出了。
在 gyroscope-task 里边,它首先会读取加速度传感器在 xyz 这三个方向的重力加速度值,计算出来之后,会先在屏幕的外圈画一个大的空心圆,再根据×方向和 Y 方向的重力加速度位置,确定画的实心小球的一个圆心的位置,确定好之后开始画一个实心圆,画好之后把这些数据都给它放到屏幕的输出缓冲区里边,再将数据刷新到 OLED 屏幕上,之后再休眠20毫秒,进行下一次测量,重复刚刚的测量、计算、画图,休眠的这么一个过程。
在 gyroscope-uninit 里边它会把 gyroscope-task 给结束掉,在结束 gyroscope-task 之前它要确保这次的读取加速度值,计算画圆圆心以及划到 OLED 这个过程是必须要执行完成才能把它退出掉。
在 gyroscope-init 里面它会呼叫 mpu6050,对 mpu6050进行初始化,接下来呼叫 oled-clear 来清空屏幕,再呼叫aos-task-new,创建一个 gyroscope-task ,这里面有四个参数,第一个参数代表要创建 task 的名字,第二个参数则是创建的 task 之后要去执行哪个函数,第三个参数代表说在创建 task 执行它的函数之后,是否要给他传一些参数过来,这边不需要传任何参数。
第四个参数,1000代表是在创建 task 的时候,给它分配的 gyroscope-task 是多大的,接下来 gyroscope-init 就会退出。
再加入 gyroscope-task。这个任务里边它是一个外部循环,首先它会呼叫 OLED clear 清空屏幕,
再去呼叫 MPU-Get-Accelerometer 这个函数,来获取 xyz 这三个方向的重力加速度的实时信息。
在下一部分则是呼叫 OLED-Icon-Drow,把屏幕两边的向左向右的按键的图标给它画出来。接下来绘制一个外圈的空心圆,再根据×方向以及 Y 方向的加速度为一定的偏移量,画一个实心小球,接下来再呼叫 oled- refresh-GRAM,将上面填入的这些显示数据,把它刷新到屏幕上,接下来休眠20毫秒之后再去重复这个过程。
在 gyroscope-uninit 里边它就是会呼叫 aos-task -delete 这个函数,退出 gyroscope -task 的主任务。
三、MPU6050驱动
在初始化 npu6050的时候呼叫的是 npu-init 这个函数,这个函数里边它的实现逻辑主要是:首先通过呼叫 hal-i2c-init,对&i2c-dev控制器进行初始化,这里有5个参数,第一个参数 port 代表 i2C 通道,因为知道 mpu6050和 &i2c-dev 进行连接,也就是说它的通道排第十一。
这边的 address-width 代表的是 i2c 设备地址模式,frequency 则是主设备和从设备之间通信的时候,采用的频率这边设定是100K, mode 则是 i2C 控制器它的一个工作模式,因为它是主设备,所以这个地方就设 I2c-mode-master。
dev-addr 则是从设备的地址,也就是 mpu6050的 addr ,在前边的原理图上有看到它是0X69,在初始化完 i2C 控制器之后,这会先向 power management1计算机写入0X80,就是对mpu6050进行复位,休眠一段时间等它复位完成,再向计算机写入零代表让 MPU6050开始工作。接下来会呼叫 mpu set , general fsr 设定它的陀螺仪传感器的工作范围在±2000度每秒,是通过 mpu set a salary fsr ,设计加速度传感器的量程±2g,再通过 mpu set rate 设定参数频率50,接下来会关闭所有的中断,也关闭 i2C 主模式,因为 mpu6050没有外部其他的第三方传感器,这个时候是要把它的 i2C 主控制器给它关掉的,也没有用到 FIFO 功能,所以就把 FIFO 功能关掉就好了,这个地方它虽然有设定 int 引脚的低电平有效,但是没有实际使用,所以也不用管它。
接下来他会去读取 npo6050内部的一个 device-id-reg,如果读出是0X68的话,是代表 i2C 是正常工作的,这时再去 power management one 计算机写入0X1来设定它的工作的时钟源,再向 power management 二这个计算机写入0,则代表让加速度和陀螺仪传感器都开始工作,再设立一个它的采样频率,mpu-init 这个函数数就完成了。
MPU-GYRO-CFG-REG 就是像 general conflict 计算机写入FSR向左移三位,也就是它的 bit 三和 bit 的四,这两个 byte 选用的是三,所以代表它的最大两种是±2000度毎秒,这个 MPU-SET-ACCEL-FSR 就是像 accelerate conflict 计算机写入加速度传感器的测量量程,这个地方写入的是0,所以它是±2g。
Mpu-Set-Rate 则是设定 Mpu 6050加速度传感器的一个采样频率。它看到 rate 如果是在1000和4之外的话,它会把它限最小值限定在4,最大值限定在1000,计算写入 sample rate 寄存器的值的时候,有1000除以 rate 再减去一,再呼叫 Mpu-set LPF,设定 LPF,这边还有一个 mpu get accelerometer 这个函数则是通过呼叫 Mpu-read len 这个函数,从 XOUTH 这个计算机开始读取6个 byte,都会在这6个 byte 两两 byte 进行组合,就可以得到 xyz3个轴方向的加速度值。
上边这几个函数里边用到的几个基础的函数,像 Mpu write byte 则是把 regs 和 data 放的这个 write -buf 里边,呼叫hal-i2C master send,把这两个 byte 送到从设备。
Mpu-read len 这个函数则是把 register 这个地址写到了 write -buf,第一个 byte,把后面的 buf 指向的数据 cpy 到 write -buf 后面的 buf 里面去,再呼叫还有 hal-i2C master send 这个函数,将 register 以及要写入的 buf,送到mpu6050。
这边的 Mpu read byte 涉及到两次 i2C 数据传输的过程,首先是呼叫还有 hal-i2C master send,将在寄存器的地址,要读取的计算机的地址传给 mpu6050,接下来等一小段时间再呼叫 hal-i2C master recv。将 mpu6050里边这个计算机里面值读回来放在 data 里边,再把 data 反馈。
同样的 mpu read 这个函数也是会涉及到两次。同样的 Mpu-read len 这个函数也是会涉及到两次 i2C 数据传输的过程,第一次是将它要读取的 register 的地址,通过一个i2C操作发送给 mpu6050,接下来发起连续的读操作,是呼叫hal-i2C master recv。
将读取的 buffer 指针以及要读取的 len 传给 has1000的驱动,在驱动里面就会把从 mpu6050里读取回来的数据放到buffer 指向的 memory 里面去。