目录
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
一、陀螺仪
支持串口和
IIC
两种数字接口。方便用户选择最佳的连接方式。串口速率 2400bps~921600bps 可调,
IIC
接口支持全速
400K
速率
二、使用步骤
1.性能参数
1
、电压:
3V~6V
2
、电流:
<40mA
3
、体积:
15.24mm X 15.24mm X 2mm
4
、焊盘间距:上下
100mil(2.54mm)
,左右
600mil(15.24mm)
5
、测量维度:加速度:
3
维,角速度:
3
维,磁场:
3
维,角度:
3
维,气压
:1
维,
GPS
:
3
维
6
、量程:加速度
:±16g
,角速度
:±2000°/s
,角度
±180°
。
7
、分辨率:加速度:
6.1e-5g
,角速度
:7.6e-3°/s
。
8
、稳定性:加速度:
0.01g
,角速度
0.05°/s
。
9
、姿态测量稳定度:
0.01°
。
10
、数据输出内容:时间、加速度、角速度、角度、磁场、端口状态、气压(
JY-901B
)、高度
(
JY-901B
)、经纬度(需连接
GPS
)、地速(需连接
GPS
)。
10
、数据输出频率
0.1Hz~200Hz
。
11
、数据接口:串口(
TTL
电平,波特率支持
2400
、
4800
、
9600
、
19200
、
38400
、
57600
、
115200
、 230400、
460800
、
921600
),
I2C
(最大支持高速
IIC
速率
400K
)
12
、扩展口功能:模拟输入(
0~VCC
)、数字输入、数字输出、
PWM
输出(周期
1us65535us
, 分辨率
2.引脚说明
#include "UARTs.h"
u8 TxBuffer[256];
u8 TxCounter=0;
u8 count=0;
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
/* Enable the USART1 Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 7;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
/**************************实现函数********************************************
*函数原型: void Initial_UART1(u32 baudrate)
*功 能: 初始化STM32-SDK开发板上的RS232接口
输入参数:
u32 baudrate 设置RS232串口的波特率
输出参数:没有
*******************************************************************************/
void Initial_UART1(u32 baudrate)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
/* 使能 UART1 模块的时钟 使能 UART1对应的引脚端口PA的时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);
/* 配置UART1 的发送引脚
配置PA9 为复用输出 刷新频率50MHz
*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/*
配置UART1 的接收引脚
配置PA10为浮地输入
*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/*
UART1的配置:
1.波特率为调用程序指定的输入 baudrate;
2. 8位数据 USART_WordLength_8b;
3.一个停止位 USART_StopBits_1;
4. 无奇偶效验 USART_Parity_No ;
5.不使用硬件流控制 USART_HardwareFlowControl_None;
6.使能发送和接收功能 USART_Mode_Rx | USART_Mode_Tx;
*/
USART_InitStructure.USART_BaudRate = baudrate;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No ;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
//应用配置到UART1
USART_Init(USART1, &USART_InitStructure);
USART_ITConfig(USART1, USART_IT_TXE, DISABLE);
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
USART_ClearFlag(USART1,USART_FLAG_TC);
//启动UART1
USART_Cmd(USART1, ENABLE);
NVIC_Configuration();
}
/**************************实现函数********************************************
*函数原型: void UART1_Put_Char(unsigned char DataToSend)
*功 能: RS232发送一个字节
输入参数:
unsigned char DataToSend 要发送的字节数据
输出参数:没有
*******************************************************************************/
void UART1_Put_Char(char DataToSend)
{
//将要发送的字节写到UART1的发送缓冲区
//USART_SendData(USART1, (unsigned char) DataToSend);
//等待发送完成
//while (!(USART1->SR & USART_FLAG_TXE));
TxBuffer[count++] = DataToSend;
USART_ITConfig(USART1, USART_IT_TXE, ENABLE);
}
void UART1_Put_String(char *Str)
{
//判断Str指向的数据是否有效.
while(*Str){
//是否是回车字符 如果是,则发送相应的回车 0x0d 0x0a
if(*Str=='\r')UART1_Put_Char(0x0d);
else if(*Str=='\n')UART1_Put_Char(0x0a);
else UART1_Put_Char(*Str);
Str++;
}
}
//------------------------------------------------------
u8 chrTemp[250];
void CopeSerialData(unsigned char ucData);
void USART1_IRQHandler(void)
{
if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET)
{
USART_SendData(USART1, TxBuffer[TxCounter++]);
if(TxCounter == count)
{
USART_ITConfig(USART1, USART_IT_TXE, DISABLE);// 全部发送完成
}
USART_ClearITPendingBit(USART1, USART_IT_TXE);
}
else if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
CopeSerialData((unsigned char)USART1->DR);//处理数据
USART_ClearITPendingBit(USART1, USART_IT_RXNE);
}
USART_ClearITPendingBit(USART1,USART_IT_ORE);
}
//uart reicer flag
#define b_uart_head 0x80
#define b_rx_over 0x40
// USART Receiver buffer
#define RX_BUFFER_SIZE 100
u8 U2TxBuffer[258];
u8 U2TxCounter=0;
u8 U2count=0;
void U2NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
/* Enable the USART1 Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 8;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
/**************************实现函数********************************************
*函数原型: void Initial_UART2(u32 baudrate)
*功 能: 初始化STM32-SDK开发板上的RS232接口
输入参数:
u32 baudrate 设置RS232串口的波特率
输出参数:没有
*******************************************************************************/
void Initial_UART2(u32 baudrate)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
/* 使能 UART2 模块的时钟 使能 UART2对应的引脚端口PA的时钟*/
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2 | RCC_APB2Periph_GPIOA, ENABLE);
/* 配置UART2 的发送引脚
配置PA9 为复用输出 刷新频率50MHz
*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/*
配置UART2 的接收引脚
配置PA10为浮地输入
*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/*
UART2的配置:
1.波特率为调用程序指定的输入 baudrate;
2. 8位数据 USART_WordLength_8b;
3.一个停止位 USART_StopBits_1;
4. 无奇偶效验 USART_Parity_No ;
5.不使用硬件流控制 USART_HardwareFlowControl_None;
6.使能发送和接收功能 USART_Mode_Rx | USART_Mode_Tx;
*/
USART_InitStructure.USART_BaudRate = baudrate;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No ;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
//应用配置到UART2
USART_Init(USART2, &USART_InitStructure);
USART_ITConfig(USART2, USART_IT_TXE, DISABLE);
USART_ClearFlag(USART2,USART_FLAG_TC);
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); //使能接收中断
//启动UART2
USART_Cmd(USART2, ENABLE);
U2NVIC_Configuration();
}
volatile unsigned char RC_Flag;
//------------------------------------------------------
void USART2_IRQHandler(void)
{
unsigned char data;
if(USART_GetITStatus(USART2, USART_IT_TXE) != RESET)
{
/* Write one byte to the transmit data register */
USART_SendData(USART2, U2TxBuffer[U2TxCounter++]);
/* Clear the USART1 transmit interrupt */
USART_ClearITPendingBit(USART2, USART_IT_TXE);
if(U2TxCounter == U2count)
{
/* Disable the USART1 Transmit interrupt */
USART_ITConfig(USART2, USART_IT_TXE, DISABLE);
}
}else if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
{
data=USART_ReceiveData(USART2);
/* Clear the USART1 transmit interrupt */
USART_ClearITPendingBit(USART2, USART_IT_RXNE);
}
}
//------------------End of File----------------------------
主程序模块
---------硬件上的引脚连接:----------
TTL接口:
PC(USB-TTL) STM32F103 JY-901
RX <--> PA9(UART1-TXD)
PA10(UART1-RXD) <--> TX
------------------------------------
---------硬件上的引脚连接:----------
TTL接口:
PC(USB-TTL) STM32F103 JY-901
RX <--> PA9(UART1-TXD)
PA10(UART1-RXD) <--> TX
------------------------------------
*/
#include "stm32f10x.h"
#include "UARTs.h"
#include "IOI2C.h"
#include "delay.h"
#include "JY901.h"
#include "string.h"
struct STime stcTime;
struct SAcc stcAcc;
struct SGyro stcGyro;
struct SAngle stcAngle;
struct SMag stcMag;
struct SDStatus stcDStatus;
struct SPress stcPress;
struct SLonLat stcLonLat;
struct SGPSV stcGPSV;
//CopeSerialData为串口中断调用函数,串口每收到一个数据,调用一次这个函数。
void CopeSerialData(unsigned char ucData)
{
static unsigned char ucRxBuffer[250];
static unsigned char ucRxCnt = 0;
ucRxBuffer[ucRxCnt++]=ucData;
if (ucRxBuffer[0]!=0x55) //数据头不对,则重新开始寻找0x55数据头
{
ucRxCnt=0;
return;
}
if (ucRxCnt<11) {return;}//数据不满11个,则返回
else
{
switch(ucRxBuffer[1])
{
case 0x50: memcpy(&stcTime,&ucRxBuffer[2],8);break;//memcpy为编译器自带的内存拷贝函数,需引用"string.h",将接收缓冲区的字符拷贝到数据共同体里面,从而实现数据的解析。
case 0x51: memcpy(&stcAcc,&ucRxBuffer[2],8);break;
case 0x52: memcpy(&stcGyro,&ucRxBuffer[2],8);break;
case 0x53: memcpy(&stcAngle,&ucRxBuffer[2],8);break;
case 0x54: memcpy(&stcMag,&ucRxBuffer[2],8);break;
case 0x55: memcpy(&stcDStatus,&ucRxBuffer[2],8);break;
case 0x56: memcpy(&stcPress,&ucRxBuffer[2],8);break;
case 0x57: memcpy(&stcLonLat,&ucRxBuffer[2],8);break;
case 0x58: memcpy(&stcGPSV,&ucRxBuffer[2],8);break;
}
ucRxCnt=0;
}
}
int main(void)
{
char str[100];
SystemInit(); /* 配置系统时钟为72M 使用外部8M晶体+PLL*/
SysTick_init(72,10); //延时初始化
Initial_UART1(9600);
delay_ms(1000);//等等JY-91初始化完成?
while(1)
{
delay_ms(500);
sprintf(str,"Time:20%d-%d-%d %d:%d:%.3f\r\n",stcTime.ucYear,stcTime.ucMonth,stcTime.ucDay,stcTime.ucHour,stcTime.ucMinute,(float)stcTime.ucSecond+(float)stcTime.usMiliSecond/1000);
UART1_Put_String(str);
delay_ms(10);//等待传输完成
sprintf(str,"Acc:%.3f %.3f %.3f\r\n",(float)stcAcc.a[0]/32768*16,(float)stcAcc.a[1]/32768*16,(float)stcAcc.a[2]/32768*16);
UART1_Put_String(str);
delay_ms(10);//等待传输完成
sprintf(str,"Gyro:%.3f %.3f %.3f\r\n",(float)stcGyro.w[0]/32768*2000,(float)stcGyro.w[1]/32768*2000,(float)stcGyro.w[2]/32768*2000);
UART1_Put_String(str);
delay_ms(10);//等待传输完成
sprintf(str,"Angle:%.3f %.3f %.3f\r\n",(float)stcAngle.Angle[0]/32768*180,(float)stcAngle.Angle[1]/32768*180,(float)stcAngle.Angle[2]/32768*180);
UART1_Put_String(str);
delay_ms(10);//等待传输完成
sprintf(str,"Mag:%d %d %d\r\n",stcMag.h[0],stcMag.h[1],stcMag.h[2]);
UART1_Put_String(str);
delay_ms(10);//等待传输完成
sprintf(str,"Pressure:%ld Height%.2f\r\n",stcPress.lPressure,(float)stcPress.lAltitude/100);
UART1_Put_String(str);
delay_ms(10);//等待传输完成
sprintf(str,"DStatus:%d %d %d %d\r\n",stcDStatus.sDStatus[0],stcDStatus.sDStatus[1],stcDStatus.sDStatus[2],stcDStatus.sDStatus[3]);
UART1_Put_String(str);
delay_ms(10);//等待传输完成
sprintf(str,"Longitude:%ldDeg%.5fm Lattitude:%ldDeg%.5fm\r\n",stcLonLat.lLon/10000000,(double)(stcLonLat.lLon % 10000000)/1e5,stcLonLat.lLat/10000000,(double)(stcLonLat.lLat % 10000000)/1e5);
UART1_Put_String(str);
delay_ms(10);//等待传输完成
sprintf(str,"GPSHeight:%.1fm GPSYaw:%.1fDeg GPSV:%.3fkm/h\r\n\r\n",(float)stcGPSV.sGPSHeight/10,(float)stcGPSV.sGPSYaw/10,(float)stcGPSV.lGPSVelocity/1000);
UART1_Put_String(str);
delay_ms(10);//等待传输完成
}//主循环 end
}
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。