增加传感器

This commit is contained in:
草团君 2024-04-18 11:10:45 +08:00
parent 5870cee759
commit 542ff3208c
10 changed files with 1058 additions and 963 deletions

View File

@ -41,14 +41,27 @@ void MX_ADC_Init(void)
LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_ADC1); LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_ADC1);
LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOC); LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOC);
LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOB);
/**ADC GPIO Configuration /**ADC GPIO Configuration
PC0 ------> ADC_IN10
PC3 ------> ADC_IN13 PC3 ------> ADC_IN13
PB0 ------> ADC_IN8
*/ */
GPIO_InitStruct.Pin = LL_GPIO_PIN_0;
GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
LL_GPIO_Init(GPIOC, &GPIO_InitStruct);
GPIO_InitStruct.Pin = MG_ADC_IN13_Pin; GPIO_InitStruct.Pin = MG_ADC_IN13_Pin;
GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG; GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
LL_GPIO_Init(MG_ADC_IN13_GPIO_Port, &GPIO_InitStruct); LL_GPIO_Init(MG_ADC_IN13_GPIO_Port, &GPIO_InitStruct);
GPIO_InitStruct.Pin = LL_GPIO_PIN_0;
GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
LL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/* ADC DMA Init */ /* ADC DMA Init */
/* ADC Init */ /* ADC Init */
@ -72,6 +85,14 @@ void MX_ADC_Init(void)
/* USER CODE END ADC_Init 1 */ /* USER CODE END ADC_Init 1 */
/** Configure Regular Channel
*/
LL_ADC_REG_SetSequencerChAdd(ADC1, LL_ADC_CHANNEL_8);
/** Configure Regular Channel
*/
LL_ADC_REG_SetSequencerChAdd(ADC1, LL_ADC_CHANNEL_10);
/** Configure Regular Channel /** Configure Regular Channel
*/ */
LL_ADC_REG_SetSequencerChAdd(ADC1, LL_ADC_CHANNEL_13); LL_ADC_REG_SetSequencerChAdd(ADC1, LL_ADC_CHANNEL_13);

View File

@ -78,12 +78,6 @@ void MX_GPIO_Init(void)
GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
LL_GPIO_Init(GPIOC, &GPIO_InitStruct); LL_GPIO_Init(GPIOC, &GPIO_InitStruct);
/**/
GPIO_InitStruct.Pin = LL_GPIO_PIN_0;
GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
LL_GPIO_Init(GPIOC, &GPIO_InitStruct);
/**/ /**/
GPIO_InitStruct.Pin = LL_GPIO_PIN_1; GPIO_InitStruct.Pin = LL_GPIO_PIN_1;
GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG; GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG;
@ -156,12 +150,6 @@ void MX_GPIO_Init(void)
GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
LL_GPIO_Init(GPIOC, &GPIO_InitStruct); LL_GPIO_Init(GPIOC, &GPIO_InitStruct);
/**/
GPIO_InitStruct.Pin = LL_GPIO_PIN_0;
GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
LL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/**/ /**/
GPIO_InitStruct.Pin = LL_GPIO_PIN_1; GPIO_InitStruct.Pin = LL_GPIO_PIN_1;
GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG; GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG;

View File

@ -198,7 +198,6 @@ void TIM21_IRQHandler(void)
/* USER CODE BEGIN TIM21_IRQn 0 */ /* USER CODE BEGIN TIM21_IRQn 0 */
/* USER CODE END TIM21_IRQn 0 */ /* USER CODE END TIM21_IRQn 0 */
/* USER CODE BEGIN TIM21_IRQn 1 */ /* USER CODE BEGIN TIM21_IRQn 1 */
if (LL_TIM_IsActiveFlag_UPDATE(TIM21)) if (LL_TIM_IsActiveFlag_UPDATE(TIM21))
{ {

File diff suppressed because it is too large Load Diff

View File

@ -15,8 +15,10 @@ typedef struct
typedef struct typedef struct
{ {
calibration_sensor_data_t torsion_in13; // 扭力 calibration_sensor_data_t torsion_in13; // 扭力
calibration_sensor_data_t pressure_in7; // 压力 calibration_sensor_data_t ipressure_in7; // 压力
calibration_sensor_data_t pressure_in8; // 流量 calibration_sensor_data_t iflow_in8; // 流量
calibration_sensor_data_t opressure_in9; // 压力
calibration_sensor_data_t oflow_in10; // 流量
} adcs_t; } adcs_t;
typedef struct typedef struct

View File

@ -19,17 +19,25 @@ static uint8_t adc_inspection(struct flow *fl)
for (;;) for (;;)
{ {
// 扭力 // 扭力
app.adc.torsion_in13.original_value = get_torsion_adc(); app.adc.torsion_in13.original_value = get_sensor_adc(GET_TORSION_VALUE);
app.adc.torsion_in13.calibration_value = torsion_detect(); app.adc.torsion_in13.calibration_value = torsion_detect();
sensor_adc[GET_TORSION_VALUE] = S2B_UINT16(app.adc.torsion_in13.original_value); sensor_adc[GET_TORSION_VALUE] = S2B_UINT16(app.adc.torsion_in13.original_value);
// 压力 // 输入压力
app.adc.pressure_in7.original_value = get_pressure_adc(); app.adc.ipressure_in7.original_value = get_sensor_adc(GET_INPUT_PRESS_VALUE);
app.adc.pressure_in7.calibration_value = pressure_detect(); app.adc.ipressure_in7.calibration_value = pressure_detect(GET_INPUT_PRESS_VALUE);
sensor_adc[GET_PRESSURE_VALUE] = S2B_UINT16(app.adc.pressure_in7.original_value); sensor_adc[GET_INPUT_PRESS_VALUE] = S2B_UINT16(app.adc.ipressure_in7.original_value);
// 流量 // 输出压力
app.adc.pressure_in8.original_value = get_flow_adc(); app.adc.opressure_in9.original_value = get_sensor_adc(GET_OUTPUT_PRESS_VALUE);
app.adc.pressure_in8.calibration_value = flow_detect(); app.adc.opressure_in9.calibration_value = pressure_detect(GET_OUTPUT_PRESS_VALUE);
sensor_adc[GET_FLOW_VALUE] = S2B_UINT16(app.adc.pressure_in8.original_value); sensor_adc[GET_OUTPUT_PRESS_VALUE] = S2B_UINT16(app.adc.opressure_in9.original_value);
// 输入流量
app.adc.iflow_in8.original_value = get_sensor_adc(GET_INPUT_FLOW_VALUE);
app.adc.iflow_in8.calibration_value = flow_detect(GET_INPUT_FLOW_VALUE);
sensor_adc[GET_INPUT_FLOW_VALUE] = S2B_UINT16(app.adc.iflow_in8.original_value);
// 输出流量
app.adc.oflow_in10.original_value = get_sensor_adc(GET_OUTPUT_FLOW_VALUE);
app.adc.oflow_in10.calibration_value = flow_detect(GET_OUTPUT_FLOW_VALUE);
sensor_adc[GET_OUTPUT_FLOW_VALUE] = S2B_UINT16(app.adc.oflow_in10.original_value);
FL_LOCK_DELAY(fl, FL_CLOCK_100MSEC); /* 延时100毫秒 */ FL_LOCK_DELAY(fl, FL_CLOCK_100MSEC); /* 延时100毫秒 */
} }

View File

@ -272,10 +272,29 @@ adc_t adc1 = {
.dma_channel = LL_DMA_CHANNEL_1, .dma_channel = LL_DMA_CHANNEL_1,
}; };
// 扭力单位N·m uint16_t get_sensor_adc(uint8_t id)
uint16_t get_torsion_adc(void)
{ {
uint16_t adc = adc_get_result_average(IN13); uint16_t adc = 0;
switch (id)
{
case GET_TORSION_VALUE: // 扭力单位N·m
adc = adc_get_result_average(IN13);
break;
case GET_INPUT_PRESS_VALUE: // 输入压力单位kPa
adc = adc_get_result_average(IN7);
break;
case GET_OUTPUT_PRESS_VALUE: // 输出压力单位kPa
adc = adc_get_result_average(IN9);
break;
case GET_INPUT_FLOW_VALUE: // 输入流量单位SLPM
adc = adc_get_result_average(IN8);
break;
case GET_OUTPUT_FLOW_VALUE: // 输出流量单位SLPM
adc = adc_get_result_average(IN10);
break;
}
return adc; return adc;
} }
@ -283,43 +302,29 @@ float32 torsion_detect(void)
{ {
float32 adc = 0.0, val = 0.0; float32 adc = 0.0, val = 0.0;
adc = get_torsion_adc(); adc = get_sensor_adc(GET_TORSION_VALUE);
val = adc / 4096 * 3000; val = adc / 4096 * 3000;
val = (val - 1500) / 101 / (1.934 * 3) * 10; val = (val - 1500) / 101 / (1.934 * 3) * 10;
return val; return val;
} }
// 压力单位kPa float32 pressure_detect(uint8_t id)
uint16_t get_pressure_adc(void)
{
uint16_t adc = adc_get_result_average(IN7);
return adc;
}
float32 pressure_detect(void)
{ {
float32 adc = 0.0, val = 0.0; float32 adc = 0.0, val = 0.0;
adc = get_pressure_adc(); adc = get_sensor_adc(id);
val = adc / 4096 * 3000; val = adc / 4096 * 3000;
val = (val - 600) / (10 * 15) / 16 * 1000; val = (val - 600) / (10 * 15) / 16 * 1000;
return val; return val;
} }
// 流量单位SLPM float32 flow_detect(uint8_t id)
uint16_t get_flow_adc(void)
{
uint16_t adc = adc_get_result_average(IN8);
return adc;
}
float32 flow_detect(void)
{ {
float32 adc = 0.0, val = 0.0; float32 adc = 0.0, val = 0.0;
adc = get_flow_adc(); adc = get_sensor_adc(id);
val = adc / 4096 * 3000; val = adc / 4096 * 3000;
val = (val - 600) / (10 * 15) / 16 * 300; val = (val - 600) / (10 * 15) / 16 * 300;
@ -368,6 +373,8 @@ uint8_t test_buffer[UART_RXSIZE] = {0}; // 数据接收缓存
// 传感器测试指令 // 传感器测试指令
static uint8_t test_sensor_cmd(uint8_t cmd, uint8_t *buf) static uint8_t test_sensor_cmd(uint8_t cmd, uint8_t *buf)
{ {
osel_memset(buf, 0, UART_RXSIZE);
uint8_t ver_len = 0; uint8_t ver_len = 0;
uint8_t index = 0; uint8_t index = 0;
frame_msg_t msg; frame_msg_t msg;
@ -376,15 +383,56 @@ static uint8_t test_sensor_cmd(uint8_t cmd, uint8_t *buf)
msg.dev_no = ADC_SENSOR; msg.dev_no = ADC_SENSOR;
msg.cmd_no = cmd; msg.cmd_no = cmd;
msg.len = 0; msg.len = 0;
index = DATA_INDEX; index = DATA_INDEX;
osel_memset(buf, 0, UART_RXSIZE);
osel_memcpy(buf, (uint8_t *)&msg, index); osel_memcpy(buf, (uint8_t *)&msg, index);
buf[index] = xor_compute((uint8_t *)&buf[1], (index - 1)); // 校验
buf[index] = xor_compute((uint8_t *)&buf[1], (index - 1)); // 减掉包头
index += 1; index += 1;
// 包尾
buf[index] = PACKET_ETX; buf[index] = PACKET_ETX;
index += 1; index += 1;
// 帧长度
ver_len = index;
return ver_len;
}
// 电机测试指令
static uint8_t test_motor_cmd(uint8_t cmd, uint8_t *buf)
{
uint8_t ver_len = 0;
uint8_t index = 0;
frame_msg_t msg;
motor_ctrl_t motor_param;
msg.head = PACKET_STX;
msg.state = ST_DEV_NORMAL;
msg.dev_no = ADC_SENSOR;
msg.cmd_no = cmd;
switch (cmd)
{
case MOTOR_MOVE:
msg.len = 5; // 方向1个字节角度4个字节
break;
case MOTOR_STOP:
msg.len = 0;
break;
}
index = DATA_INDEX;
osel_memcpy(buf, (uint8_t *)&msg, index);
if (cmd == MOTOR_MOVE)
{
motor_param.dir = DIR_CW;
motor_param.angle = 1.2;
}
osel_memcpy((uint8_t *)&buf[index], (uint8_t *)&motor_param, sizeof(motor_ctrl_t));
index += sizeof(motor_ctrl_t);
// 校验
buf[index] = xor_compute((uint8_t *)&buf[1], (index - 1)); // 减掉包头
index += 1;
// 包尾
buf[index] = PACKET_ETX;
index += 1;
// 帧长度
ver_len = index; ver_len = index;
return ver_len; return ver_len;
} }
@ -421,6 +469,7 @@ void test_process(void)
len = test_sensor_cmd(self_test.cmd_id, buf); len = test_sensor_cmd(self_test.cmd_id, buf);
break; break;
case TEST_DEV_MOTOR: case TEST_DEV_MOTOR:
len = test_motor_cmd(self_test.cmd_id, buf);
break; break;
default: default:
break; break;

View File

@ -69,8 +69,10 @@ typedef enum
typedef enum typedef enum
{ {
GET_TORSION_VALUE, // 扭力 GET_TORSION_VALUE, // 扭力
GET_PRESSURE_VALUE, // 压力 GET_INPUT_PRESS_VALUE, // 输入压力
GET_FLOW_VALUE, // 流量 GET_OUTPUT_PRESS_VALUE, // 输出压力
GET_INPUT_FLOW_VALUE, // 输入流量
GET_OUTPUT_FLOW_VALUE, // 输出流量
GET_ALL_VALUE, // 全部 GET_ALL_VALUE, // 全部
} sensor_cmd_e; } sensor_cmd_e;
@ -117,12 +119,10 @@ typedef struct
extern uint16_t sensor_adc[GET_ALL_VALUE]; extern uint16_t sensor_adc[GET_ALL_VALUE];
extern void board_init(void); extern void board_init(void);
extern uint16_t get_torsion_adc(void); extern uint16_t get_sensor_adc(uint8_t id);
extern float32 torsion_detect(void); extern float32 torsion_detect(void);
extern uint16_t get_pressure_adc(void); extern float32 pressure_detect(uint8_t id);
extern float32 pressure_detect(void); extern float32 flow_detect(uint8_t id);
extern uint16_t get_flow_adc(void);
extern float32 flow_detect(void);
extern void host_rx_msg_deal(void); extern void host_rx_msg_deal(void);
extern void motor_process_init(void); extern void motor_process_init(void);
extern void test_process(void); extern void test_process(void);

View File

@ -15,8 +15,8 @@ typedef struct MOTOR motor_t;
typedef enum typedef enum
{ {
DIR_CCW = 0, /* 逆时针旋转 */ DIR_CW = 0, /* 顺时针旋转 */
DIR_CW, /* 顺时针旋转 */ DIR_CCW, /* 逆时针旋转 */
} dir_e; } dir_e;
typedef enum typedef enum
{ {

View File

@ -57,18 +57,20 @@ Mcu.Name=STM32L072R(B-Z)Tx
Mcu.Package=LQFP64 Mcu.Package=LQFP64
Mcu.Pin0=PH0-OSC_IN Mcu.Pin0=PH0-OSC_IN
Mcu.Pin1=PH1-OSC_OUT Mcu.Pin1=PH1-OSC_OUT
Mcu.Pin10=PA14 Mcu.Pin10=PA10
Mcu.Pin11=VP_SYS_VS_Systick Mcu.Pin11=PA13
Mcu.Pin12=VP_TIM6_VS_ClockSourceINT Mcu.Pin12=PA14
Mcu.Pin2=PC3 Mcu.Pin13=VP_SYS_VS_Systick
Mcu.Pin3=PB12 Mcu.Pin14=VP_TIM6_VS_ClockSourceINT
Mcu.Pin4=PB13 Mcu.Pin2=PC0
Mcu.Pin5=PB14 Mcu.Pin3=PC3
Mcu.Pin6=PB15 Mcu.Pin4=PB0
Mcu.Pin7=PA9 Mcu.Pin5=PB12
Mcu.Pin8=PA10 Mcu.Pin6=PB13
Mcu.Pin9=PA13 Mcu.Pin7=PB14
Mcu.PinsNb=13 Mcu.Pin8=PB15
Mcu.Pin9=PA9
Mcu.PinsNb=15
Mcu.ThirdPartyNb=0 Mcu.ThirdPartyNb=0
Mcu.UserConstants= Mcu.UserConstants=
Mcu.UserName=STM32L072RBTx Mcu.UserName=STM32L072RBTx
@ -93,6 +95,8 @@ PA14.Mode=Serial_Wire
PA14.Signal=SYS_SWCLK PA14.Signal=SYS_SWCLK
PA9.Mode=Asynchronous PA9.Mode=Asynchronous
PA9.Signal=USART1_TX PA9.Signal=USART1_TX
PB0.Mode=IN8
PB0.Signal=ADC_IN8
PB12.GPIOParameters=GPIO_Speed,PinState,GPIO_Label PB12.GPIOParameters=GPIO_Speed,PinState,GPIO_Label
PB12.GPIO_Label=ENA PB12.GPIO_Label=ENA
PB12.GPIO_Speed=GPIO_SPEED_FREQ_HIGH PB12.GPIO_Speed=GPIO_SPEED_FREQ_HIGH
@ -110,6 +114,8 @@ PB15.GPIOParameters=GPIO_PuPd,GPIO_Label
PB15.GPIO_Label=STOPPER PB15.GPIO_Label=STOPPER
PB15.GPIO_PuPd=GPIO_PULLUP PB15.GPIO_PuPd=GPIO_PULLUP
PB15.Signal=GPXTI15 PB15.Signal=GPXTI15
PC0.Mode=IN10
PC0.Signal=ADC_IN10
PC3.GPIOParameters=GPIO_PuPd,GPIO_Label,GPIO_Mode PC3.GPIOParameters=GPIO_PuPd,GPIO_Label,GPIO_Mode
PC3.GPIO_Label=MG_ADC_IN13 PC3.GPIO_Label=MG_ADC_IN13
PC3.GPIO_Mode=GPIO_MODE_ANALOG PC3.GPIO_Mode=GPIO_MODE_ANALOG