/******************** *********************************** **************************
* 文件名 :main.c
* 作者 :Orange
**********************************************************************************/
#include "stm32f10x.h"
#include "I2C_MMA.h"
#include "usart1.h"
#include "delay.h"
#include "math.h"
#include "BJMotor.h"
#define ACC_Gravity 9.8
s8 x,y,z;
int i=0;
float jiaodu,jiasudu;
/*
* 函数名:main
* 描述 :主函数
* 输入 :无
* 输出 :无
* 返回 :无
*/
int main(void)
{
/* 串口1初始化 */
USART1_Config();
/*重力传感器初始化*/
I2C_MMA_Init() ;
/*重力传感器校准*/
I2C_MMA_Cal();
Motor_GPIO_Config();//电机驱动口初始化
/***********************************************************************/
while(1)
{
while(!(I2C_MMA_ByteRead(MMA_STATUS_Addr)&0x01));
x=(s8)I2C_MMA_ByteRead(MMA_XOUT8_Addr);
y=(s8)I2C_MMA_ByteRead(MMA_YOUT8_Addr);
z=(s8)I2C_MMA_ByteRead(MMA_ZOUT8_Addr);
// printf("\r\n-----------X= %d \r\n",x);
// printf("\r\n-----------Y= %d \r\n",y);
// printf("\r\n-----------Z= %d \r\n",z);
if((x&0x80) ==0x00) /*读出的原始值为正数 */
{
/*将原始值转换为加速度,2g量程,64LSB/g; 乘以 -1 为方向处理*/
jiasudu = (float)(-1)*x *ACC_Gravity/64;
/*将原始值转换为角度*/
if(x >=64)
/*加速度值大于 1g */
jiaodu = 90.0;
else
/*加速度小于1 g, Angle = asin(Acc/9.8)*57.32; 弧度制转换57.32 = 180/3.14*/
jiaodu = asin((float)x/64)*57.32;
}
/*读出的原始值为负数 */
else
{
/*二补码转换*/
x -= 1;
x = ~x;
/*将原始值转换为加速度*/
jiasudu = (float) x *ACC_Gravity/64;
/*将原始值转换为角度,乘以 -1 为方向处理*/
if(x>=64)
jiaodu = -90.0;
else
/* Angle = asin(Acc/9.8)*57.32 ; 弧度制转换57.32 = 180/3.14*/
jiaodu = (-1)*asin((float)x/64)*57.32;
}
// printf("\r\n-----------加速度= %f4.2 \r\n",jiasudu);
// printf("\r\n-----------角度= %f4.2度 \r\n",jiaodu);
if(jiaodu>=0)
for(i=0;i<8;i++)
{
GPIO_Write(GPIOB,B_Rotation<<12);//电机正转
delay_us(1000);//延时1ms
}
else if(jiaodu<=0)
for(i=0;i<8;i++)
{
GPIO_Write(GPIOB,F_Rotation<<12);//电机反转
delay_us(1000);
}
}
}
/*******************END OF FILE************/
/******************** *********************************************************
* 库版本 :ST3.5.0
*
* 作者 : Orange
* QQ :466175335
**********************************************************************************/
#include "I2C_MMA.h"
#include "usart1.h"
#include "math.h"
#define I2C_Speed 100000
#define MMA_ADRESS 0x3A /*MMA_Device Address*/
/*
* 函数名:I2C_GPIO_Config
* 描述 :I2C1 I/O配置
* 输入 :无
* 输出 :无
* 调用 :内部调用
*/
static void I2C_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* 使能与 I2C1 有关的时钟 */
RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOB, ENABLE );
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);
/* PB6-I2C1_SCL、PB7-I2C1_SDA*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
/*
* 函数名:I2C_Mode_Config
* 描述 :I2C 工作模式配置
* 输入 :无
* 输出 :无
* 调用 :内部调用
*/
static void I2C_Mode_Config(void)
{
/* Initialize the I2C1 according to the I2C_InitStructure members */
I2C_InitTypeDef I2C_InitStructure;
/* I2C 配置 */
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C ;
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_InitStructure.I2C_OwnAddress1 = MMA_ADRESS;
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_ClockSpeed = I2C_Speed;
/* 使能 I2C1 */
I2C_Cmd (I2C1,ENABLE);
/* I2C1 初始化 */
I2C_Init(I2C1, &I2C_InitStructure);
/*允许应答模式*/
I2C_AcknowledgeConfig(I2C1, ENABLE);
}
/*
* 函数名:I2C_MMA_Init
* 描述 :I2C 外设(MMA7455)初始化
* 输入 :无
* 输出 :无
* 调用 :外部调用
*/
void I2C_MMA_Init(void)
{
I2C_GPIO_Config();
I2C_Mode_Config();
}
/*
* 函数名:I2C_MMA_ByteWrite
* 描述 :写一个字节到I2C MMA寄存器中
* 输入 :-pBuffer 缓冲区指针
* -WriteAddr 接收数据的MMA寄存器的地址
* 输出 :无
* 返回 :无
* 调用 :内部调用
*/
void I2C_MMA_ByteWrite(u8 pBuffer, u8 WriteAddr)
{
/*wait until I2C bus is not busy*/
while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));
/* Send START condition */
I2C_GenerateSTART(I2C1, ENABLE);
/* Test on EV5 and clear it */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
/* Send MMA address for write */
I2C_Send7bitAddress(I2C1, MMA_ADRESS, I2C_Direction_Transmitter);
/* Test on EV6 and clear it */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
/* Send the MMA's Register address to write to */
I2C_SendData(I2C1, WriteAddr);
/* Test on EV8 and clear it */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
/* Send the byte to be written */
I2C_SendData(I2C1, pBuffer);
/* Test on EV8 and clear it */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
/* Send STOP condition */
I2C_GenerateSTOP(I2C1, ENABLE);
}
/*
* 函数名:I2C_MMA_ByteRead
* 描述 :从MMA寄存器里面读取一块数据。
* 输入 : -ReadAddr 接收数据的MMA寄存器的地址。
* 输出 :无
* 返回 :读取出的寄存器数据
* 调用 :内部调用
*/
u8 I2C_MMA_ByteRead(u8 ReadAddr)
{
u8 RxData;
/*wait until I2C bus is not busy*/
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));
/* Send START condition */
I2C_GenerateSTART(I2C1, ENABLE);
/* Test on EV5 and clear it */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
/* Send MMA address for write */
I2C_Send7bitAddress(I2C1, MMA_ADRESS, I2C_Direction_Transmitter);
/* Test on EV6 and clear it */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
/* Clear EV6 by setting again the PE bit */
I2C_Cmd(I2C1, ENABLE);
/* Send the MMA's Register address to write to */
I2C_SendData(I2C1, ReadAddr);
/* Test on EV8 and clear it */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
/* Send STRAT condition a second time */
I2C_GenerateSTART(I2C1, ENABLE);
/* Test on EV5 and clear it */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
/* Send MMA address for read */
I2C_Send7bitAddress(I2C1, MMA_ADRESS, I2C_Direction_Receiver);
/* Test on EV6 and clear it */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
/* Test on wait for EV7 */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED));
/* Read a byte from the MMA Register */
RxData = I2C_ReceiveData(I2C1);
/* Disable Acknowledgement */
I2C_AcknowledgeConfig(I2C1, DISABLE);
/* Send STOP Condition */
I2C_GenerateSTOP(I2C1, ENABLE);
/*Retrun Data*/
return RxData;
}
/*
* 函数名:I2C_MMA_Cal
* 描述 :MMA7455 校准
* 输入 :无
* 输出 :无
* 调用 :外部调用,在初始化后调用
*/
void I2C_MMA_Cal(void)
{
I2C_MMA_ByteWrite(0xc7,MMA_XOFFL_Addr); /*校正x值 00 */
I2C_MMA_ByteWrite(0xFF,MMA_XOFFH_Addr);
I2C_MMA_ByteWrite(0x00,MMA_YOFFL_Addr); /*校正y值 48*/
I2C_MMA_ByteWrite(0xaf,MMA_ZOFFL_Addr); /*校正Z值 -30的补码 */
I2C_MMA_ByteWrite(0xFF,MMA_ZOFFH_Addr); /*校正Z值,校正值为负数,要把高位写 1;*/
I2C_MMA_ByteWrite(0x05,MMA_MCTL_Addr);/*2g*/
}
/*
* 函数名:I2C_MMA_Test
* 描述 :测量倾角 和 加速度 (量程0-2g)
* 输入 :数据结构体的指针
* 输出 :无
* 调用 :外部调用
*/
/*int GetData(unsigned char REG_Address)
{
char H,L;
L=I2C_MMA_ByteRead(REG_Address);
H=I2C_MMA_ByteRead(REG_Address+1);
return (L<<4)+H; //合成数据
}
*/
/******************* END OF FILE************/
#ifndef __BJMotor_H__
#define __BJMotor_H__
/************双相八拍**************/
static unsigned char F_Rotation[8]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};//正转表格
static unsigned char B_Rotation[8]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01};//反转表格
/**************单相四拍***********/
//static unsigned char F_Rotation[8]={0x01,0x02,0x04,0x08};
//static unsigned char B_Rotation[8]={0x08,0x04,0x02,0x01};
void Motor_GPIO_Config(void);//电机驱动口配置
#endif
#include "stm32f10x.h"
#include "BJMotor.h"
void Motor_GPIO_Config(void)//电机驱动口配置
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15 | GPIO_Pin_14
| GPIO_Pin_13 | GPIO_Pin_12; //高四位驱动作线
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速率50Mhz
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
是参考野火的例程了吗
|