/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file : main.c
* @brief : Main program body
******************************************************************************
* @attention
*
* Copyright (c) 2024 STMicroelectronics.
* All rights reserved.
*
* This software is licensed under terms that can be found in the LICENSE file
* in the root directory of this software component.
* If no LICENSE file comes with this software, it is provided AS-IS.
*
******************************************************************************
*/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "i2c.h"
#include "tim.h"
#include "usart.h"
#include "gpio.h"
#define EEPROM_ADDR 0x08080000 // 自定义存储地址(需避开程序区)
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "oled.h"
#include "IIC.h"
#include "inv_mpu.h"
#include "inv_mpu_dmp_motion_driver.h"
#include "mpu6050.h"
#include "stdio.h"
#include "sr04.h"
#include "motor.h"
#include "encoder.h"
#include "pid.h"
#include "run.h"
#include "xunji.h"
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
/* USER CODE END PTD */
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */
/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
/* USER CODE END PM */
/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV */
extern int Encoder_Left,Encoder_Right;
extern float roll,yaw,jiaosuduz;
uint8_t display_buf[20];
uint32_t sys_tick;
extern float distance;
float speed1,speed2;
float distance1=(0.065*3.14)/11;
float Tdistance;
float ABCD_location[4];
int t=0;
static u8_i;
uint8_t rx_buf[1];
uint8_t rx_data;
uint8_t flag;
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
void Read(void);
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
void Read(void);
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
void Read(void);
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
void Read(void);
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
void Read(void);
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
void Read(void);
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
void Read(void);
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
void Read(void);
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
void Read(void);
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
void Read(void);
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
void Read(void);
volatile uint32_t seconds=0;
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
/* USER CODE END PFP */
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
/* USER CODE END 0 */
//void save_distance_to_eeprom(float distance)
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_I2C1_Init();
MX_TIM3_Init();
MX_TIM1_Init();
MX_TIM2_Init();
MX_TIM4_Init();
MX_USART1_UART_Init();
MX_USART3_UART_Init();
/* USER CODE BEGIN 2 */
OLED_Init();
OLED_Clear();
MPU_Init();
xunji_Init();
mpu_dmp_init();
//OLED_ShowString(0,00,"Init Sucess",16);
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_4);
HAL_TIM_Encoder_Start(&htim2,TIM_CHANNEL_ALL);
HAL_TIM_Encoder_Start(&htim4,TIM_CHANNEL_ALL);
HAL_UART_Receive_IT(&huart1,rx_buf,1);
// HAL_NVIC_SetPriority( USART1_IRQn , 1, 0);
// HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);
// HAL_NVIC_SetPriority( TIM1_CC_IRQn , 2, 0);
// HAL_NVIC_SetPriority( TIM1_CC_IRQn , 2, 0);
// HAL_NVIC_SetPriority( TIM1_CC_IRQn , 2, 0);
// Load(2000,2000);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
Read();
//OLED_ShowString(0, 1, "speed1:", 12); // ��ʾ�ٶ��ַ���
//OLED_ShowString(0, 3, "speed2:", 12); // ��ʾ�ٶ��ַ���
// sprintf((char *)display_buf,"Encoder_L:%d ",-Encoder_Left);
// OLED_ShowString(0,4,display_buf,16);
// sprintf((char *)display_buf,"Encoder_R:%d ",-Encoder_Right);
// OLED_ShowString(0,6,display_buf,16);
// speed1=-(Encoder_Left/11)*60;
// char speedStr[16];
// sprintf(speedStr, "%.2f", speed1); // ��������ת��Ϊ�ַ�����������λС��
// OLED_ShowString(0, 1, (char*)speedStr, 12); // ��ʾ�ٶ��ַ���
// speed2=-(Encoder_Right/11)*60;
// char speedStr2[16];
// sprintf(speedStr2, "%.2f", speed2);
// OLED_ShowString(0, 2, (char*)speedStr2, 12); // ��ʾ�ٶ��ַ���
// Tdistance+=(Encoder_Left+Encoder_Right)*distance1;
// char display_buf[16];
// sprintf(display_buf, "Tdistance: %.4f m",-0.01*Tdistance ); // ������λС��
// OLED_ShowString(0, 3, display_buf, 12);
//OLED_ShowString(0, 1, "speed1:", 12); // ÏÔʾËÙ¶È×Ö·û´®
//OLED_ShowString(0, 3, "speed2:", 12); // ÏÔʾËÙ¶È×Ö·û´®
seconds++;
HAL_Delay(1000);
char buffer[20];
sprintf(buffer, "Time: %02lu:%02lu", (seconds / 60) % 60, seconds % 60);
OLED_ShowString(0, 0, buffer, 12); // 假设OLED_ShowString是用于显示字符串的函数
// if(out1() == 0&&out2() == 0&&out3() == 0&&out4() == 1&&out1() == 1&&out2() == 1&&out3() == 1&&out4() ==0&&out1() == 0&&out2() == 0&&out3() == 1&&out4() == 1)
// {
// t++;
// seconds==0;
// }
// if(t==4)
// {
// car_stop();
// }
//
// OLED_ShowString(0, 4,"t=", 12);
sprintf((char *)display_buf,"Encoder_L:%d ",Encoder_Left);
// OLED_ShowString(0,4,display_buf,16);
sprintf((char *)display_buf,"Encoder_R:%d ",Encoder_Right);
// OLED_ShowString(0,6,display_buf,16);
speed1=-(Encoder_Left/11)*60;
char speedStr[16];
sprintf(speedStr, "%.2f", speed1);
// OLED_ShowString(0, 1, (char*)speedStr, 12);
speed2=-(Encoder_Right/11)*60;
char speedStr2[16];
sprintf(speedStr2, "%.2f", speed2);
// OLED_ShowString(0, 2, (char*)speedStr2, 12);
Tdistance+=(Encoder_Left+Encoder_Right)*distance1;
char display_buf[16];
sprintf(display_buf, "Tdistance: %.2fm",10+0.01*Tdistance*0.5);
OLED_ShowString(0, 3, display_buf, 12);
OLED_ShowString(0, 2, i, 12);
// #define EEPROM_ADDR 0x08080000 // 自定义存储地址(需避开程序区)
// 读取距离
// float Tdistance(void)
// {
// return *(float*)EEPROM_ADDR;
//}
if(out1() == 0&&out2() == 1&&out3() == 1&&out4()||out1() == 0&&out2() == 0&&out3() == 1&&out4())
{
ABCD_location[i++]=Tdistance;
HAL_Delay(20);
}
//// 保存距离
//{
// HAL_FLASH_Erase Sector;
// HAL_FLASH_Erase(&Sector, EEPROM_ADDR); // 擦除扇区
// HAL_FLASH_Program(FLASH_TYPEPROGRAM_FLOAT, EEPROM_ADDR, distance); // 写入浮点数
//}
//
// sprintf((char *)display_buf,"Encoder_L:%d ",-Encoder_Left);
// OLED_ShowString(0,4,display_buf,16);
// sprintf((char *)display_buf,"Encoder_R:%d ",-Encoder_Right);
// OLED_ShowString(0,6,display_buf,16);
// sprintf((char *)display_buf,"jiaosuduz:%.1f ",jiaosuduz); //俯仰角
// OLED_ShowString(4,4,display_buf,16);
// sprintf((char *)display_buf,"roll:%.1f ",roll); //翻滚角
// OLED_ShowString(4,6,display_buf,16);
// sprintf((char *)display_buf,"yaw:%.1f ",yaw); //偏航角
// OLED_ShowString(4,8,display_buf,16);
//Load(-800,-800);
xunji();
// HAL_Delay(2500);
// if(out1() == 0&&out2() == 0&&out3() == 1&&out4() == 1)
// {
// car_stop();
// HAL_Delay(100);
// car_right_go1();
// HAL_Delay(1300);
// car_stop();
// HAL_Delay(100);
// }
//
//
// else
// {
// xunji();
// }
//
// Load(1200,800);
// HAL_Delay(1500);
// car_stop();
// HAL_Delay(50);
// car_right_go1();
// HAL_Delay(910);
// car_stop();
// HAL_Delay(50);
// Load(500,1300);
// HAL_Delay(100);
// Load(-1150,-1300);
// Load(-1200,1200);//cuo右轮不能负
// car_go();
// HAL_Delay(10000);
// car_right_go1();
// HAL_Delay(830);
// car_stop();
// HAL_Delay(50);
//
//
// car_go();
// HAL_Delay(1000);
// Load(900,800);
// HAL_Delay(4000);
// car_right_go1();
// HAL_Delay(950);
// car_stop();
// HAL_Delay(50);
// void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
//{
//}
// if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_4))
// {
//
// }
////
// if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_5))
// {
////
// }
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if (huart==&huart1) // å‡è®¾ä½¿ç”¨çš„æ˜¯ huart1ï¼Œæ ¹æ®å®žé™…串å£å¥æŸ„修改
{ rx_data=rx_buf[0];
//rx_data=rx_data-'0';
HAL_UART_Receive_IT(huart, rx_buf, 1);
// HAL_UART_Transmit_IT(&huart2, rx_buf, 2);
// 在æ¤å¤„æ·»åŠ æŽ¥æ”¶å®ŒæˆåŽçš„处ç†é€»è¾‘ï¼Œä¾‹å¦‚é‡æ–°å¯åŠ¨æŽ¥æ”¶ä¸æ–
OLED_ShowNum(1,1,rx_data,4,16);
// 釿–°å¯åŠ¨æŽ¥æ”¶ä¸æ–,以便æŒç»æŽ¥æ”¶
}
}
/* USER CODE END 3 */
/**
* @brief System Clock Configuration
* @retval None
*/
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
/** Initializes the RCC Oscillators according to the specified parameters
* in the RCC_OscInitTypeDef structure.
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
/** Initializes the CPU, AHB and APB buses clocks
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
{
Error_Handler();
}
}
/* USER CODE BEGIN 4 */
void Read(void)
{
if(uwTick-sys_tick<10)
return;
sys_tick=uwTick;
Encoder_Left=Read_Speed(&htim2);
Encoder_Right=-Read_Speed(&htim4);
}
/* USER CODE END 4 */
/**
* @brief This function is executed in case of error occurrence.
* @retval None
*/
void Error_Handler(void)
{
/* USER CODE BEGIN Error_Handler_Debug */
/* User can add his own implementation to report the HAL error return state */
__disable_irq();
while (1)
{
}
/* USER CODE END Error_Handler_Debug */
}
#ifdef USE_FULL_ASSERT
/**
* @brief Reports the name of the source file and the source line number
* where the assert_param error has occurred.
* @param file: pointer to the source file name
* @param line: assert_param error line source number
* @retval None
*/
void assert_failed(uint8_t *file, uint32_t line)
{
/* USER CODE BEGIN 6 */
/* User can add his own implementation to report the file name and line number,
ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
/* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */
这个我设置static u8_i;给我报错修改