stm32基于hal库寻迹小车
时间: 2023-11-01 18:08:01 浏览: 227
基于stm32的循迹小车
寻迹小车是一种常见的智能小车,可以根据地面上的黑线或白线进行自主导航。在STM32的HAL库中,可以使用外部中断和PWM输出来实现寻迹小车的控制。
以下是一个简单的寻迹小车程序示例:
1. 定义引脚和变量
```c
#define L1_Pin GPIO_PIN_0
#define L1_GPIO_Port GPIOA
#define L2_Pin GPIO_PIN_1
#define L2_GPIO_Port GPIOA
#define R1_Pin GPIO_PIN_6
#define R1_GPIO_Port GPIOA
#define R2_Pin GPIO_PIN_7
#define R2_GPIO_Port GPIOA
#define M1_Pin GPIO_PIN_5
#define M1_GPIO_Port GPIOB
#define M2_Pin GPIO_PIN_6
#define M2_GPIO_Port GPIOB
uint32_t Left1, Left2, Right1, Right2;
```
2. 初始化GPIO引脚和外部中断
```c
GPIO_InitTypeDef GPIO_InitStruct = {0};
/*Configure GPIO pins : L1_Pin L2_Pin R1_Pin R2_Pin */
GPIO_InitStruct.Pin = L1_Pin|L2_Pin|R1_Pin|R2_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING_FALLING;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/*Configure GPIO pin : M1_Pin */
GPIO_InitStruct.Pin = M1_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(M1_GPIO_Port, &GPIO_InitStruct);
/*Configure GPIO pin : M2_Pin */
GPIO_InitStruct.Pin = M2_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(M2_GPIO_Port, &GPIO_InitStruct);
/* EXTI interrupt init*/
HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(EXTI0_IRQn);
HAL_NVIC_SetPriority(EXTI1_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(EXTI1_IRQn);
HAL_NVIC_SetPriority(EXTI9_5_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);
```
3. 实现外部中断回调函数
```c
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin == L1_Pin)
{
if(HAL_GPIO_ReadPin(L1_GPIO_Port, L1_Pin) == GPIO_PIN_SET) Left1++;
else Left1--;
}
if(GPIO_Pin == L2_Pin)
{
if(HAL_GPIO_ReadPin(L2_GPIO_Port, L2_Pin) == GPIO_PIN_SET) Left2++;
else Left2--;
}
if(GPIO_Pin == R1_Pin)
{
if(HAL_GPIO_ReadPin(R1_GPIO_Port, R1_Pin) == GPIO_PIN_SET) Right1++;
else Right1--;
}
if(GPIO_Pin == R2_Pin)
{
if(HAL_GPIO_ReadPin(R2_GPIO_Port, R2_Pin) == GPIO_PIN_SET) Right2++;
else Right2--;
}
}
```
4. 实现PWM输出函数
```c
void SetMotor(int a, int b)
{
if(a > 0)
{
HAL_GPIO_WritePin(M1_GPIO_Port, M1_Pin, GPIO_PIN_SET);
TIM3 -> CCR1 = a;
}
else
{
HAL_GPIO_WritePin(M1_GPIO_Port, M1_Pin, GPIO_PIN_RESET);
TIM3 -> CCR1 = -a;
}
if(b > 0)
{
HAL_GPIO_WritePin(M2_GPIO_Port, M2_Pin, GPIO_PIN_SET);
TIM3 -> CCR2 = b;
}
else
{
HAL_GPIO_WritePin(M2_GPIO_Port, M2_Pin, GPIO_PIN_RESET);
TIM3 -> CCR2 = -b;
}
}
```
5. 实现控制逻辑
```c
while (1)
{
if(Left1 > 0 && Left2 < 0 && Right1 < 0 && Right2 > 0) //左偏
{
SetMotor(500, 0);
}
else if(Left1 < 0 && Left2 > 0 && Right1 > 0 && Right2 < 0) //右偏
{
SetMotor(0, 500);
}
else if(Left1 < 0 && Left2 < 0 && Right1 > 0 && Right2 > 0) //直行
{
SetMotor(500, 500);
}
else if(Left1 > 0 && Left2 > 0 && Right1 < 0 && Right2 < 0) //停车
{
SetMotor(0, 0);
}
}
```
以上代码仅为示例,具体实现需要根据硬件以及实际情况进行调整。
阅读全文