correction et code pid prêt à l'envoi dans les moteurs

This commit is contained in:
Maxime
2025-05-20 14:19:31 +02:00
parent d4378b3af3
commit 5ed4787882
8 changed files with 604 additions and 91 deletions

View File

@@ -38,6 +38,8 @@ extern TIM_HandleTypeDef htim2;
extern TIM_HandleTypeDef htim3; extern TIM_HandleTypeDef htim3;
extern TIM_HandleTypeDef htim8;
/* USER CODE BEGIN Private defines */ /* USER CODE BEGIN Private defines */
/* USER CODE END Private defines */ /* USER CODE END Private defines */
@@ -45,6 +47,7 @@ extern TIM_HandleTypeDef htim3;
void MX_TIM1_Init(void); void MX_TIM1_Init(void);
void MX_TIM2_Init(void); void MX_TIM2_Init(void);
void MX_TIM3_Init(void); void MX_TIM3_Init(void);
void MX_TIM8_Init(void);
void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim); void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim);

View File

@@ -22,7 +22,6 @@
#include "usb_device.h" #include "usb_device.h"
#include "gpio.h" #include "gpio.h"
/* Private includes ----------------------------------------------------------*/ /* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */ /* USER CODE BEGIN Includes */
@@ -98,6 +97,7 @@ int main(void)
MX_TIM1_Init(); MX_TIM1_Init();
MX_TIM3_Init(); MX_TIM3_Init();
MX_USB_Device_Init(); MX_USB_Device_Init();
MX_TIM8_Init();
/* USER CODE BEGIN 2 */ /* USER CODE BEGIN 2 */
// HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_1); // IN1A // HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_1); // IN1A

View File

@@ -79,7 +79,7 @@ void determinationCoefPosition(Point objectifPoint, Point pointActuel, PidPositi
int erreurG = pidG.getPWMCommand(nouvelOrdreG); int erreurG = pidG.getPWMCommand(nouvelOrdreG);
int erreurD = pidD.getPWMCommand(nouvelOrdreD); int erreurD = pidD.getPWMCommand(nouvelOrdreD);
const int maxErreur = 20; const int maxErreur = 5;
if (erreurG > maxErreur) { if (erreurG > maxErreur) {
erreurG = maxErreur; erreurG = maxErreur;
@@ -112,7 +112,7 @@ void ModelecOdometrySetup(void **out_pid, void **out_pidG, void **out_pidD) {
theta = 0.0f; theta = 0.0f;
//motor.accelerer(300); //motor.accelerer(300);
*out_pid = new PidPosition(0,0,0,0,0,0,Point()); *out_pid = new PidPosition(1.5,0.02,0.4,3.0, 0.01, 0.6, Point());
*out_pidG = new PidVitesse(0.2, 0.05, 0.01, 0); *out_pidG = new PidVitesse(0.2, 0.05, 0.01, 0);
*out_pidD = new PidVitesse(0.2, 0.05, 0.01, 0); *out_pidD = new PidVitesse(0.2, 0.05, 0.01, 0);
@@ -172,8 +172,8 @@ void ModelecOdometryUpdate() {
//motor.setLeftCurrentSpeed(vitesseLeft); //motor.setLeftCurrentSpeed(vitesseLeft);
//motor.setRightCurrentSpeed(vitesseRight); //motor.setRightCurrentSpeed(vitesseRight);
motor.setLeftCurrentSpeed(motor.getLeftCurrentSpeed()+0.05); motor.setLeftCurrentSpeed(vitesseLeft);
motor.setRightCurrentSpeed(motor.getRightCurrentSpeed()+0.05); motor.setRightCurrentSpeed(vitesseRight);
} }
void publishStatus(){ void publishStatus(){
@@ -195,11 +195,11 @@ void ModelecOdometryLoop(void* pid, void* pidG, void* pidD) {
//On met à jour toutes les 10ms //On met à jour toutes les 10ms
if (isDelayPassed(10)) { if (isDelayPassed(10)) {
ModelecOdometryUpdate(); ModelecOdometryUpdate();
USB_Comm_Process(); //USB_Comm_Process();
/*
HAL_Delay(1000); //HAL_Delay(1000);
Point currentPoint(x, y,theta, StatePoint::INTERMEDIAIRE); Point currentPoint(x, y,theta, StatePoint::INTERMEDIAIRE);
Point targetPoint(0.20, 0.20,0, StatePoint::FINAL); Point targetPoint(0.50, 0.0,0, StatePoint::FINAL);
char debugMsg[128]; char debugMsg[128];
sprintf(debugMsg, "Speed avant determination : L=%.3f | R=%.3f\r\n", sprintf(debugMsg, "Speed avant determination : L=%.3f | R=%.3f\r\n",
motor.getLeftCurrentSpeed(), motor.getRightCurrentSpeed()); motor.getLeftCurrentSpeed(), motor.getRightCurrentSpeed());
@@ -207,9 +207,9 @@ void ModelecOdometryLoop(void* pid, void* pidG, void* pidD) {
determinationCoefPosition(currentPoint,targetPoint, *pidPosition, *pidVitesseG, *pidVitesseD); determinationCoefPosition(currentPoint,targetPoint, *pidPosition, *pidVitesseG, *pidVitesseD);
HAL_Delay(1000); //HAL_Delay(1000);
motor.update(); motor.update();
*/

View File

@@ -125,6 +125,15 @@ void Motor::stopTurning() {
void Motor::update() { void Motor::update() {
const int16_t PWM_MAX = 626;
if (this->leftTarget_PWM > PWM_MAX) this->leftTarget_PWM = PWM_MAX;
if (this->leftTarget_PWM < -PWM_MAX) this->leftTarget_PWM = -PWM_MAX;
if (this->rightTarget_PWM > PWM_MAX) this->rightTarget_PWM = PWM_MAX;
if (this->rightTarget_PWM < -PWM_MAX) this->rightTarget_PWM = -PWM_MAX;
// Appliquer targetSpeed dans currentSpeed // Appliquer targetSpeed dans currentSpeed
this->leftCurrent_PWM = this->leftTarget_PWM; this->leftCurrent_PWM = this->leftTarget_PWM;
this->rightCurrent_PWM = this->rightTarget_PWM; this->rightCurrent_PWM = this->rightTarget_PWM;
@@ -146,12 +155,15 @@ void Motor::update() {
TIM1->CCR2 = static_cast<uint16_t>(-this->rightCurrent_PWM); // IN2B (arrière) TIM1->CCR2 = static_cast<uint16_t>(-this->rightCurrent_PWM); // IN2B (arrière)
TIM1->CCR1 = 0; // IN1B TIM1->CCR1 = 0; // IN1B
} }
//[STM32] PWM_LEFT: 600 | PWM_RIGHT: 600 || TIM8->CCR1: 0 | TIM8->CCR2: 0 M1->CCR1: 600 | TIM1->CCR2: 0
char msg[128]; char msg[128];
snprintf(msg, sizeof(msg), snprintf(msg, sizeof(msg),
"TIM8->CCR1: %lu | TIM8->CCR2: %lu | TIM1->CCR1: %lu | TIM1->CCR2: %lu\r\n", "PWM_LEFT: %d | PWM_RIGHT: %d || TIM8->CCR1: %lu | TIM8->CCR2: %lu | TIM1->CCR1: %lu | TIM1->CCR2: %lu\r\n",
this->leftCurrent_PWM, this->rightCurrent_PWM,
(uint32_t)TIM8->CCR1, (uint32_t)TIM8->CCR2, (uint32_t)TIM8->CCR1, (uint32_t)TIM8->CCR2,
(uint32_t)TIM1->CCR1, (uint32_t)TIM1->CCR2); (uint32_t)TIM1->CCR1, (uint32_t)TIM1->CCR2);
CDC_Transmit_FS((uint8_t*)msg, strlen(msg)); CDC_Transmit_FS((uint8_t*)msg, strlen(msg));
} }

View File

@@ -27,6 +27,7 @@
TIM_HandleTypeDef htim1; TIM_HandleTypeDef htim1;
TIM_HandleTypeDef htim2; TIM_HandleTypeDef htim2;
TIM_HandleTypeDef htim3; TIM_HandleTypeDef htim3;
TIM_HandleTypeDef htim8;
/* TIM1 init function */ /* TIM1 init function */
void MX_TIM1_Init(void) void MX_TIM1_Init(void)
@@ -196,6 +197,87 @@ void MX_TIM3_Init(void)
/* USER CODE END TIM3_Init 2 */ /* USER CODE END TIM3_Init 2 */
}
/* TIM8 init function */
void MX_TIM8_Init(void)
{
/* USER CODE BEGIN TIM8_Init 0 */
/* USER CODE END TIM8_Init 0 */
TIM_ClockConfigTypeDef sClockSourceConfig = {0};
TIM_MasterConfigTypeDef sMasterConfig = {0};
TIM_OC_InitTypeDef sConfigOC = {0};
TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0};
/* USER CODE BEGIN TIM8_Init 1 */
/* USER CODE END TIM8_Init 1 */
htim8.Instance = TIM8;
htim8.Init.Prescaler = 0;
htim8.Init.CounterMode = TIM_COUNTERMODE_UP;
htim8.Init.Period = 630;
htim8.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim8.Init.RepetitionCounter = 0;
htim8.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
if (HAL_TIM_Base_Init(&htim8) != HAL_OK)
{
Error_Handler();
}
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
if (HAL_TIM_ConfigClockSource(&htim8, &sClockSourceConfig) != HAL_OK)
{
Error_Handler();
}
if (HAL_TIM_PWM_Init(&htim8) != HAL_OK)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterOutputTrigger2 = TIM_TRGO2_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim8, &sMasterConfig) != HAL_OK)
{
Error_Handler();
}
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 0;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
if (HAL_TIM_PWM_ConfigChannel(&htim8, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
{
Error_Handler();
}
if (HAL_TIM_PWM_ConfigChannel(&htim8, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
{
Error_Handler();
}
sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;
sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;
sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
sBreakDeadTimeConfig.DeadTime = 0;
sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;
sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
sBreakDeadTimeConfig.BreakFilter = 0;
sBreakDeadTimeConfig.BreakAFMode = TIM_BREAK_AFMODE_INPUT;
sBreakDeadTimeConfig.Break2State = TIM_BREAK2_DISABLE;
sBreakDeadTimeConfig.Break2Polarity = TIM_BREAK2POLARITY_HIGH;
sBreakDeadTimeConfig.Break2Filter = 0;
sBreakDeadTimeConfig.Break2AFMode = TIM_BREAK_AFMODE_INPUT;
sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
if (HAL_TIMEx_ConfigBreakDeadTime(&htim8, &sBreakDeadTimeConfig) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN TIM8_Init 2 */
/* USER CODE END TIM8_Init 2 */
HAL_TIM_MspPostInit(&htim8);
} }
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle) void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
@@ -212,6 +294,17 @@ void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
/* USER CODE END TIM1_MspInit 1 */ /* USER CODE END TIM1_MspInit 1 */
} }
else if(tim_baseHandle->Instance==TIM8)
{
/* USER CODE BEGIN TIM8_MspInit 0 */
/* USER CODE END TIM8_MspInit 0 */
/* TIM8 clock enable */
__HAL_RCC_TIM8_CLK_ENABLE();
/* USER CODE BEGIN TIM8_MspInit 1 */
/* USER CODE END TIM8_MspInit 1 */
}
} }
void HAL_TIM_Encoder_MspInit(TIM_HandleTypeDef* tim_encoderHandle) void HAL_TIM_Encoder_MspInit(TIM_HandleTypeDef* tim_encoderHandle)
@@ -284,7 +377,6 @@ void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle)
/* USER CODE BEGIN TIM1_MspPostInit 0 */ /* USER CODE BEGIN TIM1_MspPostInit 0 */
/* USER CODE END TIM1_MspPostInit 0 */ /* USER CODE END TIM1_MspPostInit 0 */
__HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE();
/**TIM1 GPIO Configuration /**TIM1 GPIO Configuration
PA8 ------> TIM1_CH1 PA8 ------> TIM1_CH1
@@ -301,6 +393,35 @@ void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle)
/* USER CODE END TIM1_MspPostInit 1 */ /* USER CODE END TIM1_MspPostInit 1 */
} }
else if(timHandle->Instance==TIM8)
{
/* USER CODE BEGIN TIM8_MspPostInit 0 */
/* USER CODE END TIM8_MspPostInit 0 */
__HAL_RCC_GPIOA_CLK_ENABLE();
/**TIM8 GPIO Configuration
PA14 ------> TIM8_CH2
PA15 ------> TIM8_CH1
*/
GPIO_InitStruct.Pin = GPIO_PIN_14;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate = GPIO_AF5_TIM8;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_15;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate = GPIO_AF2_TIM8;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* USER CODE BEGIN TIM8_MspPostInit 1 */
/* USER CODE END TIM8_MspPostInit 1 */
}
} }
@@ -318,6 +439,17 @@ void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle)
/* USER CODE END TIM1_MspDeInit 1 */ /* USER CODE END TIM1_MspDeInit 1 */
} }
else if(tim_baseHandle->Instance==TIM8)
{
/* USER CODE BEGIN TIM8_MspDeInit 0 */
/* USER CODE END TIM8_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_TIM8_CLK_DISABLE();
/* USER CODE BEGIN TIM8_MspDeInit 1 */
/* USER CODE END TIM8_MspDeInit 1 */
}
} }
void HAL_TIM_Encoder_MspDeInit(TIM_HandleTypeDef* tim_encoderHandle) void HAL_TIM_Encoder_MspDeInit(TIM_HandleTypeDef* tim_encoderHandle)

View File

@@ -1,50 +1,142 @@
/* usbd_cdc_if.c */ /* USER CODE BEGIN Header */
/**
******************************************************************************
* @file : usbd_cdc_if.c
* @version : v3.0_Cube
* @brief : Usb device for Virtual Com Port.
******************************************************************************
* @attention
*
* Copyright (c) 2025 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 "usbd_cdc_if.h" #include "usbd_cdc_if.h"
#include <string.h>
#include <stdio.h> /* USER CODE BEGIN INCLUDE */
/* USER CODE END INCLUDE */
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
/* USER CODE END PV */
/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
* @brief Usb device library.
* @{
*/
/** @addtogroup USBD_CDC_IF
* @{
*/
/** @defgroup USBD_CDC_IF_Private_TypesDefinitions USBD_CDC_IF_Private_TypesDefinitions
* @brief Private types.
* @{
*/
/* USER CODE BEGIN PRIVATE_TYPES */
/* USER CODE END PRIVATE_TYPES */
/**
* @}
*/
/** @defgroup USBD_CDC_IF_Private_Defines USBD_CDC_IF_Private_Defines
* @brief Private defines.
* @{
*/
/* USER CODE BEGIN PRIVATE_DEFINES */
/* USER CODE END PRIVATE_DEFINES */
/**
* @}
*/
/** @defgroup USBD_CDC_IF_Private_Macros USBD_CDC_IF_Private_Macros
* @brief Private macros.
* @{
*/
/* USER CODE BEGIN PRIVATE_MACRO */
/* USER CODE END PRIVATE_MACRO */
/**
* @}
*/
/** @defgroup USBD_CDC_IF_Private_Variables USBD_CDC_IF_Private_Variables
* @brief Private variables.
* @{
*/
/* Create buffer for reception and transmission */
/* It's up to user to redefine and/or remove those define */
/** Received data over USB are stored in this buffer */
uint8_t UserRxBufferFS[APP_RX_DATA_SIZE];
/** Data to send over USB CDC are stored in this buffer */
uint8_t UserTxBufferFS[APP_TX_DATA_SIZE];
/* USER CODE BEGIN PRIVATE_VARIABLES */
/* USER CODE END PRIVATE_VARIABLES */
/**
* @}
*/
/** @defgroup USBD_CDC_IF_Exported_Variables USBD_CDC_IF_Exported_Variables
* @brief Public variables.
* @{
*/
extern USBD_HandleTypeDef hUsbDeviceFS; extern USBD_HandleTypeDef hUsbDeviceFS;
static uint8_t UserRxBufferFS[APP_RX_DATA_SIZE]; /* USER CODE BEGIN EXPORTED_VARIABLES */
static uint8_t UserTxBufferFS[APP_TX_DATA_SIZE];
static int8_t CDC_Init_FS(void) /* USER CODE END EXPORTED_VARIABLES */
/**
* @}
*/
/** @defgroup USBD_CDC_IF_Private_FunctionPrototypes USBD_CDC_IF_Private_FunctionPrototypes
* @brief Private functions declaration.
* @{
*/
static int8_t CDC_Init_FS(void);
static int8_t CDC_DeInit_FS(void);
static int8_t CDC_Control_FS(uint8_t cmd, uint8_t* pbuf, uint16_t length);
static int8_t CDC_Receive_FS(uint8_t* pbuf, uint32_t *Len);
static int8_t CDC_TransmitCplt_FS(uint8_t *pbuf, uint32_t *Len, uint8_t epnum);
/* USER CODE BEGIN PRIVATE_FUNCTIONS_DECLARATION */
/* USER CODE END PRIVATE_FUNCTIONS_DECLARATION */
/**
* @}
*/
USBD_CDC_ItfTypeDef USBD_Interface_fops_FS =
{ {
USBD_CDC_SetTxBuffer(&hUsbDeviceFS, UserTxBufferFS, 0);
USBD_CDC_SetRxBuffer(&hUsbDeviceFS, UserRxBufferFS);
USBD_CDC_ReceivePacket(&hUsbDeviceFS);
return (USBD_OK);
}
static int8_t CDC_DeInit_FS(void)
{
return (USBD_OK);
}
static int8_t CDC_Control_FS(uint8_t cmd, uint8_t* pbuf, uint16_t length)
{
return (USBD_OK);
}
static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
{
Buf[*Len] = '\0';
USB_CDC_ProcessCommand((char*)Buf);
USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);
USBD_CDC_ReceivePacket(&hUsbDeviceFS);
return (USBD_OK);
}
static int8_t CDC_TransmitCplt_FS(uint8_t *Buf, uint32_t *Len, uint8_t epnum)
{
UNUSED(Buf);
UNUSED(Len);
UNUSED(epnum);
return (USBD_OK);
}
USBD_CDC_ItfTypeDef USBD_Interface_fops_FS = {
CDC_Init_FS, CDC_Init_FS,
CDC_DeInit_FS, CDC_DeInit_FS,
CDC_Control_FS, CDC_Control_FS,
@@ -52,35 +144,185 @@ USBD_CDC_ItfTypeDef USBD_Interface_fops_FS = {
CDC_TransmitCplt_FS CDC_TransmitCplt_FS
}; };
uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len) /* Private functions ---------------------------------------------------------*/
/**
* @brief Initializes the CDC media low layer over the FS USB IP
* @retval USBD_OK if all operations are OK else USBD_FAIL
*/
static int8_t CDC_Init_FS(void)
{ {
if (hUsbDeviceFS.pClassData == NULL) return USBD_FAIL; /* USER CODE BEGIN 3 */
USBD_CDC_SetTxBuffer(&hUsbDeviceFS, Buf, Len); /* Set Application Buffers */
return USBD_CDC_TransmitPacket(&hUsbDeviceFS); USBD_CDC_SetTxBuffer(&hUsbDeviceFS, UserTxBufferFS, 0);
USBD_CDC_SetRxBuffer(&hUsbDeviceFS, UserRxBufferFS);
return (USBD_OK);
/* USER CODE END 3 */
} }
/* Command parser */ /**
void USB_CDC_ProcessCommand(const char* command) * @brief DeInitializes the CDC media low layer
* @retval USBD_OK if all operations are OK else USBD_FAIL
*/
static int8_t CDC_DeInit_FS(void)
{ {
char response[APP_TX_DATA_SIZE]; /* USER CODE BEGIN 4 */
return (USBD_OK);
/* USER CODE END 4 */
}
if (strncmp(command, "GET;POS", 7) == 0) { /**
snprintf(response, sizeof(response), "SET;POS;100;200;1.57\r\n"); * @brief Manage the CDC class requests
} else if (strncmp(command, "GET;SPEED", 9) == 0) { * @param cmd: Command code
snprintf(response, sizeof(response), "SET;SPEED;10;20;0.5\r\n"); * @param pbuf: Buffer containing command data (request parameters)
} else if (strncmp(command, "GET;DIST;", 9) == 0) { * @param length: Number of data to be sent (in bytes)
int tof_id = atoi(command + 9); * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL
snprintf(response, sizeof(response), "SET;DIST;%d;123\r\n", tof_id); */
} else if (strncmp(command, "GET;PID", 7) == 0) { static int8_t CDC_Control_FS(uint8_t cmd, uint8_t* pbuf, uint16_t length)
snprintf(response, sizeof(response), "SET;PID;1.0;0.5;0.1\r\n"); {
} else if (strncmp(command, "SET;POS;", 9) == 0 || /* USER CODE BEGIN 5 */
strncmp(command, "SET;PID;", 9) == 0 || switch(cmd)
strncmp(command, "SET;START;", 11) == 0 || {
strncmp(command, "SET;WAYPOINT;", 13) == 0) { case CDC_SEND_ENCAPSULATED_COMMAND:
snprintf(response, sizeof(response), "OK;%s\r\n", command + 4);
} else { break;
snprintf(response, sizeof(response), "KO;%s\r\n", command);
case CDC_GET_ENCAPSULATED_RESPONSE:
break;
case CDC_SET_COMM_FEATURE:
break;
case CDC_GET_COMM_FEATURE:
break;
case CDC_CLEAR_COMM_FEATURE:
break;
/*******************************************************************************/
/* Line Coding Structure */
/*-----------------------------------------------------------------------------*/
/* Offset | Field | Size | Value | Description */
/* 0 | dwDTERate | 4 | Number |Data terminal rate, in bits per second*/
/* 4 | bCharFormat | 1 | Number | Stop bits */
/* 0 - 1 Stop bit */
/* 1 - 1.5 Stop bits */
/* 2 - 2 Stop bits */
/* 5 | bParityType | 1 | Number | Parity */
/* 0 - None */
/* 1 - Odd */
/* 2 - Even */
/* 3 - Mark */
/* 4 - Space */
/* 6 | bDataBits | 1 | Number Data bits (5, 6, 7, 8 or 16). */
/*******************************************************************************/
case CDC_SET_LINE_CODING:
break;
case CDC_GET_LINE_CODING:
break;
case CDC_SET_CONTROL_LINE_STATE:
break;
case CDC_SEND_BREAK:
break;
default:
break;
} }
CDC_Transmit_FS((uint8_t*)response, strlen(response)); return (USBD_OK);
/* USER CODE END 5 */
} }
/**
* @brief Data received over USB OUT endpoint are sent over CDC interface
* through this function.
*
* @note
* This function will issue a NAK packet on any OUT packet received on
* USB endpoint until exiting this function. If you exit this function
* before transfer is complete on CDC interface (ie. using DMA controller)
* it will result in receiving more data while previous ones are still
* not sent.
*
* @param Buf: Buffer of data to be received
* @param Len: Number of data received (in bytes)
* @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL
*/
static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
{
/* USER CODE BEGIN 6 */
USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);
USBD_CDC_ReceivePacket(&hUsbDeviceFS);
return (USBD_OK);
/* USER CODE END 6 */
}
/**
* @brief CDC_Transmit_FS
* Data to send over USB IN endpoint are sent over CDC interface
* through this function.
* @note
*
*
* @param Buf: Buffer of data to be sent
* @param Len: Number of data to be sent (in bytes)
* @retval USBD_OK if all operations are OK else USBD_FAIL or USBD_BUSY
*/
uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len)
{
uint8_t result = USBD_OK;
/* USER CODE BEGIN 7 */
USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*)hUsbDeviceFS.pClassData;
if (hcdc->TxState != 0){
return USBD_BUSY;
}
USBD_CDC_SetTxBuffer(&hUsbDeviceFS, Buf, Len);
result = USBD_CDC_TransmitPacket(&hUsbDeviceFS);
/* USER CODE END 7 */
return result;
}
/**
* @brief CDC_TransmitCplt_FS
* Data transmitted callback
*
* @note
* This function is IN transfer complete callback used to inform user that
* the submitted Data is successfully sent over USB.
*
* @param Buf: Buffer of data to be received
* @param Len: Number of data received (in bytes)
* @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL
*/
static int8_t CDC_TransmitCplt_FS(uint8_t *Buf, uint32_t *Len, uint8_t epnum)
{
uint8_t result = USBD_OK;
/* USER CODE BEGIN 13 */
UNUSED(Buf);
UNUSED(Len);
UNUSED(epnum);
/* USER CODE END 13 */
return result;
}
/* USER CODE BEGIN PRIVATE_FUNCTIONS_IMPLEMENTATION */
/* USER CODE END PRIVATE_FUNCTIONS_IMPLEMENTATION */
/**
* @}
*/
/**
* @}
*/

View File

@@ -1,5 +1,24 @@
/* usbd_cdc_if.h */ /* USER CODE BEGIN Header */
/**
******************************************************************************
* @file : usbd_cdc_if.h
* @version : v3.0_Cube
* @brief : Header for usbd_cdc_if.c file.
******************************************************************************
* @attention
*
* Copyright (c) 2025 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 */
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __USBD_CDC_IF_H__ #ifndef __USBD_CDC_IF_H__
#define __USBD_CDC_IF_H__ #define __USBD_CDC_IF_H__
@@ -7,18 +26,106 @@
extern "C" { extern "C" {
#endif #endif
/* Includes ------------------------------------------------------------------*/
#include "usbd_cdc.h" #include "usbd_cdc.h"
/* USER CODE BEGIN INCLUDE */
/* USER CODE END INCLUDE */
/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
* @brief For Usb device.
* @{
*/
/** @defgroup USBD_CDC_IF USBD_CDC_IF
* @brief Usb VCP device module
* @{
*/
/** @defgroup USBD_CDC_IF_Exported_Defines USBD_CDC_IF_Exported_Defines
* @brief Defines.
* @{
*/
/* Define size for the receive and transmit buffer over CDC */
#define APP_RX_DATA_SIZE 2048 #define APP_RX_DATA_SIZE 2048
#define APP_TX_DATA_SIZE 2048 #define APP_TX_DATA_SIZE 2048
/* USER CODE BEGIN EXPORTED_DEFINES */
/* USER CODE END EXPORTED_DEFINES */
/**
* @}
*/
/** @defgroup USBD_CDC_IF_Exported_Types USBD_CDC_IF_Exported_Types
* @brief Types.
* @{
*/
/* USER CODE BEGIN EXPORTED_TYPES */
/* USER CODE END EXPORTED_TYPES */
/**
* @}
*/
/** @defgroup USBD_CDC_IF_Exported_Macros USBD_CDC_IF_Exported_Macros
* @brief Aliases.
* @{
*/
/* USER CODE BEGIN EXPORTED_MACRO */
/* USER CODE END EXPORTED_MACRO */
/**
* @}
*/
/** @defgroup USBD_CDC_IF_Exported_Variables USBD_CDC_IF_Exported_Variables
* @brief Public variables.
* @{
*/
/** CDC Interface callback. */
extern USBD_CDC_ItfTypeDef USBD_Interface_fops_FS; extern USBD_CDC_ItfTypeDef USBD_Interface_fops_FS;
/* USER CODE BEGIN EXPORTED_VARIABLES */
/* USER CODE END EXPORTED_VARIABLES */
/**
* @}
*/
/** @defgroup USBD_CDC_IF_Exported_FunctionsPrototype USBD_CDC_IF_Exported_FunctionsPrototype
* @brief Public functions declaration.
* @{
*/
uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len); uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len);
void USB_CDC_ProcessCommand(const char* command);
/* USER CODE BEGIN EXPORTED_FUNCTIONS */
/* USER CODE END EXPORTED_FUNCTIONS */
/**
* @}
*/
/**
* @}
*/
/**
* @}
*/
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
#endif /* __USBD_CDC_IF_H__ */ #endif /* __USBD_CDC_IF_H__ */

View File

@@ -13,25 +13,29 @@ Mcu.IP2=SYS
Mcu.IP3=TIM1 Mcu.IP3=TIM1
Mcu.IP4=TIM2 Mcu.IP4=TIM2
Mcu.IP5=TIM3 Mcu.IP5=TIM3
Mcu.IP6=USB Mcu.IP6=TIM8
Mcu.IP7=USB_DEVICE Mcu.IP7=USB
Mcu.IPNb=8 Mcu.IP8=USB_DEVICE
Mcu.IPNb=9
Mcu.Name=STM32G491K(C-E)Ux Mcu.Name=STM32G491K(C-E)Ux
Mcu.Package=UFQFPN32 Mcu.Package=UFQFPN32
Mcu.Pin0=PF0-OSC_IN Mcu.Pin0=PF0-OSC_IN
Mcu.Pin1=PA0 Mcu.Pin1=PA0
Mcu.Pin10=VP_SYS_VS_DBSignals Mcu.Pin10=PB4
Mcu.Pin11=VP_TIM1_VS_ClockSourceINT Mcu.Pin11=VP_SYS_VS_Systick
Mcu.Pin12=VP_USB_DEVICE_VS_USB_DEVICE_CDC_FS Mcu.Pin12=VP_SYS_VS_DBSignals
Mcu.Pin13=VP_TIM1_VS_ClockSourceINT
Mcu.Pin14=VP_TIM8_VS_ClockSourceINT
Mcu.Pin15=VP_USB_DEVICE_VS_USB_DEVICE_CDC_FS
Mcu.Pin2=PA1 Mcu.Pin2=PA1
Mcu.Pin3=PA4 Mcu.Pin3=PA4
Mcu.Pin4=PA8 Mcu.Pin4=PA8
Mcu.Pin5=PA9 Mcu.Pin5=PA9
Mcu.Pin6=PA11 Mcu.Pin6=PA11
Mcu.Pin7=PA12 Mcu.Pin7=PA12
Mcu.Pin8=PB4 Mcu.Pin8=PA14
Mcu.Pin9=VP_SYS_VS_Systick Mcu.Pin9=PA15
Mcu.PinsNb=13 Mcu.PinsNb=16
Mcu.ThirdPartyNb=0 Mcu.ThirdPartyNb=0
Mcu.UserConstants= Mcu.UserConstants=
Mcu.UserName=STM32G491KEUx Mcu.UserName=STM32G491KEUx
@@ -64,6 +68,8 @@ PA11.Mode=Device
PA11.Signal=USB_DM PA11.Signal=USB_DM
PA12.Mode=Device PA12.Mode=Device
PA12.Signal=USB_DP PA12.Signal=USB_DP
PA14.Signal=S_TIM8_CH2
PA15.Signal=S_TIM8_CH1
PA4.GPIOParameters=GPIO_Speed,GPIO_PuPd PA4.GPIOParameters=GPIO_Speed,GPIO_PuPd
PA4.GPIO_PuPd=GPIO_PULLUP PA4.GPIO_PuPd=GPIO_PULLUP
PA4.GPIO_Speed=GPIO_SPEED_FREQ_HIGH PA4.GPIO_Speed=GPIO_SPEED_FREQ_HIGH
@@ -163,6 +169,10 @@ SH.S_TIM3_CH1.0=TIM3_CH1,Encoder_Interface
SH.S_TIM3_CH1.ConfNb=1 SH.S_TIM3_CH1.ConfNb=1
SH.S_TIM3_CH2.0=TIM3_CH2,Encoder_Interface SH.S_TIM3_CH2.0=TIM3_CH2,Encoder_Interface
SH.S_TIM3_CH2.ConfNb=1 SH.S_TIM3_CH2.ConfNb=1
SH.S_TIM8_CH1.0=TIM8_CH1,PWM Generation1 CH1
SH.S_TIM8_CH1.ConfNb=1
SH.S_TIM8_CH2.0=TIM8_CH2,PWM Generation2 CH2
SH.S_TIM8_CH2.ConfNb=1
TIM1.AutoReloadPreload=TIM_AUTORELOAD_PRELOAD_ENABLE TIM1.AutoReloadPreload=TIM_AUTORELOAD_PRELOAD_ENABLE
TIM1.Channel-PWM\ Generation1\ CH1=TIM_CHANNEL_1 TIM1.Channel-PWM\ Generation1\ CH1=TIM_CHANNEL_1
TIM1.Channel-PWM\ Generation2\ CH2=TIM_CHANNEL_2 TIM1.Channel-PWM\ Generation2\ CH2=TIM_CHANNEL_2
@@ -173,6 +183,11 @@ TIM2.IPParameters=PeriodNoDither,EncoderMode
TIM2.PeriodNoDither=65535 TIM2.PeriodNoDither=65535
TIM3.EncoderMode=TIM_ENCODERMODE_TI12 TIM3.EncoderMode=TIM_ENCODERMODE_TI12
TIM3.IPParameters=EncoderMode TIM3.IPParameters=EncoderMode
TIM8.AutoReloadPreload=TIM_AUTORELOAD_PRELOAD_ENABLE
TIM8.Channel-PWM\ Generation1\ CH1=TIM_CHANNEL_1
TIM8.Channel-PWM\ Generation2\ CH2=TIM_CHANNEL_2
TIM8.IPParameters=Channel-PWM Generation1 CH1,Channel-PWM Generation2 CH2,PeriodNoDither,AutoReloadPreload
TIM8.PeriodNoDither=630
USB_DEVICE.CLASS_NAME_FS=CDC USB_DEVICE.CLASS_NAME_FS=CDC
USB_DEVICE.IPParameters=VirtualMode,VirtualModeFS,CLASS_NAME_FS USB_DEVICE.IPParameters=VirtualMode,VirtualModeFS,CLASS_NAME_FS
USB_DEVICE.VirtualMode=Cdc USB_DEVICE.VirtualMode=Cdc
@@ -183,6 +198,8 @@ VP_SYS_VS_Systick.Mode=SysTick
VP_SYS_VS_Systick.Signal=SYS_VS_Systick VP_SYS_VS_Systick.Signal=SYS_VS_Systick
VP_TIM1_VS_ClockSourceINT.Mode=Internal VP_TIM1_VS_ClockSourceINT.Mode=Internal
VP_TIM1_VS_ClockSourceINT.Signal=TIM1_VS_ClockSourceINT VP_TIM1_VS_ClockSourceINT.Signal=TIM1_VS_ClockSourceINT
VP_TIM8_VS_ClockSourceINT.Mode=Internal
VP_TIM8_VS_ClockSourceINT.Signal=TIM8_VS_ClockSourceINT
VP_USB_DEVICE_VS_USB_DEVICE_CDC_FS.Mode=CDC_FS VP_USB_DEVICE_VS_USB_DEVICE_CDC_FS.Mode=CDC_FS
VP_USB_DEVICE_VS_USB_DEVICE_CDC_FS.Signal=USB_DEVICE_VS_USB_DEVICE_CDC_FS VP_USB_DEVICE_VS_USB_DEVICE_CDC_FS.Signal=USB_DEVICE_VS_USB_DEVICE_CDC_FS
board=custom board=custom