java 中超大数的运算(+-*/)

本文提供了一个使用Java的BigDecimal类进行高精度数学运算的例子,包括加、减、乘、除四种基本运算,并展示了如何将运算结果转换为字符串形式输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import java.math.BigDecimal;

public class BigCount {
	public static void main(String[] args) {
		TestBigDecimal();
	}
	static void TestBigDecimal(){
		BigDecimal a=new BigDecimal(new String("123453243455535634535252345234677576252241234123523453664563634"));
		BigDecimal b=new BigDecimal(new String("123453243455535634535252345234677576252241234123523453664563634"));
		String c=a.add(b).toString();//加
		String d=a.subtract(b).toString();//减
		String e=a.multiply(b).toString();//乘
		String f=a.divide(b).toString();//除	
		System.out.println(c);
		System.out.println(d);
		System.out.println(e);
		System.out.println(f);
	}
}

/* USER CODE BEGIN Header */ /** ****************************************************************************** * File Name : freertos.c * Description : Code for freertos applications ****************************************************************************** * @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 "FreeRTOS.h" #include "task.h" #include "main.h" #include "cmsis_os.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include "usart.h" #include "gpio.h" #include "tim.h" #include <string.h> #include <stdio.h> /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN PTD */ /* USER CODE END PTD */ /* Private define ------------------------------------------------------------*/ /* USER CODE BEGIN PD */ #define MOTOR_PWM_MAX 19999 // PWM最大值 (Period - 1) #define MOTOR_PWM_MIN 0 // PWM最小值 /* USER CODE END PD */ /* Private macro -------------------------------------------------------------*/ /* USER CODE BEGIN PM */ /* USER CODE END PM */ /* Private variables ---------------------------------------------------------*/ /* USER CODE BEGIN Variables */ struct uart3_rx_t { int num,ok,en; uint8_t data[28]; int class; float score; int x1,y1,x2,y2; uint8_t datarx; }uart3_rx; struct uart2_rx_t { int num,ok,en; uint8_t data[3]; int shexiangtou_en; int manzaijianche_en; int dangban_en; int youhailaji_en; int chuyulaji_en; int kehuishou_en; int qitalaji_en; uint8_t datarx; }uart2_rx; struct pingmu_tx_t { int manzai,ok,en; int class; float score; int x1,y1,x2,y2; }pingmu_tx; osThreadId motorTaskHandle; osThreadId motor2TaskHandle; osThreadId manzaiTaskHandle; osThreadId txTaskHandle; osThreadId uart6MutexHandle; // 新增:电机控制和超声波测距任务句柄 osThreadId motorControlTaskHandle; // 电机控制任务句柄 osThreadId ultrasonicTaskHandle; // 超声波测距任务句柄 // 新增:超声波测距变量 float ultrasonic1_distance = 0.0f; // 超声波1测量距离 (cm) float ultrasonic2_distance = 0.0f; // 超声波2测量距离 (cm) // 新增:舵机状态跟踪变量 typedef enum { SERVO_IDLE = 0, // 舵机空闲状态(在原位) SERVO_WORKING = 1, // 舵机正在执行分类动作 SERVO_RETURNING = 2 // 舵机正在回到原位 } ServoState_t; volatile ServoState_t servoState = SERVO_IDLE; // 舵机状态 volatile uint32_t servoWorkStartTime = 0; // 舵机工作开始时间 // 新增:电机启动停止延时控制变量 volatile uint32_t motor1_startConditionStartTime = 0; // 电机1启动条件开始时间 volatile uint32_t motor2_startConditionStartTime = 0; // 电机2启动条件开始时间 volatile uint8_t motor1_startConditionActive = 0; // 电机1启动条件是否激活 volatile uint8_t motor2_startConditionActive = 0; // 电机2启动条件是否激活 volatile uint32_t motor1_stopConditionStartTime = 0; // 电机1停止条件开始时间 volatile uint32_t motor2_stopConditionStartTime = 0; // 电机2停止条件开始时间 volatile uint8_t motor1_stopConditionActive = 0; // 电机1停止条件是否激活 volatile uint8_t motor2_stopConditionActive = 0; // 电机2停止条件是否激活 // 电机当前状态 volatile uint8_t motor1_running = 0; // 电机1是否正在运行 volatile uint8_t motor2_running = 0; // 电机2是否正在运行 volatile uint8_t servo_class_to_act = 0; volatile uint8_t is_playing_manzai = 0; // 满载播报进行中标志 volatile uint32_t manzai_play_start = 0; // 满载播报开始时间 volatile uint32_t garbage_delay_start = 0; // 垃圾识别延迟开始时间 volatile uint8_t garbage_to_play = 0; // 待播放的垃圾类别 // ✅ 新增电机使能状态 typedef enum { MOTOR_ENABLED = 0, MOTOR_DISABLED = 1 } MotorState_t; volatile MotorState_t motorState = MOTOR_ENABLED; // 默认启用 /* USER CODE END Variables */ osThreadId defaultTaskHandle; osSemaphoreId motorHandle; osSemaphoreId motor2Handle; osSemaphoreId rxlubancatHandle; osSemaphoreId rxpingmuHandle; osSemaphoreId bujingdianjiHandle; /* Private function prototypes -----------------------------------------------*/ /* USER CODE BEGIN FunctionPrototypes */ int fun (int a,int b, int c); //_Noreturn void systemMonitorTask(void const * argument); _Noreturn void motor2Task(void const * argument); //_Noreturn void bujingdianjiTask(void const * argument); _Noreturn void manzaiTask(void const * argument); _Noreturn void txTask(void const * argument); // 新增:电机控制和超声波测距任务函声明 _Noreturn void motorControlTask(void const * argument); // 核心电机控制任务 _Noreturn void ultrasonicTask(void const * argument); // 超声波测距任务 /* USER CODE END FunctionPrototypes */ void StartDefaultTask(void const * argument); void MX_FREERTOS_Init(void); /* (MISRA C 2004 rule 8.1) */ /* GetIdleTaskMemory prototype (linked to static allocation support) */ void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize ); /* USER CODE BEGIN GET_IDLE_TASK_MEMORY */ static StaticTask_t xIdleTaskTCBBuffer; static StackType_t xIdleStack[configMINIMAL_STACK_SIZE]; void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize ) { *ppxIdleTaskTCBBuffer = &xIdleTaskTCBBuffer; *ppxIdleTaskStackBuffer = &xIdleStack[0]; *pulIdleTaskStackSize = configMINIMAL_STACK_SIZE; /* place for user code */ } /* USER CODE END GET_IDLE_TASK_MEMORY */ /** * @brief FreeRTOS initialization * @param None * @retval None */ void MX_FREERTOS_Init(void) { /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* USER CODE BEGIN RTOS_MUTEX */ osMutexDef(uartMutex); osMutexId uartMutexHandle = osMutexCreate(osMutex(uartMutex)); osMutexDef(uart6Mutex); uart6MutexHandle = osMutexCreate(osMutex(uart6Mutex)); /* USER CODE END RTOS_MUTEX */ /* Create the semaphores(s) */ /* definition and creation of motor */ osSemaphoreDef(motor); motorHandle = osSemaphoreCreate(osSemaphore(motor), 1); /* definition and creation of motor2 */ osSemaphoreDef(motor2); motor2Handle = osSemaphoreCreate(osSemaphore(motor2), 1); /* definition and creation of rxlubancat */ osSemaphoreDef(rxlubancat); rxlubancatHandle = osSemaphoreCreate(osSemaphore(rxlubancat), 1); /* definition and creation of rxpingmu */ osSemaphoreDef(rxpingmu); rxpingmuHandle = osSemaphoreCreate(osSemaphore(rxpingmu), 1); /* definition and creation of bujingdianji */ osSemaphoreDef(bujingdianji); bujingdianjiHandle = osSemaphoreCreate(osSemaphore(bujingdianji), 1); /* USER CODE BEGIN RTOS_SEMAPHORES */ /* add semaphores, ... */ /* USER CODE END RTOS_SEMAPHORES */ /* USER CODE BEGIN RTOS_TIMERS */ /* start timers, add new ones, ... */ /* USER CODE END RTOS_TIMERS */ /* USER CODE BEGIN RTOS_QUEUES */ /* add queues, ... */ /* USER CODE END RTOS_QUEUES */ /* Create the thread(s) */ /* definition and creation of defaultTask */ osThreadDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 128); defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL); /* USER CODE BEGIN RTOS_THREADS */ /* add threads, ... */ // osThreadDef(motorTask, motorTask, osPriorityNormal, 0, 128); // 添加舵机初始化 //__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_1, 1300); // 舵机1初始位置 //__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_2, 2030); // 舵机2初始位置 // HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_1); // 启动PWM输出 // HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_2); // servoState = SERVO_IDLE; // 设置初始状态 // motorTaskHandle = osThreadCreate(osThread(motorTask), NULL); // 保留现有的舵机控制任务 osThreadDef(motor2Task, motor2Task, osPriorityNormal, 0, 128); motor2TaskHandle = osThreadCreate(osThread(motor2Task), NULL); // 保留现有的满载检测任务 osThreadDef(manzaiTask, manzaiTask, osPriorityNormal, 0, 128); manzaiTaskHandle = osThreadCreate(osThread(manzaiTask), NULL); // osThreadDef(systemMonitorTask, systemMonitorTask, osPriorityBelowNormal, 0, 128); // osThreadCreate(osThread(systemMonitorTask), NULL); // 保留现有的串口屏通讯任务 osThreadDef(txTask, txTask, osPriorityNormal, 2, 128); txTaskHandle = osThreadCreate(osThread(txTask), NULL); // 新增:电机控制任务 osThreadDef(motorControlTask, motorControlTask, osPriorityNormal, 0, 256); motorControlTaskHandle = osThreadCreate(osThread(motorControlTask), NULL); // 新增:超声波测距任务 osThreadDef(ultrasonicTask, ultrasonicTask, osPriorityHigh, 0, 256); ultrasonicTaskHandle = osThreadCreate(osThread(ultrasonicTask), NULL); /* USER CODE END RTOS_THREADS */ } /* USER CODE BEGIN Header_StartDefaultTask */ /** * @brief Function implementing the defaultTask thread. * @param argument: Not used * @retval None */ /* USER CODE END Header_StartDefaultTask */ void StartDefaultTask(void const * argument) { /* USER CODE BEGIN StartDefaultTask */ /* Infinite loop */ uint32_t last_activity_time = HAL_GetTick(); uart2_rx.manzaijianche_en = 1; for(;;) { //xSemaphoreTake(rxpingmuHandle,portMAX_DELAY); if(xSemaphoreTake(rxpingmuHandle, 100) == pdTRUE) { switch (uart2_rx.data[1]) { case 1: uart2_rx.shexiangtou_en=0; break; case 0: uart2_rx.shexiangtou_en=1; break; case 3: uart2_rx.manzaijianche_en=0; break; case 2: uart2_rx.manzaijianche_en=1; break; case 4: uart2_rx.dangban_en=0; break; case 5: uart2_rx.dangban_en=1; break; case 6: uart2_rx.youhailaji_en=0; break; case 7: uart2_rx.youhailaji_en=1; break; case 8: uart2_rx.chuyulaji_en=0; break; case 9: uart2_rx.chuyulaji_en=1; break; case 10: uart2_rx.kehuishou_en=0; break; case 11: uart2_rx.kehuishou_en=1; break; case 12: uart2_rx.qitalaji_en=0; break; case 13: uart2_rx.qitalaji_en=1; break; default: break; } last_activity_time = HAL_GetTick(); } if(HAL_GetTick() - last_activity_time > 10000) { // 5秒无活动时软复位 NVIC_SystemReset(); } } /* USER CODE END StartDefaultTask */ } /* Private application code --------------------------------------------------*/ /* USER CODE BEGIN Application */ void PlayAudio(uint8_t audio_num) { char cmd[] = {0x70,0x6C,0x61,0x79,0x20,0x30,0x2C,0x30,0x2C,0x30, 0xFF,0xFF,0xFF}; cmd[7] = '0' + audio_num; osMutexWait(uart6MutexHandle, osWaitForever); HAL_UART_Transmit(&huart6, (uint8_t *)cmd, sizeof(cmd), HAL_MAX_DELAY); osMutexRelease(uart6MutexHandle); } void PlayGarbageAudio(uint8_t garbage_class) { uint8_t audio_num = 0; switch (garbage_class) { case 0: case 1: case 3: audio_num = 2; break; // 可回收 case 2: case 5: audio_num = 1; break; // 厨余 case 7: case 8: audio_num = 0; break; // 有害 default: audio_num = 3; break; // 其他 } PlayAudio(audio_num); } // 保留现有的舵机控制任务 - 增加状态跟踪 _Noreturn void motor2Task(void const * argument) { // 上电首次执行初始化动作 __HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_1, 1300); __HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_2, 2030); osDelay(500); // 确保舵机到位 servoState = SERVO_IDLE; for(;;) { xSemaphoreTake(motor2Handle, portMAX_DELAY); //uint8_t current_class = uart3_rx.class; if(is_playing_manzai) { osDelay(100); continue; // 跳过当前动作 } // 🎯 设置舵机工作状态 servoState = SERVO_WORKING; //servoWorkStartTime = HAL_GetTick(); uint8_t current_class = servo_class_to_act; switch (current_class) { //有害垃圾 case 0: __HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_1,1300); __HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_2,2430); break; //可回收垃圾 case 1: case 8: __HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_1,1300); __HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_2,1570); break; //厨余垃圾 case 2: case 5: case 6: case 7: __HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_1,2000); osDelay(1000); __HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_2,2430); break; //其它垃圾 case 3: case 4: __HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_1,2000); osDelay(500); __HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_2,1570); break; default: __HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_1,1300); __HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_2,2030); break; } osDelay(1000); // 执行分类动作的延时 // 🎯 设置舵机回到原位状态 servoState = SERVO_RETURNING; __HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_1,1300); __HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_2,2030); osDelay(1000); // 回到原位的延时 // 🎯 设置舵机空闲状态 servoState = SERVO_IDLE; } osSemaphoreGive(motor2Handle); osDelay(10); } // 保留现有的满载检测任务 _Noreturn void manzaiTask(void const * argument) { for(;;) { osDelay(100); if(HAL_GPIO_ReadPin(load1_GPIO_Port,load1_Pin)==0 || HAL_GPIO_ReadPin(load2_GPIO_Port,load2_Pin)==0 || HAL_GPIO_ReadPin(load3_GPIO_Port,load3_Pin)==0 || HAL_GPIO_ReadPin(load4_GPIO_Port,load4_Pin)==0) { pingmu_tx.manzai=1; xSemaphoreGive(rxlubancatHandle); } } } // 保留现有的串口屏通讯任务 _Noreturn void txTask(void const * argument) { int num=0; const char manzaidata[]={0x74,0x30,0x2E,0x74,0x78,0x74,0x3D,0x22,0xC0,0xAC,0xBB, 0xF8,0xC2,0xFA,0xD4,0xD8,0x22,0xff,0xff,0xff}; // const char kongdata[]={0x74,0x30,0x2E,0x74,0x78,0x74,0x3D,0x22,0x20,0x22,0xff,0xff,0xff}; char play[]={0x70,0x6C,0x61,0x79,0x20,0x30,0x2C,0x30,0x2C,0x30}; unsigned char aa[2]={0}; const char start[]={0x64,0x61,0x74,0x61,0x30,0x2E ,0x69 ,0x6E ,0x73 ,0x65 ,0x72 ,0x74 ,0x28 ,0x22 }; const char end[]={0x22,0x29,0xff,0xff,0xff}; const char end2[]={0xff,0xff,0xff}; //���� const char data1[]={0x5E,0xCD,0xC1,0xB6,0xB9,'\0'}; //���ܲ� const char data2[]={0x5E ,0xB0 ,0xD7 ,0xC2 ,0xDC ,0xB2 ,0xB7 ,'\0'}; //���ܲ� const char data3[]={0x5E ,0xBA ,0xFA ,0xC2 ,0xDC ,0xB2 ,0xB7 ,'\0'}; //ֽ�� const char data4[]={0x5E ,0xD6 ,0xBD ,0xB1 ,0xAD ,'\0'}; //ʯͷ const char data5[]={0x5E ,0xCA ,0xAF ,0xCD ,0xB7 ,'\0'}; //��Ƭ const char data6[]={0x5E ,0xB4,0xC9 ,0xC6 ,0xAC ,'\0'}; //5�ŵ��????? const char data7[]={0x5E ,0x35 ,0xBA ,0xC5 ,0xB5 ,0xE7 ,0xB3 ,0xD8 ,'\0'}; //1�ŵ��????? const char data8[]={0x5E ,0x31 ,0xBA ,0xC5 ,0xB5 ,0xE7 ,0xB3 ,0xD8 ,'\0'}; //�к����� const char data10[]={0x5E ,0xD3 ,0xD0 ,0xBA ,0xA6 ,0xC0 ,0xAC ,0xBB ,0xF8 ,0x5E,'\0'}; //�������� const char data11[]={0x5E ,0xB3 ,0xF8 ,0xD3 ,0xE0 ,0xC0 ,0xAC ,0xBB ,0xF8 ,0x5E,'\0'}; //�ɻ������� const char data12[]={0x5E ,0xBF ,0xC9 ,0xBB ,0xD8 ,0xCA ,0xD5 ,0xC0 ,0xAC ,0xBB ,0xF8 ,0x5E,'\0'}; //�������� const char data13[]={0x5E ,0xC6 ,0xE4 ,0xCB ,0xFB ,0xC0 ,0xAC ,0xBB ,0xF8 ,0x5E,'\0'}; const char* data[]={data8,data4,data7,data5,data6,data2,data3,data1,data1,data1,data1}; uart2_rx.manzaijianche_en=0; uart2_rx.shexiangtou_en=1; for(;;) { xSemaphoreTake(rxlubancatHandle,portMAX_DELAY); if(uart3_rx.ok==1 && uart2_rx.shexiangtou_en ==1 ){ uart3_rx.ok=0; HAL_GPIO_TogglePin(led0_GPIO_Port,led0_Pin); uart3_rx.class=uart3_rx.data[1]-0x30; if(uart3_rx.class<0 || uart3_rx.class>9) uart3_rx.class=11; aa[1]=num%10+0x30; aa[0]=num/10+0x30; HAL_UART_Transmit(&huart6, (uint8_t *) start,sizeof(start),0xFFFF); HAL_UART_Transmit(&huart6, (uint8_t *)aa, 2,0xFFFF); switch (uart3_rx.class) { case 0: case 2: HAL_UART_Transmit(&huart6, (uint8_t *) data[uart3_rx.class], strlen(data[uart3_rx.class]),0xFFFF); HAL_UART_Transmit(&huart6, (uint8_t *) data10, strlen(data10),0xFFFF); HAL_UART_Transmit(&huart6, (uint8_t *)aa, 2,0xFFFF); HAL_UART_Transmit(&huart6, (uint8_t *) end, sizeof(end),0xFFFF); play[7]=0x30; HAL_UART_Transmit(&huart6, (uint8_t *) play, 10,0xFFFF); HAL_UART_Transmit(&huart6, (uint8_t *) end2, sizeof(end2),0xFFFF); break;//�к����� case 5: case 6: case 7: HAL_UART_Transmit(&huart6, (uint8_t *) data[uart3_rx.class], strlen(data[uart3_rx.class]),0xFFFF); HAL_UART_Transmit(&huart6, (uint8_t *) data11, strlen(data11),0xFFFF); HAL_UART_Transmit(&huart6, (uint8_t *)aa, 2,0xFFFF); HAL_UART_Transmit(&huart6, (uint8_t *) end, sizeof(end),0xFFFF); play[7]=0x31; HAL_UART_Transmit(&huart6, (uint8_t *) play, 10,0xFFFF); HAL_UART_Transmit(&huart6, (uint8_t *) end2, sizeof(end2),0xFFFF); break;//�������� case 1: HAL_UART_Transmit(&huart6, (uint8_t *) data[uart3_rx.class], strlen(data[uart3_rx.class]),0xFFFF); HAL_UART_Transmit(&huart6, (uint8_t *) data12, strlen(data12),0xFFFF); HAL_UART_Transmit(&huart6, (uint8_t *)aa, 2,0xFFFF); HAL_UART_Transmit(&huart6, (uint8_t *) end, sizeof(end),0xFFFF); play[7]=0x32; HAL_UART_Transmit(&huart6, (uint8_t *) play, 10,0xFFFF); HAL_UART_Transmit(&huart6, (uint8_t *) end2, sizeof(end2),0xFFFF); break;//�ɻ������� case 3: case 4: HAL_UART_Transmit(&huart6, (uint8_t *) data[uart3_rx.class], strlen(data[uart3_rx.class]),0xFFFF); HAL_UART_Transmit(&huart6, (uint8_t *) data13, strlen(data13),0xFFFF); HAL_UART_Transmit(&huart6, (uint8_t *)aa, 2,0xFFFF); HAL_UART_Transmit(&huart6, (uint8_t *) end, sizeof(end),0xFFFF); play[7]=0x33; HAL_UART_Transmit(&huart6, (uint8_t *) play, 10,0xFFFF); HAL_UART_Transmit(&huart6, (uint8_t *) end2, sizeof(end2),0xFFFF); break;//�������� default: break; } servo_class_to_act = uart3_rx.class; xSemaphoreGive(motor2Handle); num++; if(num>99)num=0; osDelay(2000); } if(pingmu_tx.manzai==1 && uart2_rx.manzaijianche_en==1){ HAL_UART_Transmit(&huart6, (uint8_t *) manzaidata, 20,0xFFFF),pingmu_tx.manzai=0; play[7]=0x34; HAL_UART_Transmit(&huart6, (uint8_t *) play, 10,0xFFFF); HAL_UART_Transmit(&huart6, (uint8_t *) end2, sizeof(end2),0xFFFF); osDelay(2000); } } } // ========== 🎯 新增:电机控制任务 ========== // 功能:控制两个电机的PWM速度,与舵机控制分开 // 电机1:PA6 (TIM3_CH1) // 电机2:PA7 (TIM3_CH2) _Noreturn void motorControlTask(void const * argument) { uint32_t tickCounter = 0; // 延迟启动 osDelay(1000); HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1); // PA6 HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_2); // PA7 for(;;) { // 电机现在由超声波任务自动控制,这里只做周期性检查 if(tickCounter % 50 == 0) { // 可以在这里添加电机状态检查逻辑 } tickCounter++; osDelay(200); } } // 添加DWT周期计器支持(在main.c初始化) void DWT_Init(void) { if (!(CoreDebug->DEMCR & CoreDebug_DEMCR_TRCENA_Msk)) { CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; DWT->CYCCNT = 0; DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk; } } // 微秒级延时函 void DWT_Delay_us(volatile uint32_t us) { uint32_t start = DWT->CYCCNT; us *= (SystemCoreClock / 1000000); while ((DWT->CYCCNT - start) < us); } // ========== 🎯 新增:超声波测距函 ========== // 简化版本,避免任务阻塞,返回距离值(cm*10) // 重写超声波测距函 int32_t measureDistance(GPIO_TypeDef* trig_port, uint16_t trig_pin, GPIO_TypeDef* echo_port, uint16_t echo_pin) { // 发送10us触发脉冲 HAL_GPIO_WritePin(trig_port, trig_pin, GPIO_PIN_SET); DWT_Delay_us(10); HAL_GPIO_WritePin(trig_port, trig_pin, GPIO_PIN_RESET); // 等待Echo变高(带超时) uint32_t timeout = DWT->CYCCNT + (10 * SystemCoreClock / 1000); // 10ms超时 while (HAL_GPIO_ReadPin(echo_port, echo_pin) == GPIO_PIN_RESET) { if (DWT->CYCCNT > timeout) return -1; DWT_Delay_us(1); } // 记录上升沿时间 uint32_t start_time = DWT->CYCCNT; // 等待Echo变低(带超时) timeout = DWT->CYCCNT + (30 * SystemCoreClock / 1000); // 30ms超时 while (HAL_GPIO_ReadPin(echo_port, echo_pin) == GPIO_PIN_SET) { if (DWT->CYCCNT > timeout) return -2; DWT_Delay_us(1); } // 计算高电平持续时间(us) uint32_t pulse_cycles = DWT->CYCCNT - start_time; uint32_t pulse_us = pulse_cycles * 1000000 / HAL_RCC_GetSysClockFreq(); // 计算距离(0.1cm单位):距离 = (时间 * 声速) / 2 return (pulse_us * 34) / 20; // 340m/s = 0.034cm/us } // ========== 🎯 新增:超声波测距任务 ========== // 真实测距版本,控制电机运行,与舵机同步,不使用USART1发送 _Noreturn void ultrasonicTask(void const * argument) { const uint16_t MOTOR_MIN_PWM = 2000; // 10%占空比 for(;;) { int32_t dist1 = measureDistance(GPIOB, GPIO_PIN_2, GPIOD, GPIO_PIN_8); int32_t dist2 = measureDistance(GPIOB, GPIO_PIN_3, GPIOD, GPIO_PIN_9); if(servoState == SERVO_IDLE) { // 电机1控制 (5-50cm) if(dist1 > 0 && dist1 >= 50 && dist1 <= 500) { __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, MOTOR_MIN_PWM); } else { __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 0); } // 电机2控制 if(dist2 > 0 && dist2 >= 50 && dist2 <= 500) { __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, MOTOR_MIN_PWM); } else { __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, 0); } } else { // 舵机工作时停止电机 __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 0); __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, 0); } osDelay(50); // 缩短延迟至50ms } } void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { /* Prevent unused argument(s) compilation warning */ // UNUSED(huart); /* NOTE: This function Should not be modified, when the callback is needed, the HAL_UART_TxCpltCallback could be implemented in the user file */ BaseType_t xHigherPriorityTaskWoken = pdFALSE; if(huart->Instance == USART6) { // 更健壮的帧检测 static uint8_t frame_buffer[32]; static uint8_t frame_index = 0; // 存储接收到的字节 frame_buffer[frame_index] = uart2_rx.datarx; frame_index = (frame_index + 1) % sizeof(frame_buffer); // 检测结束符 0xFF 0xFF 0xFF if(frame_index >= 3 && frame_buffer[frame_index-3] == 0xFF && frame_buffer[frame_index-2] == 0xFF && frame_buffer[frame_index-1] == 0xFF) { // 复制有效据 memcpy(uart2_rx.data, frame_buffer, frame_index-3); uart2_rx.num = frame_index-3; uart2_rx.ok = 1; frame_index = 0; xSemaphoreGiveFromISR(rxpingmuHandle, &xHigherPriorityTaskWoken); } HAL_UART_Receive_IT(&huart6, (uint8_t*)&uart2_rx.datarx, 1); } if(huart ->Instance == USART1){ HAL_GPIO_TogglePin(led1_GPIO_Port,led1_Pin); if(uart3_rx.datarx=='@') uart3_rx.num=0; uart3_rx.data[uart3_rx.num]=uart3_rx.datarx; uart3_rx.num++; if(uart3_rx.num>=28){ uart3_rx.num=0; if(uart3_rx.data[27]==']'){ uart3_rx.ok=1; xSemaphoreGiveFromISR(rxlubancatHandle, &xHigherPriorityTaskWoken); } uart3_rx.num = 0; // 重置缓冲区 } HAL_UART_Receive_IT(&huart1, (uint8_t *)&uart3_rx.datarx, 1); } portYIELD_FROM_ISR(xHigherPriorityTaskWoken); } /* USER CODE END Application */ 这个代码中为什么超声波测距控制电机启停无法响应?该怎么解决
07-24
#include "upstandingcar.h" #include "I2C_MPU6050.h" #include "MOTOR.h" #include "led.h" #include "USART.H" #include "MPU6050.H" #include "UltrasonicWave.h" #include "stm32f10x_gpio.h" #include "math.h" #include <string.h> #include <stdlib.h> #include <stdio.h> #include "adc.h" #include "delay.h" /*****************************************/ u8 newLineReceived = 0; u8 inputString[80] = {0}; u8 ProtocolString[80] = {0}; /*小车运行状态枚举*/ enum{ enSTOP = 0, enRUN, enLOW, enMEDIUM, enHIGH, enBACK, enLEFT, enRIGHT, enTLEFT, enTRIGHT, enLED, enLED1, enBEEP, enBEEP1 }enCarState; #define run_car '1'//按键前 #define back_car '2'//按键后 #define left_car '3'//按键左 #define right_car '4'//按键右 #define stop_car '0'//按键停 #define low_car '5'//按键前 #define medium_car '6'//按键前 #define high_car '7'//按键前 #define led_car 'a'//按键亮 #define led1_car 'b'//按键灭 #define beep_car 'c'//按键响 #define beep1_car 'd'//按键不响 int g_newcarstate = enSTOP; // 1前2后3左4右0停止 char returntemp[] = "$0,0,0,0,0,0,0,0,0,0,0,0cm,8.2V#"; char piddisplay[50] ="$AP"; char manydisplay[80] ={0}; char updata[80] ={0}; /*****************多据************************/ u8 BST_u8MainEventCount; //主循环判断计 在SysTick_Handler(void)中使用 每1ms加1 u8 BST_u8SpeedControlCount; //速度控制循环计 在SysTick_Handler(void)中使用 每5ms加1 u8 BST_u8SpeedControlPeriod; u8 BST_u8DirectionControlPeriod; u8 BST_u8DirectionControlCount; //转向控制循环计 在SysTick_Handler(void)中使用 每5ms加1 u8 BST_u8trig; u8 ucBluetoothValue; //蓝牙接收据 float volt = 12.0; /******电机控制参******/ float BST_fSpeedControlOut; //速度控制PWM float BST_fSpeedControlOutOld; float BST_fSpeedControlOutNew; float BST_fAngleControlOut; float BST_fLeftMotorOut; float BST_fRightMotorOut; float BST_fCarAngle; //角度控制PWM float gyro_z; float gyrx; float gy0; /*-----角度环和速度环PID控制参-----*///以下参考为重点调试参考,同电池电压有关,建议充好电再调试 float BST_fCarAngle_P =90.2 ;// 91.3 //调大小时会左右摆,调大时会振动 请调到基本能够站立 P=91.3是用于给小车在运动过程使用 float BST_fCarAngle_D =0.21; // 0.001 0.002 0.004 0.008 0.0010 0.011 调小时反应慢,调大时会干扰 float BST_fCarSpeed_P= 10.15; float BST_fCarSpeed_I=0.31; const double PID_Original[4] ={0, 0, 0, 0}; char alldata[80]; char *iap; /******速度控制参******/ s16 BST_s16LeftMotorPulse; //左电机脉冲 s16 BST_s16RightMotorPulse; //右电机脉冲 s32 BST_s32LeftMotorPulseOld; s32 BST_s32RightMotorPulseOld; s32 BST_s32LeftMotorPulseSigma; //50ms左电机叠加值 s32 BST_s32RightMotorPulseSigma; //50ms右电机叠加值 float BST_fCarSpeed; //测速码盘得出的车速 float BST_fCarSpeedOld; float BST_fCarPosition; //测速码盘通过计算得到的小车位移 /*-----悬停参-----*/ int leftstop=0; int rightstop=0; int stopflag=0; /******超声波********/ float fchaoshengbo = 0; //超声波输出量 float juli = 0; //超声波距离 /******蓝牙控制参******/ float BST_fBluetoothSpeed; //蓝牙控制车速 float BST_fBluetoothDirectionNew; //用于平缓输出车速使用 float BST_fBluetoothDirectionSL; //左转标志位 由于PWM转向输出使用判断输出方式 固需要标志位 float BST_fBluetoothDirectionSR; //右转标志位 由于PWM转向输出使用判断输出方式 固需要标志位 int chaoflag=0; //static int speedLevel = 0; int x,y1,z1,y2,z2,flagbt; int g_autoup = 0; int g_uptimes = 5000; //自动上报间隔 char charkp[10],charkd[10],charksp[10],charksi[10]; char lspeed[10],rspeed[10],daccel[10],dgyro[10],csb[10],vi[10]; char kp,kd,ksp,ksi; float dac = 0,dgy = 0; /************旋转*****************/ float BST_fBluetoothDirectionL; //左旋转标志位 由于PWM旋转输出使用判断输出方式 固需要标志位 float BST_fBluetoothDirectionR; //右旋转标志位 由于PWM旋转输出使用判断输出方式 固需要标志位 int driectionxco=400; //******卡尔曼参************ float Q_angle=0.001; float Q_gyro=0.003; float R_angle=0.5; float dt=0.005; //dt为kalman滤波器采样时间; char C_0 = 1; float Q_bias, Angle_err; float PCt_0=0, PCt_1=0, E=0; float K_0=0, K_1=0, t_0=0, t_1=0; float Pdot[4] ={0,0,0,0}; float PP[2][2] = { { 1, 0 },{ 0, 1 } }; void SendAutoUp(void); /**********延时子函****************/ void delay_nms(u16 time) { u16 i=0; while(time--) { i=12000; //自己定义 while(i--) ; } } /***********************************/ /*************************************************************** ** 函名称: CarUpstandInit ** 功能描述: 全局变量初始化函 ***************************************************************/ void CarUpstandInit(void) { BST_s16LeftMotorPulse = BST_s16RightMotorPulse = 0; //左右脉冲值 初始化 BST_s32LeftMotorPulseSigma = BST_s32RightMotorPulseSigma = 0; //叠加脉冲 初始化 BST_fCarSpeed = BST_fCarSpeedOld = 0; //平衡小车车速 初始化 BST_fCarPosition = 0; //平衡小车位移量 初始化 BST_fCarAngle = 0; //平衡小车车速 初始化 BST_fAngleControlOut = BST_fSpeedControlOut = BST_fBluetoothDirectionNew = 0; //角度PWM、车速PWM、蓝牙控制PWM 初始化 BST_fLeftMotorOut = BST_fRightMotorOut = 0; //左右车轮PWM输出值 初始化 BST_fBluetoothSpeed = 0; //蓝牙控制车速值 初始化 BST_fBluetoothDirectionL =BST_fBluetoothDirectionR= 0; //蓝牙控制左右旋转标志位 初始化 BST_fBluetoothDirectionSL =BST_fBluetoothDirectionSR= 0; //蓝牙控制左右转向标志位 初始化 BST_u8MainEventCount=0; //用于5ms定时器子程序SysTick_Handler(void)中总中断计位 BST_u8SpeedControlCount=0; //用于5ms定时器子程序SysTick_Handler(void)中50ms速度平衡融入计位 BST_u8SpeedControlPeriod=0; //用于5ms定时器子程序SysTick_Handler(void)中50ms速度平衡融入计位 fchaoshengbo=0;//用于5ms定时器子程序SysTick_Handler(void)中超声波平衡融入计位 } void ResetPID() { if(BST_fCarAngle_P != PID_Original[0]) { BST_fCarAngle_P = PID_Original[0]; } if(BST_fCarAngle_D != PID_Original[1]) { BST_fCarAngle_D = PID_Original[1]; } if(BST_fCarSpeed_P != PID_Original[2]) { BST_fCarSpeed_P = PID_Original[2]; } if(BST_fCarSpeed_I != PID_Original[3]) { BST_fCarSpeed_I = PID_Original[3]; } } /*************************************************************** ** 函名称: AngleControl ** 功能描述: 角度环控制函 ***************************************************************/ void AngleControl(void) { if(flagbt==1) { BST_fCarAngle_P=0; BST_fCarAngle_P=y1*1.71875; } if(flagbt==2) { BST_fCarAngle_D=0; BST_fCarAngle_D=(z1-64)*0.15625; } dac=accel[2]; dgy=gyro[2]; if(Pitch==0||Pitch<-50||Pitch>50) //MPU6050状态指示灯 STM32核心板 PB13 绿色灯亮起为不正常 { //Pitch=1; GPIO_ResetBits(GPIOB, GPIO_Pin_13); //MPU6050状态指示灯 STM32核心板 PB13 绿色灯亮起为不正常 } else {GPIO_SetBits(GPIOB, GPIO_Pin_13);} //MPU6050状态正常时LED灯熄灭 BST_fCarAngle = Roll - CAR_ZERO_ANGLE; //DMP ROLL滚动方向角度与预设小车倾斜角度值的差得出角度 BST_fAngleControlOut = BST_fCarAngle * BST_fCarAngle_P + gyro[0] * BST_fCarAngle_D ; //角度PD控制 } /*************************************************************** ** 函名称: SetMotorVoltageAndDirection ** 功能描述: 电机转速 ***************************************************************/ void SetMotorVoltageAndDirection(s16 s16LeftVoltage,s16 s16RightVoltage) { u16 u16LeftMotorValue; u16 u16RightMotorValue; //当左电机PWM输出为负时 PB14设为正 PB15设为负 (PB14 15 分别控制TB6612fng驱动芯片,逻辑0 1可控制左电机正转反转) if(s16LeftVoltage<0) { GPIO_SetBits(GPIOA, GPIO_Pin_4 ); GPIO_ResetBits(GPIOA, GPIO_Pin_5 ); s16LeftVoltage = (-s16LeftVoltage); } //当左电机PWM输出为正时 PB14设为负 PB15设为正 (PB14 15 分别控制TB6612fng驱动芯片,逻辑0 1可控制左电机正转反转) else { GPIO_SetBits(GPIOA, GPIO_Pin_5 ); GPIO_ResetBits(GPIOA, GPIO_Pin_4 ); s16LeftVoltage = s16LeftVoltage; } //当右电机PWM输出为负时 PB1设为正 PB0设为负 (PB1 0 分别控制TB6612fng驱动芯片,逻辑0 1可控制左电机正转反转) if(s16RightVoltage<0) { GPIO_SetBits(GPIOB, GPIO_Pin_1); GPIO_ResetBits(GPIOB, GPIO_Pin_0 ); s16RightVoltage = (-s16RightVoltage); } //当右电机PWM输出为正时 PB12设为负 PB13设为正 (PB12 13 分别控制TB6612fng驱动芯片,逻辑0 1可控制左电机正转反转) else { GPIO_SetBits(GPIOB, GPIO_Pin_0 ); GPIO_ResetBits(GPIOB, GPIO_Pin_1 ); s16RightVoltage = s16RightVoltage; } u16RightMotorValue= (u16)s16RightVoltage; u16LeftMotorValue = (u16)s16LeftVoltage; TIM_SetCompare3(TIM2,u16LeftMotorValue); //TIM4与 u16RightMotorValue对比,不相同则翻转波形,调节PWM占空比 TIM_SetCompare4(TIM2,u16RightMotorValue); //TIM4与 u16LeftMotorValue对比,不相同则翻转波形,调节PWM占空比 #if 0 /*判断车辆 是否悬停或跌倒,调试用*/ if(Pitch>10||Pitch<-10&BST_fBluetoothDirectionSR==0&BST_fBluetoothDirectionSL==0) { TIM_SetCompare3(TIM2,0); TIM_SetCompare4(TIM2,0); stopflag=1; } else stopflag=0; if(BST_fCarAngle > 50 || BST_fCarAngle < (-50)) { TIM_SetCompare3(TIM2,0); TIM_SetCompare4(TIM2,0); stopflag=1; } else stopflag=0; #endif } /*************************************************************** ** 函名称: MotorOutput ** 功能描述: 电机输出函 将直立控制、速度控制、方向控制的输出量进行叠加,并加 入死区常量,对输出饱和作出处理。 ***************************************************************/ void MotorOutput(void) //电机PWM输出函 { //右电机转向PWM控制融合平衡角度、速度输出 BST_fLeftMotorOut = BST_fAngleControlOut +BST_fSpeedControlOutNew + BST_fBluetoothDirectionNew;//+directionl - BST_fBluetoothDirectionNew; //左电机转向PWM控制融合平衡角度、速度输出 BST_fRightMotorOut = BST_fAngleControlOut +BST_fSpeedControlOutNew - BST_fBluetoothDirectionNew;//-directionl+ BST_fBluetoothDirectionNew; //右电机转向PWM控制融合平衡角度、速度输出 if((s16)BST_fLeftMotorOut > MOTOR_OUT_MAX) BST_fLeftMotorOut = MOTOR_OUT_MAX; if((s16)BST_fLeftMotorOut < MOTOR_OUT_MIN) BST_fLeftMotorOut = MOTOR_OUT_MIN; if((s16)BST_fRightMotorOut > MOTOR_OUT_MAX) BST_fRightMotorOut = MOTOR_OUT_MAX; if((s16)BST_fRightMotorOut < MOTOR_OUT_MIN) BST_fRightMotorOut = MOTOR_OUT_MIN; SetMotorVoltageAndDirection((s16)BST_fLeftMotorOut,(s16)BST_fRightMotorOut); } //采集电机速度脉冲 void GetMotorPulse(void) { //////////////////////////////////此部分为外部中断计算脉冲///////////////////////////////////// uint16_t u16TempLeft; uint16_t u16TempRight; u16TempLeft = TIM_GetCounter(TIM3); // TIM3定时器计算调用 u16TempRight= TIM_GetCounter(TIM4); // TIM4定时器计算调用 leftstop=u16TempLeft; rightstop=u16TempRight; //清零 TIM_SetCounter(TIM3,0);//TIM3->CNT = 0; TIM_SetCounter(TIM4,0);//TIM4->CNT = 0; BST_s16LeftMotorPulse=u16TempLeft; BST_s16RightMotorPulse=(-u16TempRight); BST_s32LeftMotorPulseSigma += BST_s16LeftMotorPulse; //脉冲值叠加 40ms叠加值 BST_s32RightMotorPulseSigma += BST_s16RightMotorPulse; //脉冲值叠加 40ms叠加值 } /*************************************************************** ** 函名称: SpeedControl ** 功能描述: 速度环控制函 ***************************************************************/ void SpeedControl(void) { BST_fCarSpeed = (BST_s32LeftMotorPulseSigma + BST_s32RightMotorPulseSigma)*0.5;//左右电机脉冲平均值作为小车当前车速 BST_s32LeftMotorPulseSigma =BST_s32RightMotorPulseSigma = 0; //全局变量 注意及时清零 BST_fCarSpeedOld *= 0.7; BST_fCarSpeedOld +=BST_fCarSpeed*0.3; BST_fCarPosition += BST_fCarSpeedOld; //路程 即速度积分 1/11 3:03 BST_fCarPosition += BST_fBluetoothSpeed;//融合蓝牙给定速度 BST_fCarPosition += fchaoshengbo; //融合超声波给定速度 if(stopflag==1) { BST_fCarPosition=0; } //积分上限设限// if((s32)BST_fCarPosition > CAR_POSITION_MAX) BST_fCarPosition = CAR_POSITION_MAX; if((s32)BST_fCarPosition < CAR_POSITION_MIN) BST_fCarPosition = CAR_POSITION_MIN; if(flagbt==3) { BST_fCarSpeed_P=0; BST_fCarSpeed_P=(y2-128)*0.46875; } if(flagbt==4) { BST_fCarSpeed_I=0; BST_fCarSpeed_I=(z2-192)*0.15625; } BST_fSpeedControlOutNew = (BST_fCarSpeedOld -CAR_SPEED_SET ) * BST_fCarSpeed_P + (BST_fCarPosition - CAR_POSITION_SET ) * BST_fCarSpeed_I; //速度PI算法 速度*P +位移*I=速度PWM输出 } /*************************************************************** ** 函名称: BluetoothControl ** 功能描述: 蓝牙控制函 手机发送内容 前:0x01 后:0x02 左:0x04 右:0x03 停止:0x07 功能键:(旋转) 左旋转:0x05 右旋转:0x06 停转:0x07 ** 输 入: ** 输 出: switch (x) { case 0x00 : BST_fCarAngle_P=BST_fCarAngle_D=BST_fCarSpeed_P=BST_fCarSpeed_I=0; case 0x01 : BST_fBluetoothSpeed = 3000 ;chaoflag=1; break; //向前速度 250 case 0x02 : BST_fBluetoothSpeed = (-3000);chaoflag=1; break; //后退速度 -250 case 0x03 : BST_fBluetoothDirectionNew= -300; chaoflag=1;break ;//左旋 case 0x04 : BST_fBluetoothDirectionNew= 300; chaoflag=1;break ;//右旋转 case 0x05 : BST_fBluetoothDirectionNew= driectionxco; chaoflag=1;break ;//左旋 case 0x06 : BST_fBluetoothDirectionNew= -driectionxco; chaoflag=1;break ;//右旋转 case 0x07 : BST_fBluetoothDirectionL =0; BST_fBluetoothDirectionR = 0; BST_fBluetoothDirectionSL =0; BST_fBluetoothDirectionSR = 0;fchaoshengbo=0;BST_fBluetoothDirectionNew=0;chaoflag=0; break; //停 case 0x08 : BST_fBluetoothDirectionSL =0; BST_fBluetoothDirectionSR = 0; fchaoshengbo=0;BST_fBluetoothDirectionNew=0;chaoflag=0;break; //停旋转 case 0x09 : BST_fBluetoothSpeed = 0 ; break; case 0x0A : flagbt=1;break; case 0x0B : flagbt=2;break; case 0x0C : flagbt=3;break; case 0x0D : flagbt=4;break; default : BST_fBluetoothSpeed = 0;flagbt=0; BST_fBluetoothDirectionL=BST_fBluetoothDirectionR = 0;BST_fBluetoothDirectionSR=BST_fBluetoothDirectionSL=0;chaoflag=0;break; } ***************************************************************/ int num = 0; u8 startBit = 0; int int9num =0; void USART1_IRQHandler(void) { u8 uartvalue = 0; if (USART_GetFlagStatus(USART1, USART_FLAG_ORE) != RESET)//注意!不能使用if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)来判断 { USART_ClearFlag(USART1, USART_FLAG_ORE); //读SR其实就是清除标志 USART_ReceiveData(USART3); } if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)!=RESET) { USART_ClearITPendingBit(USART1, USART_IT_RXNE); uartvalue = USART1->DR; if(uartvalue == '$') { startBit = 1; num = 0; } if(startBit == 1) { inputString[num] = uartvalue; } if (startBit == 1 && uartvalue == '#') { newLineReceived = 1; startBit = 0; int9num = num; } num++; if(num >= 80) { num = 0; startBit = 0; newLineReceived = 0; } // if(uartvalue == 'a') // { // GPIO_ResetBits(GPIOB, GPIO_Pin_12 | GPIO_Pin_13);//灯亮 // } // else if(uartvalue == 'b') // { // GPIO_SetBits(GPIOB, GPIO_Pin_12 | GPIO_Pin_13);//灯灭 // } // else if(uartvalue == 'd') // { // GPIO_ResetBits(GPIOB, GPIO_Pin_5); //蜂鸣器不响 // } // // else if(uartvalue == 'c') // { // GPIO_SetBits(GPIOB, GPIO_Pin_5); //蜂鸣器响 // } } } /**********************超声波距离计算***************************/ void chaoshengbo(void) { static uint8_t obstacle_detected = 0; // 标记是否检测到障碍物 if(chaoflag==0) { juli=TIM_GetCounter(TIM1)*5*34/200.0; if(juli <= 4.00) //判断若距离小于8cm,小车输出向后PWM值。 { obstacle_detected = 1; fchaoshengbo = -200; // 后退PWM值 } else if(juli >= 5 && juli <= 8) { obstacle_detected = 0; // 清除障碍物标记 fchaoshengbo=200; } else { obstacle_detected = 0; // 清除障碍物标记 fchaoshengbo=0; //距离大于8cm ,超声波PWM输出为0 } } } void CarStateOut(void) { switch (g_newcarstate) { case enSTOP: //停止 { BST_fBluetoothSpeed = 0; fchaoshengbo=0; BST_fBluetoothDirectionNew=0; chaoflag=0; } break; case enRUN: //向前速度 100 { BST_fBluetoothDirectionNew= 0; //BST_fSpeedControlOutNew=0; BST_fBluetoothSpeed = 50 ; chaoflag=1; }break; case enLOW: //向前速度 150 { BST_fBluetoothDirectionNew= 0; //BST_fSpeedControlOutNew=0; BST_fBluetoothSpeed = 100 ; chaoflag=1; }break; case enMEDIUM: //向前速度 200 { BST_fBluetoothDirectionNew= 0; //BST_fSpeedControlOutNew=0; BST_fBluetoothSpeed = 150 ; chaoflag=1; }break; case enHIGH: //向前速度 250 { BST_fBluetoothDirectionNew= 0; //BST_fSpeedControlOutNew=0; BST_fBluetoothSpeed = 200 ; chaoflag=1; }break; case enLEFT://左转 { BST_fBluetoothDirectionNew= -300; chaoflag=1; }break; case enRIGHT: //右转 { BST_fBluetoothDirectionNew= 300; chaoflag=1; }break; case enBACK: //后退速度 -100 { BST_fBluetoothDirectionNew= 0; //BST_fSpeedControlOutNew=0; BST_fBluetoothSpeed = (-100); chaoflag=1; }break; case enTLEFT: //左旋 { BST_fBluetoothDirectionNew = -driectionxco; chaoflag=1; }break; case enTRIGHT: //右旋 { BST_fBluetoothDirectionNew = driectionxco; chaoflag=1; }break; default: BST_fBluetoothSpeed = 0; break; //停止 case enLED: //LED亮 { GPIO_ResetBits(GPIOB, GPIO_Pin_12 | GPIO_Pin_13);//灯亮 }break; case enLED1: //LED灭 { GPIO_SetBits(GPIOB, GPIO_Pin_12 | GPIO_Pin_13);//灯灭 }break; case enBEEP: //蜂鸣器响 { GPIO_SetBits(GPIOB, GPIO_Pin_5); //蜂鸣器响 }break; case enBEEP1: //蜂鸣器不响 { GPIO_ResetBits(GPIOB, GPIO_Pin_5); //蜂鸣器不响 }break; } } void ProtocolCpyData(void) { memcpy(ProtocolString, inputString, num+1); memset(inputString, 0x00, sizeof(inputString)); } /*************************************************************************** 串口协议据解析 ***************************************************************************/ void Protocol(void) { switch (ProtocolString[1]) { case run_car: g_newcarstate = enRUN; break; case back_car: g_newcarstate = enBACK; break; case left_car: g_newcarstate = enLEFT;break; case right_car: g_newcarstate = enRIGHT;break; case stop_car: g_newcarstate = enSTOP; break; case low_car: g_newcarstate = enLOW; break; case medium_car: g_newcarstate = enMEDIUM; break; case high_car: g_newcarstate = enHIGH; break; case led_car: g_newcarstate = enLED; break; case led1_car: g_newcarstate = enLED1; break; case beep_car: g_newcarstate = enBEEP; break; case beep1_car: g_newcarstate = enBEEP1; break; } switch (ProtocolString[3]) { case '1': g_newcarstate = enTRIGHT; break; case '2': g_newcarstate = enTLEFT; break; } /*防止据丢包*/ if(strlen((const char *)ProtocolString)<21) { newLineReceived = 0; memset(ProtocolString, 0x00, sizeof(ProtocolString)); return; } newLineReceived = 0; memset(ProtocolString, 0x00, sizeof(ProtocolString)); } 加上遇到障碍物小车就停止
07-04
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值