2856|0

83

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

[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控制舵机视频

41-串口得到的10次采样加速度3轴数据.jpg (166.87 KB, 下载次数: 0)

41

41

42-启动后的LCD显示.jpg (160.47 KB, 下载次数: 0)

42

42

43-按下用户键后的显示结果.JPG (180.14 KB, 下载次数: 0)

43

43

44-旋转板子后的显示数据.jpg (61 KB, 下载次数: 0)

44

44
点赞 关注
个人签名永远好心情
 
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表