STM32F103C8T6——4个舵机

接线

SG9O电机

硬件接线:

红线 : 3.3v/ 5v

黑 / 棕线 : GND

黄线 : 信号线

t = 0.5ms——————-舵机会转到 0 °
t = 1.0ms——————-舵机会转到 45°
t = 1.5ms——————-舵机会转到 90°
t = 2.0ms——————-舵机会转到 135°
t = 2.5ms——————-舵机会转到 180°

周期T

PWM周期为20ms = 0.02s = (7200*200)/72000000

PWM占空比

是指在一个周期内,信号处于高电平的时间占据整个信号周期的百分比.由于PWM周期为20ms,所以(以舵机会转动 45°为例),占空比就应该为1ms/20ms = 5%,所以TIM_SetCompare1的 TIMx 捕获比较 1 寄存器值就为200 * 5% = 10

单位: % (0%~100%)

void PWM_Init(void)
{
        GPIO_InitTypeDef GPIOInitStructure;
        TIM_TimeBaseInitTypeDef TIMInitStructure;
        TIM_OCInitTypeDef TIMOCInitStructure;
        
        //1.使能GPIO时钟、定时器时钟、复用时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

        //3.配置GPIO
        GPIOInitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;
        GPIOInitStructure.GPIO_Pin   = GPIO_Pin_6 | GPIO_Pin_7;
        GPIOInitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        
        GPIO_Init(GPIOA, &GPIOInitStructure);
    
        GPIOInitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;
        GPIOInitStructure.GPIO_Pin   = GPIO_Pin_0 | GPIO_Pin_1;
        GPIOInitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        
        GPIO_Init(GPIOB, &GPIOInitStructure);
        
        //4.配置定时器
        TIMInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
        TIMInitStructure.TIM_CounterMode   = TIM_CounterMode_Up;
        TIMInitStructure.TIM_Period        = 200-1;
        TIMInitStructure.TIM_Prescaler     = 7200-1;
        TIM_TimeBaseInit(TIM3, &TIMInitStructure);
        
        //5.配置PWM
        TIMOCInitStructure.TIM_OCMode      = TIM_OCMode_PWM1;
        TIMOCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
        TIMOCInitStructure.TIM_OCPolarity  = TIM_OCPolarity_High;
        
        TIM_OC1Init(TIM3, &TIMOCInitStructure);
        TIM_OC2Init(TIM3, &TIMOCInitStructure);
        TIM_OC3Init(TIM3, &TIMOCInitStructure);
        TIM_OC4Init(TIM3, &TIMOCInitStructure);
        
        TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
        TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
        TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);
        TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);
        
         TIM_ARRPreloadConfig(TIM3, ENABLE);
        TIM_Cmd(TIM3, ENABLE);
}
int main(void)
{
    
  
    SystemInit(); //配置系统时钟为72M   
    PWM_Init();
    while(1)
    {
        TIM_SetCompare1(TIM3, 5);    //0°
        TIM_SetCompare2(TIM3, 5);
        TIM_SetCompare3(TIM3, 5);
        TIM_SetCompare4(TIM3, 5);
    }
  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
要控制SG90舵机,我们需要使用PWM波来控制它的角度。下面是一个简单的STM32F103C8T6单片机控制SG90舵机的程序: 1. 首先,需要在STM32的开发环境中配置GPIO和TIM定时器。我们将舵机的控制线连接到STM32的一个GPIO引脚(例如PA0),并将TIM定时器配置为PWM模式。 2. 然后,我们需要编写程序以控制舵机的角度。以下是一个简单的程序,它使用TIM定时器来生成PWM信号,从而控制舵机的角度: ```c #include "stm32f10x.h" #define PWM_MAX 2000 #define PWM_MIN 1000 void delay_ms(uint32_t ms) { while(ms--) { uint32_t i = 2000; while(i--); } } int main(void) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); TIM_TimeBaseStructure.TIM_Period = PWM_MAX - 1; TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = PWM_MIN; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC2Init(TIM2, &TIM_OCInitStructure); TIM_Cmd(TIM2, ENABLE); while (1) { for (int i = PWM_MIN; i <= PWM_MAX; i += 10) { TIM_SetCompare2(TIM2, i); delay_ms(5); } for (int i = PWM_MAX; i >= PWM_MIN; i -= 10) { TIM_SetCompare2(TIM2, i); delay_ms(5); } } } ``` 这个程序使用TIM2定时器来生成PWM信号,并通过GPIO引脚将信号输出到舵机的控制线上。在while循环中,程序将舵机从最小角度逐渐转动到最大角度,然后再逐渐回到最小角度。延迟函数用于控制舵机转动的速度。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值