今日继续学习使用嘉立创购买的 立创梁山派天空星,芯片是 STM32F407VET6
文章目的是编写最简的状态机读取JY901陀螺仪数据:读取三轴角度值
粗略数了一下,大概使用了48行代码......
文章提供测试代码讲解、完整工程下载、测试效果图
目录
上位机设置JY901B:
我手上的是亚博智能的JY901B陀螺仪模块,然后我在上位机将其设置如下:
回传速率100HZ
硬件连接:
硬件连接方面:我们其实 只需要开通STM32的一个串口就可以进行测试了
按照正常想法必定是一个串口接收JY901数据,使用另一个串口接 USB转串口模块 来上传数据给电脑测试
但我们仔细研究会发现,STM32只需串口接收JY901数据,USB转串口模块只需串口接收STM32反馈,因此只需 STM32 RX接JY901B TX ,USB转串口模块 RX接STM32 TX 这样只需开通一个串口即可完成这个简单的解算JY901串口数据的实验了
STM32F407VET6 JY901B陀螺仪 USB转串口模块(接电脑测试) TX RX悬空 RX接STM32 TX RX接JY901B TX TX接STM32 RX TX悬空 VCC VCC VCC GND GND GND
代码程序设计:
以下部分放于程序声明部分,包含了必要的变量与函数声明:
最终解算出的角度数据会存放在 float Angle_R[3]; 数组中
uint8_t RX_BUFFER[10];
typedef struct
{
float angle[3];
}Angle;
struct SAngle//角度
{
short Angle[3];
short T;
};
struct SAngle stcAngle;
float Angle_R[3];
void JY901_Process(uint8_t RxData);
以下函数在串口中断中调用,将串口收到的每个字节传给他:
例:
void JY901_Process(uint8_t RxData)
{
static uint8_t state=0;
static uint8_t bufsize=0;
switch(state)
{
case 0:
//搜索到帧头
if(RxData==0x55) { state=1;}
else state=0;
break;
case 1:
//搜索到角度帧
if(RxData==0x53) { state=2;}
else state=0; //否则重新搜素
break;
case 2:
RX_BUFFER[bufsize]=RxData;
bufsize++;
if(bufsize==9)
{
state=3;
bufsize=0;
}
break;
case 3:
memcpy(&stcAngle,&RX_BUFFER[0],8);
for(uint8_t j = 0; j < 3; j++)
{
Angle_R[j] = (float)stcAngle.Angle[j]/32768*180;
}
state = 0;
break;
}
}
整体代码结构例程展示:
主函数代码基本如下:
#include "board.h"
#include "bsp_uart.h"
#include <stdio.h>
#include "stdarg.h" //自定义printf需要使用
#include "stdio.h" //1.61328125kb
#include "Timer.h"
#include <string.h>
uint8_t RX_BUFFER[10];
typedef struct
{
float angle[3];
}Angle;
struct SAngle//角度
{
short Angle[3];
short T;
};
struct SAngle stcAngle;
float Angle_R[3];
void JY901_Process(uint8_t RxData);
int main(void)
{
board_init();
uart1_init(115200); //初始化串口波特率115200
while(1)
{
printf("X=%f Y=%f Z=%f\r\n",Angle_R[0],Angle_R[1],Angle_R[2]);
delay_ms(300);
}
}
/******** 串口1 中断服务函数 ***********/
void USART1_IRQHandler(void)
{
if(USART_GetITStatus(USART1, USART_IT_RXNE) == SET)//判断是不是真的有中断发生
{
//USART_SendData(USART1,USART_ReceiveData(USART1));//又将数据发回去(用于验证)
JY901_Process(USART_ReceiveData(USART1));
USART_ClearITPendingBit(USART1, USART_IT_RXNE); //已经处理就清楚标志位
}
}
void JY901_Process(uint8_t RxData)
{
static uint8_t state=0;
static uint8_t bufsize=0;
switch(state)
{
case 0:
//搜索到帧头
if(RxData==0x55) { state=1;}
else state=0;
break;
case 1:
//搜索到角度帧
if(RxData==0x53) { state=2;}
else state=0; //否则重新搜素
break;
case 2:
RX_BUFFER[bufsize]=RxData;
bufsize++;
if(bufsize==9)
{
state=3;
bufsize=0;
}
break;
case 3:
memcpy(&stcAngle,&RX_BUFFER[0],8);
for(uint8_t j = 0; j < 3; j++)
{
Angle_R[j] = (float)stcAngle.Angle[j]/32768*180;
}
state = 0;
break;
}
}
测试效果图:
整体工程下载:
网上查阅资料贴出: