我在进行pid定速巡航小车的代码编写,购买了一块pcb板,但是没有预留马达编译器的接口引脚

,现在只有如图几个引脚空闲,左右电机各需要两个在同一定时器上的引脚,硬件没办法解决,现在有两个办法,一是如图,二是另外用一个stm32c8t6,但是我不会两块板子互通,如果方案1没法进行,那么方案2会用到哪些知识内容
我在进行pid定速巡航小车的代码编写,购买了一块pcb板,但是没有预留马达编译器的接口引脚

上午好☀️☀️☀️️
本答案参考通义千问
你目前的问题是关于在没有预留电机编码器接口的PCB板上,如何实现电机测速,尤其是在无法通过硬件扩展引脚的情况下,如何通过软件或外部芯片来完成这一功能。以下是详细的分析与解决方案:
选择可用引脚:
配置GPIO为输入并启用中断:
编写中断服务函数(ISR):
计算速度:
优化与调试:
// 假设使用PA0和PA1作为编码器A/B相
void Encoder_Init(void) {
GPIO_InitTypeDef GPIO_InitStruct;
// 使能GPIOA时钟
__HAL_RCC_GPIOA_CLK_ENABLE();
// 配置PA0和PA1为输入
GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING_FALLING; // 支持上升/下降沿
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// 使能NVIC中断
HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(EXTI0_IRQn);
}
// 中断服务函数
void EXTI0_IRQHandler(void) {
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
}
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {
if (GPIO_Pin == GPIO_PIN_0) {
// 读取PA1状态,判断方向
uint8_t dir = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1);
if (dir == GPIO_PIN_SET) {
// 正转
} else {
// 反转
}
// 计算速度(此处仅为示例)
static uint32_t last_time = 0;
uint32_t current_time = HAL_GetTick();
if (current_time - last_time > 100) { // 每100ms计算一次
// 计算速度逻辑
last_time = current_time;
}
}
}
准备两块STM32开发板:
在辅助板上实现编码器测速:
主控接收数据:
通信协议设计:
[L_SPEED][R_SPEED])。代码示例(辅助板):
// 辅助板:STM32C8T6
void Encoder_Init(void) {
// 初始化编码器引脚
// ...
}
void UART_Send_Speed(uint16_t left_speed, uint16_t right_speed) {
char buffer[20];
sprintf(buffer, "%d %d", left_speed, right_speed);
HAL_UART_Transmit(&huart1, (uint8_t*)buffer, strlen(buffer), 100);
}
// 主控:原PCB板
void UART_Receive_Handler(void) {
if (HAL_UART_Receive_IT(&huart1, rx_buffer, 1) == HAL_OK) {
// 解析rx_buffer中的速度值
sscanf(rx_buffer, "%d %d", &left_speed, &right_speed);
}
}
| 方案 | 推荐程度 | 说明 | |------|----------|------| | 方案1(软件中断) | ★★★★☆ | 适合小车速度要求不高、编程能力较强的场景。 | | 方案2(外接STM32C8T6) | ★★★★★ | 更可靠、更灵活,适合复杂项目,但需要掌握通信协议。 |
如果你选择方案2,你需要掌握以下知识:
STM32C8T6基本开发:
串口通信(UART):
主从通信协议:
嵌入式C语言编程:
调试技巧:
如需进一步帮助(如具体引脚分配、通信协议设计等),欢迎继续提问!