main
詹力 2024-01-15 12:17:52 +08:00
parent f10257b47b
commit ef6cdc2390
21 changed files with 8058 additions and 4300 deletions

View File

@ -476,13 +476,13 @@ ARM Macro Assembler Page 8
00000200 00000200
00000000 00000000
Command Line: --debug --xref --diag_suppress=9931 --cpu=Cortex-M3 --apcs=interw Command Line: --debug --xref --diag_suppress=9931 --cpu=Cortex-M3 --apcs=interw
ork --depend=..\obj\startup_stm32f10x_md.d -o..\obj\startup_stm32f10x_md.o -I"D ork --depend=..\obj\startup_stm32f10x_md.d -o..\obj\startup_stm32f10x_md.o -I"E
:\Hardware Project\GeBalanceBot\4.WHEELTEC B570 ƽºâС³µÔ´Â루¿âº¯Êý¾«¼òÈëÃÅ°æ£ :\HardwareProject\GeBalanceBot\4.WHEELTEC B570 平衡小车源码(库函数精简入门版)
©\USER\RTE" -I"D:\Program Files\Keilv5\ARM\PACK\ARM\CMSIS\4.5.0\CMSIS\Include" \USER\RTE" -I"D:\Program Files\Keilv5\ARM\PACK\ARM\CMSIS\4.5.0\CMSIS\Include" -
-I"D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include" -- I"D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include" --p
predefine="__UVISION_VERSION SETA 521" --predefine="_RTE_ SETA 1" --predefine=" redefine="__UVISION_VERSION SETA 521" --predefine="_RTE_ SETA 1" --predefine="S
STM32F10X_MD SETA 1" --list=.\startup_stm32f10x_md.lst ..\MiniBalance_COER\star TM32F10X_MD SETA 1" --list=.\startup_stm32f10x_md.lst ..\MiniBalance_COER\start
tup_stm32f10x_md.s up_stm32f10x_md.s

View File

@ -1,5 +1,5 @@
#include "bsp_iic.h" #include "bsp_iic.h"
#include "bluetooth.h"
/* /*
********************************************************************************************************* *********************************************************************************************************
* : i2c_Delay * : i2c_Delay
@ -207,6 +207,7 @@ void IIC_NAck(void)
*/ */
void IIC_Init(void) void IIC_Init(void)
{ {
PB_USART_printf(USART2, (u8*)"IIC Init..\r\n");
GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_I2C_PORT, ENABLE); /* 打开GPIO时钟 */ RCC_APB2PeriphClockCmd(RCC_I2C_PORT, ENABLE); /* 打开GPIO时钟 */
@ -218,6 +219,10 @@ void IIC_Init(void)
/* 给一个停止信号, 复位I2C总线上的所有设备到待机模式 */ /* 给一个停止信号, 复位I2C总线上的所有设备到待机模式 */
IIC_Stop(); IIC_Stop();
// uint8_t data = i2c_CheckDevice(0x75);
// PB_USART_printf(USART2, (u8*)"IIC Init Res = %d\r\n", (int)data);
} }
/* /*

View File

@ -19,20 +19,19 @@ void System_Init(void)
NVIC_Config(); NVIC_Config();
LED_GPIO_Config(); LED_GPIO_Config();
USART1_Init(115200); USART1_Init(115200);
IIC_Init(); //IIC_Init();
Motor_Init(); Motor_Init();
MOTO_PWM_Init(3599,0); MOTO_PWM_Init(3599,0);
OLED_Init(); // OLED_Init();
OLED_Clear(); // OLED_Clear();
OLED_ShowCHinese(0,0,2); // OLED_ShowCHinese(0,0,2);
OLED_ShowCHinese(16,0,3); // OLED_ShowCHinese(16,0,3);
OLED_ShowString(88,0,(u8*)"m/min",16); // OLED_ShowString(88,0,(u8*)"m/min",16);
OLED_ShowString(0, 2,(u8*)"Left : RPM",12); // OLED_ShowString(0, 2,(u8*)"Left : RPM",12);
OLED_ShowString(0, 3,(u8*)"Right: RPM",12); // OLED_ShowString(0, 3,(u8*)"Right: RPM",12);
OLED_ShowString(0, 4,(u8*)"P: I: D: ",16); // OLED_ShowString(0, 4,(u8*)"P: I: D: ",16);
OLED_ShowString(0, 6,(u8*)"Set_C: RPM",12); // OLED_ShowString(0, 6,(u8*)"Set_C: RPM",12);
OLED_ShowString(0, 7,(u8*)"Set_P: m/min",12);
Encoder_Init_TIM2(); Encoder_Init_TIM2();
TIM2 -> CNT=30000; TIM2 -> CNT=30000;

View File

@ -84,11 +84,15 @@ void _sys_exit(int x)
/// 重定向c库函数printf到USART1 /// 重定向c库函数printf到USART1
int fputc(int ch, FILE *f) int fputc(int ch, FILE *f)
{ {
/* 发送一个字节数据到USART1 */ // /* 发送一个字节数据到USART1 */
USART_SendData(USART1, (uint8_t)ch); // USART_SendData(USART2, (uint8_t)ch);
/* 等待发送完毕 */ // /* 等待发送完毕 */
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); // while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
return (ch); // return (ch);
while((USART1->SR&0X40)==0);// 使用串口1
USART1->DR = (u8) ch;
return ch;
} }
/// 重定向c库函数scanf到USART1 /// 重定向c库函数scanf到USART1

View File

@ -21,6 +21,7 @@ All rights reserved
#include "sys.h" #include "sys.h"
#include "delay.h" #include "delay.h"
/************************************************************************** /**************************************************************************
Function: IIC_MPU6050_Init Function: IIC_MPU6050_Init
Input : none Input : none

View File

@ -57,13 +57,13 @@ All rights reserved
//IO方向设置 //IO方向设置
#define SDA_IN() {GPIOB->CRH&=0XFFFFFF0F;GPIOB->CRH|=8<<4;} #define SDA_IN() {GPIOB->CRH&=0XFFFF0FFF;GPIOB->CRH|=8<<4;}
#define SDA_OUT() {GPIOB->CRH&=0XFFFFFF0F;GPIOB->CRH|=3<<4;} #define SDA_OUT() {GPIOB->CRH&=0XFFFF0FFF;GPIOB->CRH|=3<<4;}
//IO操作函数 //IO操作函数
#define IIC_SCL PBout(8) //SCL #define IIC_SCL PBout(10) //SCL
#define IIC_SDA PBout(9) //SDA #define IIC_SDA PBout(11) //SDA
#define READ_SDA PBin(9) //输入SDA #define READ_SDA PBin(11) //输入SDA
//IIC所有操作函数 //IIC所有操作函数
void IIC_MPU6050_Init(void); // 初始化IIC的IO口 void IIC_MPU6050_Init(void); // 初始化IIC的IO口

View File

@ -8,9 +8,12 @@
TXDRXD5VGND TXDRXD5VGND
1. PA2 -> RXD 2.PA3 -> TXD 1. PA2 -> RXD 2.PA3 -> TXD
********************************************************************************/ ********************************************************************************/
#include "stdarg.h"
#include "stdio.h"
#include "bluetooth.h" #include "bluetooth.h"
#include <stdio.h> #include <stdio.h>
volatile unsigned char *rx2_address; volatile unsigned char *rx2_address;
volatile unsigned int rx2_count; volatile unsigned int rx2_count;
volatile unsigned int rx2_length; volatile unsigned int rx2_length;
@ -88,6 +91,145 @@ void USART2_Send(unsigned char *tx_buf, int len)
} }
/**----------------------------------------------------------------------
* Function : USART2_Send
* Description : ÀÑÀͨ¹ýUSART2·¢Ë͵½ÊÖ»ú
* Author : zhanli&719901725@qq.com
* Date : 2023/05/20 zhanli
*---------------------------------------------------------------------**/
void USART2_SendStr(unsigned char *tx_buf)
{
USART_ClearFlag(USART2, USART_FLAG_TC);
USART_ClearITPendingBit(USART2, USART_FLAG_TXE);
while(*tx_buf != 0)
{
USART_SendData(USART2, *tx_buf++);
while(USART_GetFlagStatus(USART2, USART_FLAG_TC) != 1);
USART_ClearFlag(USART2, USART_FLAG_TC);
USART_ClearITPendingBit(USART2, USART_FLAG_TXE);
}
}
static char *itoa(int value, char *string, int radix)
{
int i, d;
int flag = 0;
char *ptr = string;
/* This implementation only works for decimal numbers. */
if (radix != 10)
{
*ptr = 0;
return string;
}
if (!value)
{
*ptr++ = 0x30;
*ptr = 0;
return string;
}
/* if this is a negative value insert the minus sign. */
if (value < 0)
{
*ptr++ = '-';
/* Make the value positive. */
value *= -1;
}
for (i = 10000; i > 0; i /= 10)
{
d = value / i;
if (d || flag)
{
*ptr++ = (char)(d + 0x30);
value -= (d * i);
flag = 1;
}
}
/* Null terminate the string. */
*ptr = 0;
return string;
} /* NCL_Itoa */
void PB_USART_printf(USART_TypeDef* USARTx, uint8_t *Data,...)
{
const char *s;
int d;
char buf[18];
va_list ap;
va_start(ap, Data);
USART_ClearFlag(USART2, USART_FLAG_TC);
USART_ClearITPendingBit(USART2, USART_FLAG_TXE);
while ( *Data != 0)
{
if ( *Data == 0x5c ) //'\'
{
switch ( *++Data )
{
case 'r':
USART_SendData(USARTx, 0x0d);
Data ++;
break;
case 'n':
USART_SendData(USARTx, 0x0a);
Data ++;
break;
default:
Data ++;
break;
}
}
else if ( *Data == '%')
{
switch ( *++Data )
{
case 's':
s = va_arg(ap, const char *);
for ( ; *s; s++)
{
USART_SendData(USARTx,*s);
while( USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET );
}
Data++;
break;
case 'd':
d = va_arg(ap, int);
itoa(d, buf, 10);
for (s = buf; *s; s++)
{
USART_SendData(USARTx,*s);
while( USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET );
}
Data++;
break;
default:
Data++;
break;
}
} /* end of else if */
else
{
USART_SendData(USARTx, *Data++);
}
while(USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET );
USART_ClearFlag(USART2, USART_FLAG_TC);
USART_ClearITPendingBit(USART2, USART_FLAG_TXE);
}
}
/**---------------------------------------------------------------------- /**----------------------------------------------------------------------
* Function : USART2_Receive * Function : USART2_Receive
* Description : * Description :

View File

@ -28,4 +28,8 @@ void USART2_Send(unsigned char *tx_buf, int len);
*---------------------------------------------------------------------**/ *---------------------------------------------------------------------**/
void USART2_Receive(unsigned char *rx_buf, int len); void USART2_Receive(unsigned char *rx_buf, int len);
void USART2_SendStr(unsigned char *tx_buf);
void PB_USART_printf(USART_TypeDef* USARTx, uint8_t *Data,...);
#endif #endif

View File

@ -47,7 +47,7 @@ void TIM6_IRQHandler(void)
//计算车速左轮和右轮速度和除以2 单位 m/min //计算车速左轮和右轮速度和除以2 单位 m/min
temp3 = (Encoder_Right + Encoder_Left) / 2*600/2496 *0.065*3.1415; temp3 = (Encoder_Right + Encoder_Left) / 2*600/2496 *0.065*3.1415;
sprintf(speed,"%2.2f",temp3); sprintf(speed,"%2.2f",temp3);
OLED_ShowString(48,0, (u8*)speed,16); //OLED显示车速 //OLED_ShowString(48,0, (u8*)speed,16); //OLED显示车速
if(Encoder_Left < 0)//如果电机反转了 if(Encoder_Left < 0)//如果电机反转了
{ {
@ -81,12 +81,12 @@ void TIM6_IRQHandler(void)
showPID(); showPID();
//显示左轮和右轮的输出转速 单位RPM //显示左轮和右轮的输出转速 单位RPM
temp1 = Encoder_Left*600/2496; temp1 = Encoder_Left*600/2496;
OLED_ShowNum(56,2,temp1,3,12); //左轮实际减速箱输出转速 单位RPM //OLED_ShowNum(56,2,temp1,3,12); //左轮实际减速箱输出转速 单位RPM
temp2 = Encoder_Right*600/2496; temp2 = Encoder_Right*600/2496;
OLED_ShowNum(56,3,temp2,3,12); //右轮实际减速箱输出转速 单位RPM //OLED_ShowNum(56,3,temp2,3,12); //右轮实际减速箱输出转速 单位RPM
//设定值显示 //设定值显示
OLED_ShowNum(48,6,SetPoint,3,12); //显示设定的车轮转速 单位RPM //OLED_ShowNum(48,6,SetPoint,3,12); //显示设定的车轮转速 单位RPM
//temp4 = SetPoint*3.1415*0.065; //计算设定的线速度 //temp4 = SetPoint*3.1415*0.065; //计算设定的线速度
//sprintf(set_speed,"%2.2f",temp4); //sprintf(set_speed,"%2.2f",temp4);
//OLED_ShowString(48,7, set_speed,12); //设定的线速度 单位m/min //OLED_ShowString(48,7, set_speed,12); //设定的线速度 单位m/min

View File

@ -12,7 +12,7 @@ void Motor_Init(void)
{ {
GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); /*开启GPIO的外设时钟*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); /*开启GPIO的外设时钟*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; /*选择要控制的GPIO引脚*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; /*选择要控制的GPIO引脚*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /*设置引脚模式为通用推挽输出*/ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /*设置引脚模式为通用推挽输出*/
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /*设置引脚速率为50MHz */ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /*设置引脚速率为50MHz */
GPIO_Init(GPIOB, &GPIO_InitStructure); /*调用库函数初始化GPIO*/ GPIO_Init(GPIOB, &GPIO_InitStructure); /*调用库函数初始化GPIO*/

View File

@ -1,302 +1,302 @@
/******************** (C) COPYRIGHT 2023 GeekRebot ***************************** ///******************** (C) COPYRIGHT 2023 GeekRebot *****************************
* File Name : oled.c //* File Name : oled.c
* Current Version : V1.0 & ST 3.5.0 //* Current Version : V1.0 & ST 3.5.0
* Author : zhanli 719901725@qq.com //* Author : zhanli 719901725@qq.com
* Date of Issued : 2024.01.09 //* Date of Issued : 2024.01.09
* Comments : olediic //* Comments : oled的iic方式驱动
SCL -> PA10SDA -> PA11 // SCL -> PA10SDA -> PA11
********************************************************************************/ //********************************************************************************/
#include "oled.h" //#include "oled.h"
#include "stdlib.h" //#include "stdlib.h"
#include "oledfont.h" //#include "oledfont.h"
#include "delay.h" //#include "delay.h"
#include "bsp_iic.h" //#include "bsp_iic.h"
// OLED的显存 //// OLED的显存
// 存放格式如下. //// 存放格式如下.
//[0]0 1 2 3 ... 127 ////[0]0 1 2 3 ... 127
//[1]0 1 2 3 ... 127 ////[1]0 1 2 3 ... 127
//[2]0 1 2 3 ... 127 ////[2]0 1 2 3 ... 127
//[3]0 1 2 3 ... 127 ////[3]0 1 2 3 ... 127
//[4]0 1 2 3 ... 127 ////[4]0 1 2 3 ... 127
//[5]0 1 2 3 ... 127 ////[5]0 1 2 3 ... 127
//[6]0 1 2 3 ... 127 ////[6]0 1 2 3 ... 127
//[7]0 1 2 3 ... 127 ////[7]0 1 2 3 ... 127
void Write_IIC_Command(unsigned char IIC_Command) //void Write_IIC_Command(unsigned char IIC_Command)
{ //{
IIC_Start(); // IIC_Start();
IIC_Send_Byte(0x78); // Slave address,SA0=0 // IIC_Send_Byte(0x78); // Slave address,SA0=0
IIC_Wait_Ack(); // IIC_Wait_Ack();
IIC_Send_Byte(0x00); // write command // IIC_Send_Byte(0x00); // write command
IIC_Wait_Ack(); // IIC_Wait_Ack();
IIC_Send_Byte(IIC_Command); // IIC_Send_Byte(IIC_Command);
IIC_Wait_Ack(); // IIC_Wait_Ack();
IIC_Stop(); // IIC_Stop();
} //}
/********************************************** ///**********************************************
// IIC Write Data //// IIC Write Data
**********************************************/ //**********************************************/
void Write_IIC_Data(unsigned char IIC_Data) //void Write_IIC_Data(unsigned char IIC_Data)
{ //{
IIC_Start(); // IIC_Start();
IIC_Send_Byte(0x78); // D/C#=0; R/W#=0 // IIC_Send_Byte(0x78); // D/C#=0; R/W#=0
IIC_Wait_Ack(); // IIC_Wait_Ack();
IIC_Send_Byte(0x40); // write data // IIC_Send_Byte(0x40); // write data
IIC_Wait_Ack(); // IIC_Wait_Ack();
IIC_Send_Byte(IIC_Data); // IIC_Send_Byte(IIC_Data);
IIC_Wait_Ack(); // IIC_Wait_Ack();
IIC_Stop(); // IIC_Stop();
} //}
void OLED_WR_Byte(unsigned dat, unsigned cmd) //void OLED_WR_Byte(unsigned dat, unsigned cmd)
{ //{
if (cmd) // if (cmd)
{ // {
Write_IIC_Data(dat); // Write_IIC_Data(dat);
} // }
else // else
{ // {
Write_IIC_Command(dat); // Write_IIC_Command(dat);
} // }
} //}
/******************************************** ///********************************************
// fill_Picture //// fill_Picture
********************************************/ //********************************************/
void fill_picture(unsigned char fill_Data) //void fill_picture(unsigned char fill_Data)
{ //{
unsigned char m, n; // unsigned char m, n;
for (m = 0; m < 8; m++) // for (m = 0; m < 8; m++)
{ // {
OLED_WR_Byte(0xb0 + m, 0); // page0-page1 // OLED_WR_Byte(0xb0 + m, 0); // page0-page1
OLED_WR_Byte(0x00, 0); // low column start address // OLED_WR_Byte(0x00, 0); // low column start address
OLED_WR_Byte(0x10, 0); // high column start address // OLED_WR_Byte(0x10, 0); // high column start address
for (n = 0; n < 128; n++) // for (n = 0; n < 128; n++)
{ // {
OLED_WR_Byte(fill_Data, 1); // OLED_WR_Byte(fill_Data, 1);
} // }
} // }
} //}
/***********************Delay****************************************/ ///***********************Delay****************************************/
void Delay_50ms(unsigned int Del_50ms) //void Delay_50ms(unsigned int Del_50ms)
{ //{
unsigned int m; // unsigned int m;
for (; Del_50ms > 0; Del_50ms--) // for (; Del_50ms > 0; Del_50ms--)
for (m = 6245; m > 0; m--); // for (m = 6245; m > 0; m--);
} //}
void Delay_1ms(unsigned int Del_1ms) //void Delay_1ms(unsigned int Del_1ms)
{ //{
unsigned char j; // unsigned char j;
while (Del_1ms--) // while (Del_1ms--)
{ // {
for (j = 0; j < 123; j++); // for (j = 0; j < 123; j++);
} // }
} //}
// 坐标设置 //// 坐标设置
void OLED_Set_Pos(unsigned char x, unsigned char y) //void OLED_Set_Pos(unsigned char x, unsigned char y)
{ //{
OLED_WR_Byte(0xb0 + y, OLED_CMD); // OLED_WR_Byte(0xb0 + y, OLED_CMD);
OLED_WR_Byte(((x & 0xf0) >> 4) | 0x10, OLED_CMD); // OLED_WR_Byte(((x & 0xf0) >> 4) | 0x10, OLED_CMD);
OLED_WR_Byte((x & 0x0f), OLED_CMD); // OLED_WR_Byte((x & 0x0f), OLED_CMD);
} //}
// 开启OLED显示 //// 开启OLED显示
void OLED_Display_On(void) //void OLED_Display_On(void)
{ //{
OLED_WR_Byte(0X8D, OLED_CMD); // SET DCDC命令 // OLED_WR_Byte(0X8D, OLED_CMD); // SET DCDC命令
OLED_WR_Byte(0X14, OLED_CMD); // DCDC ON // OLED_WR_Byte(0X14, OLED_CMD); // DCDC ON
OLED_WR_Byte(0XAF, OLED_CMD); // DISPLAY ON // OLED_WR_Byte(0XAF, OLED_CMD); // DISPLAY ON
} //}
// 关闭OLED显示 //// 关闭OLED显示
void OLED_Display_Off(void) //void OLED_Display_Off(void)
{ //{
OLED_WR_Byte(0X8D, OLED_CMD); // SET DCDC命令 // OLED_WR_Byte(0X8D, OLED_CMD); // SET DCDC命令
OLED_WR_Byte(0X10, OLED_CMD); // DCDC OFF // OLED_WR_Byte(0X10, OLED_CMD); // DCDC OFF
OLED_WR_Byte(0XAE, OLED_CMD); // DISPLAY OFF // OLED_WR_Byte(0XAE, OLED_CMD); // DISPLAY OFF
} //}
// 清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样!!! //// 清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样!!!
void OLED_Clear(void) //void OLED_Clear(void)
{ //{
u8 i, n; // u8 i, n;
for (i = 0; i < 8; i++) // for (i = 0; i < 8; i++)
{ // {
OLED_WR_Byte(0xb0 + i, OLED_CMD); // 设置页地址0~7 // OLED_WR_Byte(0xb0 + i, OLED_CMD); // 设置页地址0~7
OLED_WR_Byte(0x00, OLED_CMD); // 设置显示位置—列低地址 // OLED_WR_Byte(0x00, OLED_CMD); // 设置显示位置—列低地址
OLED_WR_Byte(0x10, OLED_CMD); // 设置显示位置—列高地址 // OLED_WR_Byte(0x10, OLED_CMD); // 设置显示位置—列高地址
for (n = 0; n < 128; n++) // for (n = 0; n < 128; n++)
OLED_WR_Byte(0, OLED_DATA); // OLED_WR_Byte(0, OLED_DATA);
} // 更新显示 // } // 更新显示
} //}
void OLED_On(void) //void OLED_On(void)
{ //{
u8 i, n; // u8 i, n;
for (i = 0; i < 8; i++) // for (i = 0; i < 8; i++)
{ // {
OLED_WR_Byte(0xb0 + i, OLED_CMD); // 设置页地址0~7 // OLED_WR_Byte(0xb0 + i, OLED_CMD); // 设置页地址0~7
OLED_WR_Byte(0x00, OLED_CMD); // 设置显示位置—列低地址 // OLED_WR_Byte(0x00, OLED_CMD); // 设置显示位置—列低地址
OLED_WR_Byte(0x10, OLED_CMD); // 设置显示位置—列高地址 // OLED_WR_Byte(0x10, OLED_CMD); // 设置显示位置—列高地址
for (n = 0; n < 128; n++) // for (n = 0; n < 128; n++)
OLED_WR_Byte(1, OLED_DATA); // OLED_WR_Byte(1, OLED_DATA);
} // 更新显示 // } // 更新显示
} //}
// 在指定位置显示一个字符,包括部分字符 //// 在指定位置显示一个字符,包括部分字符
// x:0~127 //// x:0~127
// y:0~63 //// y:0~63
// mode:0,反白显示;1,正常显示 //// mode:0,反白显示;1,正常显示
// size:选择字体 16/12 //// size:选择字体 16/12
void OLED_ShowChar(u8 x, u8 y, u8 chr, u8 Char_Size) //void OLED_ShowChar(u8 x, u8 y, u8 chr, u8 Char_Size)
{ //{
unsigned char c = 0, i = 0; // unsigned char c = 0, i = 0;
c = chr - ' '; // 得到偏移后的值 // c = chr - ' '; // 得到偏移后的值
if (x > Max_Column - 1) // if (x > Max_Column - 1)
{ // {
x = 0; // x = 0;
y = y + 2; // y = y + 2;
} // }
if (Char_Size == 16) // if (Char_Size == 16)
{ // {
OLED_Set_Pos(x, y); // OLED_Set_Pos(x, y);
for (i = 0; i < 8; i++) // for (i = 0; i < 8; i++)
OLED_WR_Byte(F8X16[c * 16 + i], OLED_DATA); // OLED_WR_Byte(F8X16[c * 16 + i], OLED_DATA);
OLED_Set_Pos(x, y + 1); // OLED_Set_Pos(x, y + 1);
for (i = 0; i < 8; i++) // for (i = 0; i < 8; i++)
OLED_WR_Byte(F8X16[c * 16 + i + 8], OLED_DATA); // OLED_WR_Byte(F8X16[c * 16 + i + 8], OLED_DATA);
} // }
else // else
{ // {
OLED_Set_Pos(x, y); // OLED_Set_Pos(x, y);
for (i = 0; i < 6; i++) // for (i = 0; i < 6; i++)
OLED_WR_Byte(F6x8[c][i], OLED_DATA); // OLED_WR_Byte(F6x8[c][i], OLED_DATA);
} // }
} //}
// m^n函数 //// m^n函数
u32 oled_pow(u8 m, u8 n) //u32 oled_pow(u8 m, u8 n)
{ //{
u32 result = 1; // u32 result = 1;
while (n--) // while (n--)
result *= m; // result *= m;
return result; // return result;
} //}
// 显示2个数字 //// 显示2个数字
// x,y :起点坐标 //// x,y :起点坐标
// len :数字的位数 //// len :数字的位数
// size:字体大小 //// size:字体大小
// mode:模式 0,填充模式;1,叠加模式 //// mode:模式 0,填充模式;1,叠加模式
// num:数值(0~4294967295); //// num:数值(0~4294967295);
void OLED_ShowNum(u8 x, u8 y, u32 num, u8 len, u8 size2) //void OLED_ShowNum(u8 x, u8 y, u32 num, u8 len, u8 size2)
{ //{
u8 t, temp; // u8 t, temp;
u8 enshow = 0; // u8 enshow = 0;
for (t = 0; t < len; t++) // for (t = 0; t < len; t++)
{ // {
temp = (num / oled_pow(10, len - t - 1)) % 10; // temp = (num / oled_pow(10, len - t - 1)) % 10;
if (enshow == 0 && t < (len - 1)) // if (enshow == 0 && t < (len - 1))
{ // {
if (temp == 0) // if (temp == 0)
{ // {
OLED_ShowChar(x + (size2 / 2) * t, y, ' ', size2); // OLED_ShowChar(x + (size2 / 2) * t, y, ' ', size2);
continue; // continue;
} // }
else // else
enshow = 1; // enshow = 1;
} // }
OLED_ShowChar(x + (size2 / 2) * t, y, temp + '0', size2); // OLED_ShowChar(x + (size2 / 2) * t, y, temp + '0', size2);
} // }
} //}
// 显示一个字符号串 //// 显示一个字符号串
void OLED_ShowString(u8 x, u8 y, u8 *chr, u8 Char_Size) //void OLED_ShowString(u8 x, u8 y, u8 *chr, u8 Char_Size)
{ //{
unsigned char j = 0; // unsigned char j = 0;
while (chr[j] != '\0') // while (chr[j] != '\0')
{ // {
OLED_ShowChar(x, y, chr[j], Char_Size); // OLED_ShowChar(x, y, chr[j], Char_Size);
x += 8; // x += 8;
if (x > 120) // if (x > 120)
{ // {
x = 0; // x = 0;
y += 2; // y += 2;
} // }
j++; // j++;
} // }
} //}
// 显示汉字 //// 显示汉字
void OLED_ShowCHinese(u8 x, u8 y, u8 no) //void OLED_ShowCHinese(u8 x, u8 y, u8 no)
{ //{
u8 t, adder = 0; // u8 t, adder = 0;
OLED_Set_Pos(x, y); // OLED_Set_Pos(x, y);
for (t = 0; t < 16; t++) // for (t = 0; t < 16; t++)
{ // {
OLED_WR_Byte(Hzk[2 * no][t], OLED_DATA); // OLED_WR_Byte(Hzk[2 * no][t], OLED_DATA);
adder += 1; // adder += 1;
} // }
OLED_Set_Pos(x, y + 1); // OLED_Set_Pos(x, y + 1);
for (t = 0; t < 16; t++) // for (t = 0; t < 16; t++)
{ // {
OLED_WR_Byte(Hzk[2 * no + 1][t], OLED_DATA); // OLED_WR_Byte(Hzk[2 * no + 1][t], OLED_DATA);
adder += 1; // adder += 1;
} // }
} //}
/***********功能描述显示显示BMP图片128×64起始点坐标(x,y),x的范围0127y为页的范围07*****************/ ///***********功能描述显示显示BMP图片128×64起始点坐标(x,y),x的范围0127y为页的范围07*****************/
void OLED_DrawBMP(unsigned char x0, unsigned char y0, unsigned char x1, unsigned char y1, unsigned char BMP[]) //void OLED_DrawBMP(unsigned char x0, unsigned char y0, unsigned char x1, unsigned char y1, unsigned char BMP[])
{ //{
unsigned int j = 0; // unsigned int j = 0;
unsigned char x, y; // unsigned char x, y;
if (y1 % 8 == 0) // if (y1 % 8 == 0)
y = y1 / 8; // y = y1 / 8;
else // else
y = y1 / 8 + 1; // y = y1 / 8 + 1;
for (y = y0; y < y1; y++) // for (y = y0; y < y1; y++)
{ // {
OLED_Set_Pos(x0, y); // OLED_Set_Pos(x0, y);
for (x = x0; x < x1; x++) // for (x = x0; x < x1; x++)
{ // {
OLED_WR_Byte(BMP[j++], OLED_DATA); // OLED_WR_Byte(BMP[j++], OLED_DATA);
} // }
} // }
} //}
// 初始化SSD1306 //// 初始化SSD1306
void OLED_Init(void) //void OLED_Init(void)
{ //{
IIC_Init(); // IIC_Init();
Delay_ms(800); // Delay_ms(800);
OLED_WR_Byte(0xAE, OLED_CMD); // Display off // OLED_WR_Byte(0xAE, OLED_CMD); // Display off
OLED_WR_Byte(0x00, OLED_CMD); // set low column address // OLED_WR_Byte(0x00, OLED_CMD); // set low column address
OLED_WR_Byte(0x10, OLED_CMD); // set high column address // OLED_WR_Byte(0x10, OLED_CMD); // set high column address
OLED_WR_Byte(0x40, OLED_CMD); // set start line address // OLED_WR_Byte(0x40, OLED_CMD); // set start line address
OLED_WR_Byte(0xB0, OLED_CMD); // set page address // OLED_WR_Byte(0xB0, OLED_CMD); // set page address
OLED_WR_Byte(0x81, OLED_CMD); // contract control // OLED_WR_Byte(0x81, OLED_CMD); // contract control
OLED_WR_Byte(0xFF, OLED_CMD); // 128 // OLED_WR_Byte(0xFF, OLED_CMD); // 128
OLED_WR_Byte(0xA1, OLED_CMD); // set segment remap // OLED_WR_Byte(0xA1, OLED_CMD); // set segment remap
OLED_WR_Byte(0xA6, OLED_CMD); // normal / reverse // OLED_WR_Byte(0xA6, OLED_CMD); // normal / reverse
OLED_WR_Byte(0xA8, OLED_CMD); // set multiplex ratio(1 to 64) // OLED_WR_Byte(0xA8, OLED_CMD); // set multiplex ratio(1 to 64)
OLED_WR_Byte(0x3F, OLED_CMD); // 1/32 duty // OLED_WR_Byte(0x3F, OLED_CMD); // 1/32 duty
OLED_WR_Byte(0xC8, OLED_CMD); // Com scan direction // OLED_WR_Byte(0xC8, OLED_CMD); // Com scan direction
OLED_WR_Byte(0xD3, OLED_CMD); // Set display offset // OLED_WR_Byte(0xD3, OLED_CMD); // Set display offset
OLED_WR_Byte(0x00, OLED_CMD); // OLED_WR_Byte(0x00, OLED_CMD);
OLED_WR_Byte(0xD5, OLED_CMD); // set osc division // OLED_WR_Byte(0xD5, OLED_CMD); // set osc division
OLED_WR_Byte(0x80, OLED_CMD); // // OLED_WR_Byte(0x80, OLED_CMD); //
OLED_WR_Byte(0xD8, OLED_CMD); // set area color mode off // OLED_WR_Byte(0xD8, OLED_CMD); // set area color mode off
OLED_WR_Byte(0x05, OLED_CMD); // // OLED_WR_Byte(0x05, OLED_CMD); //
OLED_WR_Byte(0xD9, OLED_CMD); // Set Pre-Charge Period // OLED_WR_Byte(0xD9, OLED_CMD); // Set Pre-Charge Period
OLED_WR_Byte(0xF1, OLED_CMD); // // OLED_WR_Byte(0xF1, OLED_CMD); //
OLED_WR_Byte(0xDA, OLED_CMD); // set com pin configuartion // OLED_WR_Byte(0xDA, OLED_CMD); // set com pin configuartion
OLED_WR_Byte(0x12, OLED_CMD); // // OLED_WR_Byte(0x12, OLED_CMD); //
OLED_WR_Byte(0xDB, OLED_CMD); // set Vcomh // OLED_WR_Byte(0xDB, OLED_CMD); // set Vcomh
OLED_WR_Byte(0x30, OLED_CMD); // // OLED_WR_Byte(0x30, OLED_CMD); //
OLED_WR_Byte(0x8D, OLED_CMD); // set charge pump enable // OLED_WR_Byte(0x8D, OLED_CMD); // set charge pump enable
OLED_WR_Byte(0x14, OLED_CMD); // OLED_WR_Byte(0x14, OLED_CMD);
OLED_WR_Byte(0xAF, OLED_CMD); // turn on oled panel // OLED_WR_Byte(0xAF, OLED_CMD); // turn on oled panel
} //}

View File

@ -15,19 +15,19 @@ float Derivative = 0; // ΢
//显示pid参数到OLED上 //显示pid参数到OLED上
void showPID(void) void showPID(void)
{ {
float temp1,temp2,temp3; // float temp1,temp2,temp3;
char PID_P[3],PID_I[3],PID_D[3]; // char PID_P[3],PID_I[3],PID_D[3];
temp1 = Proportion; // temp1 = Proportion;
sprintf(PID_P,"%1.1f",temp1); // sprintf(PID_P,"%1.1f",temp1);
OLED_ShowString(16,4, (u8*)PID_P,16); // OLED_ShowString(16,4, (u8*)PID_P,16);
temp2 = Integral; // temp2 = Integral;
sprintf(PID_I,"%1.1f",temp2); // sprintf(PID_I,"%1.1f",temp2);
OLED_ShowString(56,4, (u8*)PID_I,16); // OLED_ShowString(56,4, (u8*)PID_I,16);
temp3 = Derivative; // temp3 = Derivative;
sprintf(PID_D,"%1.1f",temp3); // sprintf(PID_D,"%1.1f",temp3);
OLED_ShowString(104,4, (u8*)PID_D,16); // OLED_ShowString(104,4, (u8*)PID_D,16);
} }
/********************增量式PID控制设计************************************/ /********************增量式PID控制设计************************************/

File diff suppressed because it is too large Load Diff

View File

@ -565,11 +565,11 @@ ARM Macro Assembler Page 9
00000000 00000000
Command Line: --debug --xref --diag_suppress=9931 --cpu=Cortex-M3 --apcs=interw Command Line: --debug --xref --diag_suppress=9931 --cpu=Cortex-M3 --apcs=interw
ork --depend=..\output\startup_stm32f10x_hd.d -o..\output\startup_stm32f10x_hd. ork --depend=..\output\startup_stm32f10x_hd.d -o..\output\startup_stm32f10x_hd.
o -I"D:\Hardware Project\GeBalanceBot\GeBalanceBot_Firmware v1.0\Project\RTE" - o -I"E:\HardwareProject\GeBalanceBot\GeBalanceBot_Firmware v1.0\Project\RTE" -I
I"D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include" -I" "D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include" -I"D
D:\Program Files\Keilv5\ARM\CMSIS\Include" --predefine="__UVISION_VERSION SETA :\Program Files\Keilv5\ARM\CMSIS\Include" --predefine="__UVISION_VERSION SETA 5
521" --predefine="STM32F10X_HD SETA 1" --list=..\listing\startup_stm32f10x_hd.l 21" --predefine="STM32F10X_HD SETA 1" --list=..\listing\startup_stm32f10x_hd.ls
st ..\Libraries\CMSIS\startup\startup_stm32f10x_hd.s t ..\Libraries\CMSIS\startup\startup_stm32f10x_hd.s

View File

@ -1,5 +1,7 @@
#include "MPU6050.h" #include "MPU6050.h"
#include "bluetooth.h"
#include "IOI2C.h" #include "IOI2C.h"
#include "oled.h"
#define PRINT_ACCEL (0x01) #define PRINT_ACCEL (0x01)
#define PRINT_GYRO (0x02) #define PRINT_GYRO (0x02)
#define PRINT_QUAT (0x04) #define PRINT_QUAT (0x04)
@ -73,7 +75,10 @@ static void run_self_test(void)
accel[1] *= accel_sens; accel[1] *= accel_sens;
accel[2] *= accel_sens; accel[2] *= accel_sens;
dmp_set_accel_bias(accel); dmp_set_accel_bias(accel);
printf("setting bias succesfully ......\r\n"); //printf("setting bias succesfully ......\r\n");
PB_USART_printf(USART2, (u8*)"setting bias succesfully ......\r\n");
}else{
PB_USART_printf(USART2, (u8*)"Fail..\r\n");
} }
} }
@ -287,12 +292,15 @@ Output : none
**************************************************************************/ **************************************************************************/
void MPU6050_initialize(void) void MPU6050_initialize(void)
{ {
PB_USART_printf(USART2, (u8*)"run_self_test..\r\n");
run_self_test();
MPU6050_setClockSource(MPU6050_CLOCK_PLL_YGYRO); // 设置时钟 MPU6050_setClockSource(MPU6050_CLOCK_PLL_YGYRO); // 设置时钟
MPU6050_setFullScaleGyroRange(MPU6050_GYRO_FS_2000); // 陀螺仪量程设置 MPU6050_setFullScaleGyroRange(MPU6050_GYRO_FS_2000); // 陀螺仪量程设置
MPU6050_setFullScaleAccelRange(MPU6050_ACCEL_FS_2); // 加速度度最大量程 +-2G MPU6050_setFullScaleAccelRange(MPU6050_ACCEL_FS_2); // 加速度度最大量程 +-2G
MPU6050_setSleepEnabled(0); // 进入工作状态 MPU6050_setSleepEnabled(0); // 进入工作状态
MPU6050_setI2CMasterModeEnabled(0); // 不让MPU6050 控制AUXI2C MPU6050_setI2CMasterModeEnabled(0); // 不让MPU6050 控制AUXI2C
MPU6050_setI2CBypassEnabled(0); // 主控制器的I2C与 MPU6050的AUXI2C 直通关闭 MPU6050_setI2CBypassEnabled(0); // 主控制器的I2C与 MPU6050的AUXI2C 直通关闭
} }
/************************************************************************** /**************************************************************************
@ -307,8 +315,13 @@ void DMP_Init(void)
{ {
u8 temp[1] = {0}; u8 temp[1] = {0};
i2cRead(0x68, 0x75, 1, temp); i2cRead(0x68, 0x75, 1, temp);
if (temp[0] != 0x68) if (temp[0] != 0x68){
NVIC_SystemReset(); //NVIC_SystemReset();
PB_USART_printf(USART2, (u8*)"who am i %d\r\n", (int)temp[0]);
}else{
}
if (!mpu_init()) if (!mpu_init())
{ {
if (!mpu_set_sensors(INV_XYZ_GYRO | INV_XYZ_ACCEL)) if (!mpu_set_sensors(INV_XYZ_GYRO | INV_XYZ_ACCEL))

View File

@ -353,18 +353,24 @@
#define MPU6050_WHO_AM_I_BIT 6 #define MPU6050_WHO_AM_I_BIT 6
#define MPU6050_WHO_AM_I_LENGTH 6 #define MPU6050_WHO_AM_I_LENGTH 6
extern short gyro[3], accel[3]; extern short gyro[3], accel[3];
extern int16_t Gx_offset,Gy_offset,Gz_offset; extern int16_t Gx_offset,Gy_offset,Gz_offset;
extern float Acc1G_Values; extern float Acc1G_Values;
extern float Roll,Pitch; extern float Roll,Pitch;
//供外部调用的API //供外部调用的API
void MPU6050_initialize(void); //初始化 void MPU6050_initialize(void);
uint8_t MPU6050_testConnection(void); //检测MPU6050是否存在 // 检测MPU6050是否存在
uint8_t MPU6050_testConnection(void);
//读取ADC值 //读取ADC值
void MPU6050_getMotion6(int16_t* ax, int16_t* ay, int16_t* az, int16_t* gx, int16_t* gy, int16_t* gz); void MPU6050_getMotion6(int16_t* ax, int16_t* ay, int16_t* az, int16_t* gx, int16_t* gy, int16_t* gz);
void MPU6050_getlastMotion6(int16_t* ax, int16_t* ay, void MPU6050_getlastMotion6(int16_t* ax, int16_t* ay,
int16_t* az, int16_t* gx, int16_t* gy, int16_t* gz); int16_t* az, int16_t* gx, int16_t* gy, int16_t* gz);
uint8_t MPU6050_getDeviceID(void); //读取MPU6050的ID uint8_t MPU6050_getDeviceID(void); //读取MPU6050的ID
void MPU6050_InitGyro_Offset(void);// 初始化陀螺仪偏置 void MPU6050_InitGyro_Offset(void);// 初始化陀螺仪偏置
void DMP_Init(void); void DMP_Init(void);
void Read_DMP(void); void Read_DMP(void);

View File

@ -15,33 +15,33 @@
*---------------------------------------------------------------------**/ *---------------------------------------------------------------------**/
void oled_show(void) void oled_show(void)
{ {
// 显示屏打开 // // 显示屏打开
OLED_Display_On(); // OLED_Display_On();
// 第一行显示小车模式 // // 第一行显示小车模式
OLED_ShowString(0,0,"DMP",12); // OLED_ShowString(0,0,"DMP",12);
OLED_ShowString(60,0,"Normal",12); // OLED_ShowString(60,0,"Normal",12);
// 第三行显示编码器1 // // 第三行显示编码器1
OLED_ShowString(00,20,"EncoLEFT",12); // OLED_ShowString(00,20,"EncoLEFT",12);
if( Encoder_Left<0){ // if( Encoder_Left<0){
OLED_ShowString(80,20,"-",12); // OLED_ShowString(80,20,"-",12);
OLED_ShowNum(95,20,-Encoder_Left,3,12); // OLED_ShowNum(95,20,-Encoder_Left,3,12);
}else{ // }else{
OLED_ShowString(80,20,"+",12); // OLED_ShowString(80,20,"+",12);
OLED_ShowNum(95,20, Encoder_Left,3,12); // OLED_ShowNum(95,20, Encoder_Left,3,12);
} // }
//
// 第四行显示编码器2 // // 第四行显示编码器2
OLED_ShowString(00,30,"EncoRIGHT",12); // OLED_ShowString(00,30,"EncoRIGHT",12);
if(Encoder_Right<0){ // if(Encoder_Right<0){
OLED_ShowString(80,30,"-",12); // OLED_ShowString(80,30,"-",12);
OLED_ShowNum(95,30,-Encoder_Right,3,12); // OLED_ShowNum(95,30,-Encoder_Right,3,12);
}else{ // }else{
OLED_ShowString(80,30,"+",12); // OLED_ShowString(80,30,"+",12);
OLED_ShowNum(95,30, Encoder_Right,3,12); // OLED_ShowNum(95,30, Encoder_Right,3,12);
} // }
//
// 第六行显示角度 // // 第六行显示角度
OLED_ShowString(0,50,"Angle",12); // OLED_ShowString(0,50,"Angle",12);
// if(Angle_Balance < 0){ // if(Angle_Balance < 0){
// OLED_ShowString(48,50,"-",12); // OLED_ShowString(48,50,"-",12);
// } // }

File diff suppressed because it is too large Load Diff

View File

@ -8,7 +8,7 @@
#include "bsp_sys.h" #include "bsp_sys.h"
#include "stdio.h" #include "stdio.h"
#include "bluetooth.h" #include "bluetooth.h"
#include "MPU6050.h"
unsigned char BLE_RX[64]; unsigned char BLE_RX[64];
/**---------------------------------------------------------------------- /**----------------------------------------------------------------------
* Function : main * Function : main
@ -20,14 +20,17 @@ int main(void)
{ {
System_Init(); System_Init();
Bluetooth_Init(9600); Bluetooth_Init(9600);
PB_USART_printf(USART2, (u8*)"Init Blue tooth..\r\n");
Car_Stop(); Car_Stop();
IIC_Init();
PB_USART_printf(USART2, (u8*)"MPU6050_initialize..\r\n");
MPU6050_initialize();
DMP_Init();
while (1) while (1)
{ {
Delay_ms(20); Delay_ms(10);
USART2_Receive(BLE_RX, 6); USART2_Receive(BLE_RX, 6);
USART2_Send(BLE_RX, 6);
//Delay_ms(500);
if((BLE_RX[3] == 0xB1)&&(BLE_RX[4]==0xB5)) if((BLE_RX[3] == 0xB1)&&(BLE_RX[4]==0xB5))
{ {