stm32f103c8t6最小系统板对射红外控制舵机程序
时间: 2025-02-06 14:08:51 浏览: 88
### STM32F103C8T6最小系统板对射红外控制舵机示例代码
对于基于STM32F103C8T6最小系统板实现对射红外传感器控制舵机的应用场景,可以设计如下方案。此应用假设使用了一个对射型红外传感器来检测物体的存在与否,并据此调整SG90舵机的角度。
#### 初始化配置
首先,在初始化阶段设置GPIO端口用于连接对射红外传感器和PWM信号输出给舵机:
```c
#include "stm32f1xx_hal.h"
TIM_HandleTypeDef htim3; // 假设使用定时器3生成PWM波形
void MX_GPIO_Init(void){
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* 配置PA0作为输入模式读取对射光感 */
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* 配置PB5为PWM功能驱动舵机 */
__HAL_RCC_GPIOB_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_5;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF2_TIM3;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
void MX_TIM_PWM_Init(TIM_HandleTypeDef *htim){
TIM_OC_InitTypeDef sConfigOC;
htim->Instance = TIM3;
htim->Init.Prescaler = 79;
htim->Init.CounterMode = TIM_COUNTERMODE_UP;
htim->Init.Period = 1999;
htim->Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
HAL_TIM_PWM_Init(htim);
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 0;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
HAL_TIM_PWM_ConfigChannel(htim, &sConfigOC, TIM_CHANNEL_2);
}
```
上述代码完成了必要的硬件资源分配与初始化工作[^1]。
#### 功能函数定义
接着定义两个辅助函数分别用来获取当前是否有物体遮挡了对射光线以及设定舵机转动角度:
```c
uint8_t IsObjectDetected(){
return !HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0)?1:0;
}
void SetServoAngle(uint16_t angle){
uint32_t pulse_width = (angle*200/180)+50; // 将角度转换成对应的占空比宽度
__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_2,pulse_width);
}
```
这里`IsObjectDetected()`会返回布尔值表示是否存在障碍物;而`SetServoAngle()`接受一个介于0到180度之间的整数值并将其转化为适合舵机工作的脉冲宽度调制(PWM)信号[^2]。
#### 主循环逻辑
最后编写主程序中的无限循环部分,根据是否探测到了目标来改变舵机的位置:
```c
int main(void){
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_TIM_PWM_Init(&htim3);
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_2);
while(1){
if(IsObjectDetected()){
SetServoAngle(90); // 当有物体时让舵机转向中间位置
}else{
SetServoAngle(0); // 否则保持初始状态即完全关闭
}
HAL_Delay(100); // 添加适当延时减少CPU占用率
}
}
```
这段代码实现了当对射红外感应到前方存在物体时使舵机转至中心位置的功能,反之则回到起始零度角处等待下一次触发事件的发生[^3]。
阅读全文
相关推荐


















