用cube的hal库函数编写小车寻迹代码 电机不用PWM控制
时间: 2024-02-19 15:57:20 浏览: 19
以下是一个使用 Cube HAL 库函数编写的小车寻迹代码示例,其中电机控制不使用 PWM:
```c
#include "main.h"
#define LEFT_SENSOR_PIN GPIO_PIN_0
#define RIGHT_SENSOR_PIN GPIO_PIN_1
#define LEFT_MOTOR_FORWARD_PIN GPIO_PIN_2
#define LEFT_MOTOR_BACKWARD_PIN GPIO_PIN_3
#define RIGHT_MOTOR_FORWARD_PIN GPIO_PIN_4
#define RIGHT_MOTOR_BACKWARD_PIN GPIO_PIN_5
#define LEFT_MOTOR_FORWARD_PORT GPIOA
#define LEFT_MOTOR_BACKWARD_PORT GPIOA
#define RIGHT_MOTOR_FORWARD_PORT GPIOB
#define RIGHT_MOTOR_BACKWARD_PORT GPIOB
GPIO_TypeDef* sensor_ports[2] = {GPIOA, GPIOA};
uint16_t sensor_pins[2] = {LEFT_SENSOR_PIN, RIGHT_SENSOR_PIN};
GPIO_TypeDef* motor_ports[4] = {LEFT_MOTOR_FORWARD_PORT, LEFT_MOTOR_BACKWARD_PORT, RIGHT_MOTOR_FORWARD_PORT, RIGHT_MOTOR_BACKWARD_PORT};
uint16_t motor_pins[4] = {LEFT_MOTOR_FORWARD_PIN, LEFT_MOTOR_BACKWARD_PIN, RIGHT_MOTOR_FORWARD_PIN, RIGHT_MOTOR_BACKWARD_PIN};
void init_sensors() {
GPIO_InitTypeDef GPIO_InitStruct = {0};
for (int i = 0; i < 2; i++) {
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOA_CLK_ENABLE();
/*Configure GPIO pin : PA0 */
GPIO_InitStruct.Pin = sensor_pins[i];
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(sensor_ports[i], &GPIO_InitStruct);
}
}
void init_motors() {
GPIO_InitTypeDef GPIO_InitStruct = {0};
for (int i = 0; i < 4; i++) {
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
/*Configure GPIO pin */
GPIO_InitStruct.Pin = motor_pins[i];
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(motor_ports[i], &GPIO_InitStruct);
}
}
void set_motor_direction(uint8_t motor_index, uint8_t forward, uint8_t backward) {
HAL_GPIO_WritePin(motor_ports[motor_index], motor_pins[forward], GPIO_PIN_RESET);
HAL_GPIO_WritePin(motor_ports[motor_index], motor_pins[backward], GPIO_PIN_RESET);
}
void set_motor_forward(uint8_t motor_index) {
set_motor_direction(motor_index, 0, 1);
}
void set_motor_backward(uint8_t motor_index) {
set_motor_direction(motor_index, 1, 0);
}
void set_motors_forward() {
set_motor_forward(0);
set_motor_forward(1);
set_motor_forward(2);
set_motor_forward(3);
}
void set_motors_backward() {
set_motor_backward(0);
set_motor_backward(1);
set_motor_backward(2);
set_motor_backward(3);
}
void set_motor_left() {
set_motor_backward(0);
set_motor_forward(1);
set_motor_forward(2);
set_motor_backward(3);
}
void set_motor_right() {
set_motor_forward(0);
set_motor_backward(1);
set_motor_backward(2);
set_motor_forward(3);
}
int main(void) {
HAL_Init();
init_sensors();
init_motors();
while (1) {
int left_value = HAL_GPIO_ReadPin(sensor_ports[0], sensor_pins[0]);
int right_value = HAL_GPIO_ReadPin(sensor_ports[1], sensor_pins[1]);
if (left_value && right_value) {
set_motors_backward();
} else if (left_value) {
set_motor_left();
} else if (right_value) {
set_motor_right();
} else {
set_motors_forward();
}
}
}
```
这段代码使用了 STM32 的 HAL 库函数来控制 GPIO,通过左右两个传感器检测黑线的位置,从而决定小车的运动方向。具体来说:
- 如果左右传感器都检测到黑线,小车后退;
- 如果只检测到左侧黑线,小车向左转;
- 如果只检测到右侧黑线,小车向右转;
- 如果左右传感器都没有检测到黑线,小车前进。
你可以在自己的小车上进行测试和修改。