sg90舵机模块stm32f103rct6
时间: 2023-07-29 13:06:48 浏览: 157
对于sg90舵机模块stm32f103rct6的问题,根据提供的引用内容,我无法找到与该问题相关的信息。引用\[1\]和引用\[2\]是相同的链接,指向一个微信文章,而引用\[3\]是一段代码。请提供更多相关的信息,以便我能够更好地回答您的问题。
#### 引用[.reference_title]
- *1* *2* *3* [设计分享 | STM32F103RCT6利用PWM驱动SG90舵机并用按键控制](https://blog.csdn.net/JaneZJW/article/details/127704558)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item]
[ .reference_list ]
相关问题
cmake,VScode,stm,SG90舵机,stm32f103c8t6,如何让舵机转起来
CMake是一个开源的跨平台自动化构建系统,它用于生成适用于各种开发环境的构建配置文件,帮助开发者管理项目依赖并设置编译选项。Visual Studio Code(简称VSCode)是一款轻量级且功能强大的代码编辑器,支持多种语言包括C/C++。
STM32F103C8T6是STMicroelectronics生产的基于ARM Cortex-M3内核的微控制器,常用于物联网、嵌入式系统等应用。SG90是一种常见的廉价迷你伺服电机,通常通过脉冲宽度调制(PWM)信号控制其转动角度。
如果你想让你的STM32F103C8T6通过VSCode控制SG90舵机转起来,你需要按照以下步骤操作:
1. **配置硬件连接**:
- 将STM32板子通过USB连接到电脑,确保供电充足。
- SG90舵机连接到STM32的GPIO口,通常是PWM输出端口,如PA5或PB6。
2. **编写C代码**:
使用C或C++编写程序,通过STM32官方提供的HAL库或者CubeMX生成的驱动,创建一个发送PWM信号的函数,给舵机设定目标角度。
```c
#include "stm32f1xx_hal.h"
void setServoAngle(uint8_t pin, uint8_t angle);
int main(void) {
// 初始化HAL库
HAL_Init();
// ...其他初始化过程...
while (1) {
setServoAngle(PA5, 150); // 示例:向舵机发送150度的信号
// ...延时或其他任务...
}
}
void setServoAngle(uint8_t pin, uint8_t angle) {
static ServoHandle servo;
if (!servo.Instance) {
servo.Instance = GPIOA; // 或者实际使用的GPIO实例
servo.Init.Mode = GPIO_MODE_AF_PP;
servo.Init.Pull = GPIO_NOPULL;
servo.Init.Speed = 50 * 1000; // 设置GPIO速度,例如50kHz PWM频率
HAL_GPIO_Init(&servo.Instance, &servo.Init);
servo.Init.PulseWidthCycle = (angle / 180 * 4096 + 50); // 根据舵机的要求计算PWM周期
HAL_TIM_PWM_Init(&htim1);
HAL_TIM_PWM_MspInit(&htim1);
}
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
}
```
3. **使用CMake编译**:
在VSCode中安装CMake插件,并在项目的根目录下创建CMakeLists.txt文件,配置编译规则和链接STM32库。
4. **调试运行**:
在VSCode中启动C/C++调试,选择合适的设备和配置,然后开始运行程序。
STM32F103RCT6控制SG90舵机的代码
以下是一个简单的示例代码,使用TIM3来控制SG90舵机的角度:
```c
#include "stm32f10x.h"
#define SERVO_PERIOD 20000 // PWM周期us
#define SERVO_MIN_PULSE 1000 // 最小脉冲宽度us
#define SERVO_MAX_PULSE 2000 // 最大脉冲宽度us
#define SERVO_INIT_DEG 90 // 初始角度
void delay_us(uint32_t us)
{
TIM2->CNT = 0;
while(TIM2->CNT < us);
}
void servo_init()
{
// 初始化TIM3
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
TIM_TimeBaseInitTypeDef tim_base_init;
tim_base_init.TIM_Prescaler = SystemCoreClock / 1000000 - 1; // 1us精度
tim_base_init.TIM_Period = SERVO_PERIOD - 1;
tim_base_init.TIM_ClockDivision = 0;
tim_base_init.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &tim_base_init);
// 初始化GPIOB.0
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitTypeDef gpio_init;
gpio_init.GPIO_Pin = GPIO_Pin_0;
gpio_init.GPIO_Mode = GPIO_Mode_AF_PP;
gpio_init.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &gpio_init);
// 初始化TIM3_CH3
TIM_OCInitTypeDef tim_oc_init;
tim_oc_init.TIM_OCMode = TIM_OCMode_PWM1;
tim_oc_init.TIM_OutputState = TIM_OutputState_Enable;
tim_oc_init.TIM_Pulse = SERVO_MIN_PULSE + (SERVO_MAX_PULSE - SERVO_MIN_PULSE) * SERVO_INIT_DEG / 180;
tim_oc_init.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC3Init(TIM3, &tim_oc_init);
TIM_Cmd(TIM3, ENABLE);
}
void servo_set_deg(uint8_t deg)
{
uint32_t pulse_width = SERVO_MIN_PULSE + (SERVO_MAX_PULSE - SERVO_MIN_PULSE) * deg / 180;
TIM3->CCR3 = pulse_width;
}
int main()
{
// 初始化SysTick
SysTick_Config(SystemCoreClock / 1000);
// 初始化TIM2用于延时
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TIM_Cmd(TIM2, ENABLE);
// 初始化舵机
servo_init();
while(1)
{
servo_set_deg(0);
delay_us(1000000);
servo_set_deg(90);
delay_us(1000000);
servo_set_deg(180);
delay_us(1000000);
}
}
void SysTick_Handler()
{
static uint32_t ms_tick = 0;
ms_tick++;
}
```
需要注意的是,SG90舵机的控制信号是一个PWM信号,周期为20ms(即50Hz),脉冲宽度为0.5ms~2.5ms,对应角度为0°~180°。因此,我们需要通过TIM3的输出比较通道3来生成 PWM 信号,通过改变比较值来改变脉冲宽度,从而控制舵机的角度。同时,我们可以使用TIM2来生成微秒级的延时,方便我们控制舵机的运动。
阅读全文