打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
分享一个 mma7445控制步进电机转向的程序 使用的是硬件IIC

/******************** *********************************** **************************
 * 文件名  :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);
}

 

 是参考野火的例程了吗

                     


 

 

 

 


本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
. GPIO原理与配置(跑马灯,蜂鸣器,按键)
基于 STM32 的硬件 I2C 读取 MPU6050 数据
zz: stm32 I2C
stm32之SPI
基于STM32的ch438串口扩展芯片使用
超详细陀螺仪MPU6050模块输出姿态角(有完整版源码)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服