打印
[应用相关]

STM32驱动SG90舵机

[复制链接]
747|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tpgf|  楼主 | 2021-10-4 16:55 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1. 材料介绍
STM32F103VET6开发板,此处我使用的是野火的指南者,不过F103系列的应该都是可以通用的,具体大家可以自行参考相对应开发板的用户手册。
SG90舵机一个。我使用的是180°旋转的,实际上在某宝购买的时候360°、180°、90°的SG90都叫这个名字,如果你真的不懂的话,选购之前最好是问问客服可以旋转多少度。
杜邦线若干。


2.接线方法

主要是SG90舵机的三根线,我使用的这款舵机红线接5V(3.3V带不动舵机),棕色接GND,黄色线接开发板的PC6.


使用特权

评论回复
沙发
tpgf|  楼主 | 2021-10-4 16:55 | 只看该作者
3.舵机控制原理
控制信号
舵机的控制信号为PC6输出的PWM信号,周期为20ms,其中脉冲宽度从0.5ms~2.5ms,对应舵盘的0°到180°,呈线性变化。
也就是说,给舵机提供一定的脉宽,它的输出轴就会保持在一个与之对应的角度上,直到下一个不同的脉宽出现,转到新的对应角度。
反馈信号
舵机接收来自信号线的控制信号,电机在转动时,会带动反馈电位计的转动,电位计将输出一个电压信号到舵机控制板,进行反馈,该信号与控制信号进行比较,从而调整转动方向与速度,直到反馈信号与控制信号相同。

代码部分#include "stm32f10x.h"   
void pwm_init(void);
void delay(uint32_t x);
int main()
{          
        pwm_init();         //PWM初始化
        while(1)
        {
                TIM_SetCompare1(TIM3, 195);//0度
                delay(10000000);
                TIM_SetCompare1(TIM3, 190);//45度
                delay(10000000);
                TIM_SetCompare1(TIM3, 185);//90度
                delay(10000000);
                TIM_SetCompare1(TIM3, 180);//135度
                delay(10000000);
    TIM_SetCompare1(TIM3, 177);//比180度旋转的稍微小一点,因为舵机旋转到180度之后可能会卡一下,详细原因可以自行查找
                delay(10000000);       
//                TIM_SetCompare1(TIM3, 175);//180度
//                delay(10000000);       
        }
}


void pwm_init()
{
        GPIO_InitTypeDef GPIO_InitStructure;   //声明初始化GPIO的结构体变量

        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//声明初始化定时器的结构体变量

        TIM_OCInitTypeDef TIM_OCInitStructure;//根据TIM_OCInitStruct中指定的参数初始化外设TIMx

        //开启时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

        //  配置GPIO的模式和IO口
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;// PC6
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出
        GPIO_Init(GPIOC,&GPIO_InitStructure);
       
        //TIM3定时器初始化
        TIM_TimeBaseInitStructure.TIM_Period = 199; //PWM 频率=72000/(199+1)=36Khz//设置自动重装载寄存器周期的值
        TIM_TimeBaseInitStructure.TIM_Prescaler = 7199;//设置用来作为TIMx时钟频率预分频值
        TIM_TimeBaseInitStructure.TIM_ClockDivision = 0;//设置时钟分割:TDTS = Tck_tim
        TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;        //TIM向上计数模式
        TIM_TimeBaseInit(TIM3, & TIM_TimeBaseInitStructure);

        GPIO_PinRemapConfig(GPIO_FullRemap_TIM3,ENABLE);//改变指定管脚的映射 规则在F103参考手册里。

        //PWM初始化
        TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
        TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//PWM输出使能
        TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;

        TIM_OC1Init(TIM3,&TIM_OCInitStructure);
        TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);//使能或者失能TIMx在CCR1上的预装载寄存器
        TIM_Cmd(TIM3,ENABLE);//使能或者失能TIMx外设
}

void delay(uint32_t x)
{
  while(x--);
}



使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2086

主题

16136

帖子

15

粉丝