我想要做一辆带有四个红外检测器和两个驱动电机以及型号为STM32F103RCT6的STM32芯片的智能红外循迹小车电池为两节74V2200mAh的锂电池编程软件为STM32CubeIDE我想得到这个小车实现的具体代码要求利用PWM可以控制小车的转弯和转速整体小车运行能够快速
响应红外信号,稳定地跟随黑线运行。
以下是该智能红外循迹小车的代码实现:
- 定义引脚和常量
#define leftMotorForwardPin GPIO_PIN_0
#define leftMotorBackwardPin GPIO_PIN_1
#define rightMotorForwardPin GPIO_PIN_2
#define rightMotorBackwardPin GPIO_PIN_3
#define IR1_Pin GPIO_PIN_0
#define IR1_GPIO_Port GPIOA
#define IR2_Pin GPIO_PIN_1
#define IR2_GPIO_Port GPIOA
#define IR3_Pin GPIO_PIN_2
#define IR3_GPIO_Port GPIOA
#define IR4_Pin GPIO_PIN_3
#define IR4_GPIO_Port GPIOA
#define IR_THRESHOLD 1000
- 初始化红外检测器和电机引脚
void MX_GPIO_Init(void)
{
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOA_CLK_ENABLE();
/*Configure GPIO pins : IR1_Pin IR2_Pin IR3_Pin IR4_Pin */
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = IR1_Pin | IR2_Pin | IR3_Pin | IR4_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/*Configure GPIO pins : leftMotorForwardPin leftMotorBackwardPin rightMotorForwardPin rightMotorBackwardPin */
GPIO_InitStruct.Pin = leftMotorForwardPin | leftMotorBackwardPin | rightMotorForwardPin | rightMotorBackwardPin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
- 定义电机控制函数
void setMotorSpeed(int leftSpeed, int rightSpeed) {
if (leftSpeed > 0) {
HAL_GPIO_WritePin(GPIOA, leftMotorForwardPin, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, leftMotorBackwardPin, GPIO_PIN_RESET);
} else if (leftSpeed < 0) {
HAL_GPIO_WritePin(GPIOA, leftMotorForwardPin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, leftMotorBackwardPin, GPIO_PIN_SET);
} else {
HAL_GPIO_WritePin(GPIOA, leftMotorForwardPin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, leftMotorBackwardPin, GPIO_PIN_RESET);
}
if (rightSpeed > 0) {
HAL_GPIO_WritePin(GPIOA, rightMotorForwardPin, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, rightMotorBackwardPin, GPIO_PIN_RESET);
} else if (rightSpeed < 0) {
HAL_GPIO_WritePin(GPIOA, rightMotorForwardPin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, rightMotorBackwardPin, GPIO_PIN_SET);
} else {
HAL_GPIO_WritePin(GPIOA, rightMotorForwardPin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, rightMotorBackwardPin, GPIO_PIN_RESET);
}
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, abs(leftSpeed));
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, abs(rightSpeed));
}
- 定义红外检测函数
uint8_t readIR() {
uint8_t ir = 0;
if (HAL_GPIO_ReadPin(IR1_GPIO_Port, IR1_Pin) < IR_THRESHOLD) {
ir += 1;
}
if (HAL_GPIO_ReadPin(IR2_GPIO_Port, IR2_Pin) < IR_THRESHOLD) {
ir += 2;
}
if (HAL_GPIO_ReadPin(IR3_GPIO_Port, IR3_Pin) < IR_THRESHOLD) {
ir += 4;
}
if (HAL_GPIO_ReadPin(IR4_GPIO_Port, IR4_Pin) < IR_THRESHOLD) {
ir += 8;
}
return ir;
}
- 主程序代码
int main(void)
{
HAL_Init();
MX_GPIO_Init();
MX_TIM3_Init();
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_2);
while (1)
{
uint8_t ir = readIR();
if (ir == 0b0001 || ir == 0b0100 || ir == 0b1110) { // 左偏
setMotorSpeed(-250, 250);
} else if (ir == 0b0010 || ir == 0b1000 || ir == 0b0111) { // 右偏
setMotorSpeed(250, -250);
} else if (ir == 0b0011 || ir == 0b0110 || ir == 0b1100) { // 直行
setMotorSpeed(250, 250);
} else { // 停止
setMotorSpeed(0, 0);
}
}
}
这个程序实现了对四个红外检测器的读取,并根据读取结果控制小车的转向和速度。具体实现中,当红外检测到黑线时,会输出低电平,因此可以通过读取引脚电平来判断小车的位置。当检测到小车偏离轨道时,会根据偏离的方向控制电机转速,从而使小车回到轨道上
原文地址: https://www.cveoy.top/t/topic/dq67 著作权归作者所有。请勿转载和采集!