|
[X-NUCLEO-IKS01A2测评] 采用STM32CubeExpansion_MEMS1_V4.0.0测试LCD显示3轴加速度
[复制链接]
本帖最后由 zhjb1 于 2017-10-27 15:34 编辑
采用mned工程一直没有测试成功,于是在线上管理员给的STM32CubeExpansion_MEMS1_V4.0.0工程进行测试,其中有完整的LSM6DSL芯片的加速度采样的
各种代码,找了其中的1个:LSM6DSL_FIFOMode先用fifo方法存入内存,而后读出的工程进行测试。
打开此工程,编译下载后可以直接运行。按压用户键直接从虚拟串口就可以得到采样输出的数据,见截图41。
分析程序,可以知道此工程采用的属于状态机控制方法,在代码的前边部分定义了状态机的几个变量:
typedef enum
{
STATUS_IDLE,
STATUS_SET_FIFO_MODE,
STATUS_FIFO_RUN,
STATUS_FIFO_DOWNLOAD,
STATUS_SET_BYPASS_MODE
} DEMO_FIFO_STATUS;
当然直译是FIFO状态描述:分别为:等待状态、设置FIFO模式、FIFO运行、下载FIFO数据、传输数据到虚拟串口,看来老外[也许是国人]编的——为了让人难以模仿功能性代码到处调用,也没有时间去详细分析了。本实验仅仅完成将数据显示到LCD屏幕上即可。从上述分析可以的到状态机在执行到STATUS_SET_BYPASS_MODE这一步前时数据已经准备完成了,因此在这一步的前后或同时将数据送显到LCD即可。分析程序还可以得到,此程序一次连续读取10个3轴样本存到FIFO内存中,而显示数据只有1组,因此需要累加后除以10再显示。
将前边的驱显6903.h更改后加入到创建了incs文件夹的此工程中,更改的部分示例如下:
//Write Plus
void wri(void){
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_SET);
}
//Write a byte to lcd dt=data,com=reg/data
void b2l(unsigned char dt,unsigned char com){
unsigned char i;
if(com)HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_SET);else HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET);
for(i=0;i<8;i++){
if(dt&0x80){HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);}else{HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);};
dt=dt<<1;
wri();
}
}
初始化的Reset代码:
HAL_Delay(10);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET);
HAL_Delay(10);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET);
HAL_Delay(10);
其它不变。在main函数头文件增加:
#include "6903.h"
增加函数声明和定义变量:
void dispBase(void);
void dispMes(void);
int32_t jsq;
int32_t val0,val1,val2;
增加定义4线LCD的控制线:
static void gpioInit(void){
GPIO_InitTypeDef GPIO_InitStructA,GPIO_InitStructB;
//GPIO Ports Clock Enable
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
//Configure GPIO pin Output Level
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7,GPIO_PIN_RESET);
//Configure GPIO pins : PA5 PA6 PA7 PB6
GPIO_InitStructA.Pin = GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;
GPIO_InitStructA.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStructA.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStructA);
GPIO_InitStructB.Pin = GPIO_PIN_6;
GPIO_InitStructB.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStructB.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOB, &GPIO_InitStructB);
}
在main函数适当位置增加函数调用:
gpioInit();
lcdInit();
lcdClear();
dispBase();
在while循环体中找到demoFifoStatus = STATUS_SET_BYPASS_MODE;,在其后增加:
dispMes();
找到demoFifoStatus = STATUS_IDLE;,在其后增加:
val0=val1=val2=0;
再在后边的函数中找到static DrvStatusTypeDef LSM6DSL_Read_Single_FIFO_Pattern_Cycle(uint16_t sampleIndex)
在获取数据的3条语句分别改为:
val0+=gyr_x = angular_velocity;
val1+=gyr_y = angular_velocity;
val2+=gyr_z = angular_velocity;
再在次函数的return COMPONENT_OK;之前增加语句:
jsq++;
在所有函数的最后建下列函数考入:
//Display Base Meseger
void dispBase(void){
c2l(0,0,19);c2l(1,0,28);c2l(2,0,26);c2l(3,0,40);//JSQ:
c2l(0,1,27);c2l(1,1,33);c2l(2,1,40);//c2l(3,1,40);//CRX:
c2l(0,2,27);c2l(1,2,34);c2l(2,2,40);//c2l(3,2,40);//CRY:
c2l(0,3,27);c2l(1,3,35);c2l(2,3,40);//c2l(3,3,40);//CRZ:
c2l(0,4,29);c2l(1,4,14);c2l(2,4,22);c2l(3,4,40);//TEM:
c2l(9,4,17);c2l(10,4,30);c2l(11,4,22);c2l(12,4,40);//HUM:
}
//Display Messeg
void dispMes(void){
//val0 /=10;val1 /=10;val2 /=10;
c2l(4,0,(jsq/1000000)%10);c2l(5,0,(jsq/100000)%10);c2l(6,0,(jsq/10000)%10);c2l(7,0,(jsq/1000)%10);//JSQ:
c2l(8,0,(jsq/100)%10);c2l(9,0,(jsq/10)%10);c2l(10,0,(jsq)%10);//JSQ:
if(val0<0){val0=val0*(-1);c2l(3,1,39);}else{c2l(3,1,38);}
c2l(4,1,(val0/100000)%10);c2l(5,1,(val0/10000)%10);c2l(6,1,(val0/1000)%10);c2l(7,1,(val0/100)%10);c2l(8,1,(val0/10)%10);c2l(9,1,
(val0)%10);//RCX
if(val1<0){val1=val1*(-1);c2l(3,2,39);}else{c2l(3,2,38);}
c2l(4,2,(val1/100000)%10);c2l(5,2,(val1/10000)%10);c2l(6,2,(val1/1000)%10);c2l(7,2,(val1/100)%10);c2l(8,2,(val1/10)%10);c2l(9,2,
(val1)%10);//RCY
if(val2<0){val2=val2*(-1);c2l(3,3,39);}else{c2l(3,3,38);}
c2l(4,3,(val2/100000)%10);c2l(5,3,(val2/10000)%10);c2l(6,3,(val2/1000)%10);c2l(7,3,(val2/100)%10);c2l(8,3,(val2/10)%10);c2l(9,3,
(val2)%10);//RCZ
}
经过上述改动,编译下载后运行的结果见照片42是Reset后的结果,照片43是按下用户键的结果,注意数值与图41不一样——因为是10次采样的平均值,
串口输出的结果与截图41相同。照片44是旋转板子后的采样数据。
上一篇的转码已完成,视频连接:PWM控制舵机视频
|
|