精华内容
下载资源
问答
  • 在自动控制系统中, 交流伺服电机的作用是把控制电压信号或相位信号变换成机械位移, 也就是把接收到的电信号变为电机的一定转速或角位移,因此可以用单片机实现对电机的数字控制
  • 使用stm32控制舵机

    2019-07-11 10:57:19
    使用STM32控制舵机,使用TIM3输出不同占空比的PWM控制舵机旋转不同的角度
  • 使用STM32F103系列单片机控制舵机的程序,直接接入到单片机中,使用PWM波控制
  • stm32控制舵机程序

    2018-03-26 16:29:58
    stm32通过pwm输出控制控制舵机转角,固件库函数版本,方便移植
  • 本程序为keil MDK创建的工程,适用于STM32F1系列的芯片,根据角度计算公式,控制舵机任意角度转动(0--180度 MG995舵机)。
  • STM32伺服电机控制

    2018-01-23 10:06:40
    STM32伺服电机控制,串口,支持G代码解析,移植方便,
  • 本程序为keil MDK创建的工程,适用于STM32F1系列的芯片,根据角度计算公式,控制舵机任意角度转动(0--180度 MG995舵机)。你需要修改time.c里面的引脚定义和PWM重映射。你需要设定什么样的角度,直接调用...
  • stm32控制舵机转动.rar

    2019-08-05 21:12:50
    采用stm32f103ZET6开发板,使用定时器驱动pwm输出,控制舵机转动
  • STM32控制舵机讲解,从入门到放弃。

    万次阅读 多人点赞 2021-01-28 21:31:43
    STM32控制舵机 文章目录STM32控制舵机前言一、PWMPWM是什么?如何实现PWM信号输出?二、舵机什么是舵机控制原理参考代码 前言 我们这里拿STM32F103C8T6作为我们的芯片,通过PB9端口输出PWM,实现控制舵机。我们...

    STM32控制舵机


    前言

    我们这里拿STM32F103C8T6作为我们的芯片,通过PB9端口输出PWM,实现控制舵机。我们这里就拿180°的SG90舵机。


    一、PWM


    PWM是什么?

    PWM,英文名Pulse Width Modulation,是脉冲宽度调制缩写,它是通过对一系列脉冲的宽度进行调制,等效出所需要的波形(包含形状以及幅值),对模拟信号电平进行数字编码,也就是说通过调节占空比的变化来调节信号、能量等的变化,占空比就是指在一个周期内,信号处于高电平的时间占据整个信号周期的百分比,例如方波的占空比就是50%.

    STM32 的定时器除了 TIM6 和 7。其他的定时器都可以用来产生 PWM 输出。其中高级定时器 TIM1 和 TIM8 可以同时产生多达 7 路的 PWM 输出。而通用定时器也能同时产生多达 4路的 PWM 输出,这样, STM32 最多可以同时产生 30 路 PWM 输出!这里我们仅利用 TIM4的 CH4产生一路 PWM 输出。

    在这里插入图片描述
    PWM的频率: 是指1秒钟内信号从高电平到低电平再回到高电平的次数(一个周期);
    也就是说一秒钟PWM有多少个周期

    单位: Hz

    表示方式: 50Hz 100Hz

    PWM的周期:

    T=1/f

    周期=1/频率

    50Hz = 20ms 一个周期

    如果频率为50Hz ,也就是说一个周期是20ms 那么一秒钟就有 50次PWM周期
    PWM占空比: 是指在一个周期内,信号处于高电平的时间占据整个信号周期的百分比,由于PWM周期为20ms,所以(以舵机会转动 45°为例),占空比就应该为1ms/20ms = 5%,所以TIM_SetCompare1的 TIMx 捕获比较 1 寄存器值就为200-200*5% = 190

    单位: % (0%-100%)

    表示方式:20%

    如何实现PWM信号输出?

    <1> 可以直接通过芯片内部模块输出PWM信号,前提是这个I/O口要有集成模块,只需要简单几步操作即可,这种自带有PWM输出的功能模块在程序设计更简便,同时数据更精确。如下图,一般的IC口都会标明这个是否是PWM口;

    在这里插入图片描述

    <2> 但是如果IC内部没有PWM功能模块,或者要求不是很高的话可以利用I/O口设置一些参数来输出PWM信号,因为PWM 信号其实就是一高一低的一系列电平组合在一起。具体方法是给I/O加一个定时器,对于你要求输出的PWM信号频率与你的定时器一致,用定时器中断来计数,但是这种方法一般不采用,除非对于精度、频率等要求不是很高可以这样实现。

    二、舵机


    什么是舵机?

    舵机也叫也叫 RC 伺服器,通常用于机器人项目,也可以在遥控汽车,飞机等航模中找到它们。
    类似舵机这样的伺服系统通常由小型电动机,电位计,嵌入式控制系统和变速箱组成。
    电机输出轴的位置由内部电位计不断采样测量,并与微控制器(例如STM32,Arduino)设置的目标位置进行比较;
    根据相应的偏差,控制设备会调整电机输出轴的实际位置,使其与目标位置匹配。这样就形成了闭环控制系统。

    在这里插入图片描述

    控制原理

    通过向舵机的信号信号线发送PWM信号来控制舵机的输出量;

    一般来说,PWM的周期以及占空比,我们是可控的,所以PWM脉冲的占空比直接决定了输出轴的位置。

    下面举个例子;

    当我们向舵机发送脉冲宽度为1.5毫秒(ms)的信号时,舵机的输出轴将移至中间位置(90度);

    脉冲宽度为1ms时,舵机的输出轴将移至最小的位置(0度);

    脉冲宽度为2ms时,舵机的输出轴将移至最小的位置(180度);

    注意:不同类型和品牌的伺服电机之间最大位置和最小位置的角度可能会不同。许多伺服器仅旋转约170度(或者只有90度),但宽度为1.5 ms的伺服脉冲通常会将伺服设置为中间位置(通常是指定全范围的一半);

    具体可以参考下图;
    在这里插入图片描述

    占空比 = t / T 相关参数如下:

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

    因为:PWM周期为20ms = (7200*200)/72000000=0.02
    所以:TIM_Period = 199,TIM_Prescaler = 7199,就是我的程序入口参数


    参考代码

    编写步骤:

    <1>开启 TIM4 ,GPIOB时钟,配置 PB9 为复用输出。

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //使能定时器 4 时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOB, ENABLE); //复用时钟使能
    

    <2>初始化 TIM4,设置 TIM4 的 ARR 和 PSC。

    TIM_TimeBaseStructure.TIM_Period = arr; //设置自动重装载值
    TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置预分频值
    TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式
    TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //根据指定的参数初始化 TIMx 的
    

    <3>设置 TIM4_CH4的 PWM 模式,使能 TIM4 的 CH4 输出。

    void TIM_OC4Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct)

    看看结构体 TIM_OCInitTypeDef
    的定义:

    typedef struct
    {
    	uint16_t TIM_OCMode;
    	uint16_t TIM_OutputState;
    	uint16_t TIM_OutputNState; 
    	uint16_t TIM_Pulse;
    	uint16_t TIM_OCPolarity;
    	uint16_t TIM_OCNPolarity;
    	uint16_t TIM_OCIdleState;
    	uint16_t TIM_OCNIdleState;
    } TIM_OCInitTypeDef;
    

    我们来看看里面的参数:

    参数 TIM_OCMode 设置模式是 PWM 还是输出比较,这里我们是 PWM 模式。
    参数 TIM_OutputState 用来设置比较输出使能,也就是使能 PWM 输出到端口。
    参数 TIM_OCPolarity 用来设置极性是高还是低。
    其他的参数 TIM_OutputNState, TIM_OCNPolarity, TIM_OCIdleState 和 TIM_OCNIdleState 是
    高级定时器 TIM1 和 TIM8 才用到的。

    配置如下:

    TIM_OCInitTypeDef TIM_OCInitStructure;
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择 PWM 模式 2
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性高
    TIM_OC4Init(TIM4, &TIM_OCInitStructure); //初始化 TIM4 OC4
    

    <4>使能 TIM4。

    TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable);
    TIM_Cmd(TIM4, ENABLE); //使能 TIM4
    

    <5>修改 TIM4_CCR4 来控制占空比。

    void TIM_SetCompare4(TIM_TypeDef* TIMx, uint16_t Compare4)

    最终代码段:

    //time.c
    #include "time.h"
    #include "stm32f10x.h"
    #include "sys.h"
    
    void TIM4_PWM_Init(u16 arr,u16 psc)
    {
    	GPIO_InitTypeDef GPIO_InitStrue;
    	TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    	TIM_OCInitTypeDef TIM_OCInitStructure;
    	
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);
    	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
    
    	GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP;
    	GPIO_InitStrue.GPIO_Pin=GPIO_Pin_9;
    	GPIO_InitStrue.GPIO_Speed=GPIO_Speed_50MHz;
    	GPIO_Init(GPIOB,&GPIO_InitStrue);
    	
    	TIM_TimeBaseStructure.TIM_Period = arr; 
    	TIM_TimeBaseStructure.TIM_Prescaler =psc; 
    	TIM_TimeBaseStructure.TIM_ClockDivision = 0; 
    	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; 
    	TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); 
    	
    	TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM2;
    	TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High; 
    	TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
    	TIM_OC4Init(TIM4,&TIM_OCInitStructure);
    	
    	TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable);
    	TIM_Cmd(TIM4,ENABLE);
    }
    
    
    

    下面就是主函数的代码:

    //main.c
    #include "stm32f10x.h"
    #include "time.h"
    #include "sys.h"
    #include "usart.h"
    #include "delay.h"
    
    int main(void)
    {
    	delay_init();
    	TIM4_PWM_Init(199,7199);
      while (1)
     {
    	 
    		delay_ms(10);
    	 
    		TIM_SetCompare4(TIM4,190);
    	
     }
    }
    
    
    展开全文
  • 基于STM32f103z按键控制舵机实验,内含超音波测距控制舵机转角,二者实验可以切换测试(keil4),实验结果可行.1要使用按键控制舵机,请停蔽超音波部分代码,2若用超音波控制舵机,请停蔽按键
  • stm32控制舵机

    2018-07-29 18:13:39
    这个代码配套是配套我的博客《stm32控制舵机旋转到不同角度》的例程代码,如果要下载,可以先看看博客
  • 你知道怎么用STM32控制舵机吗?

    千次阅读 2021-11-10 10:17:20
    舵机实质上可以看作一个伺服电机,它也有驱动电路、控制电路,只不过一般舵机工作范围只旋转一定的角度,最常见的就是180°的舵机,当然也有360°的舵机,这里只以180°舵机为例 图1:SG90舵机 舵机内部结构 舵机...

    以下文章来源于:公_众_号开源电子网
    读取更多技术文章,请扫码关注
    在这里插入图片描述

    你知道怎么用STM32控制舵机吗?

    本文我们来学习下如何使用STM32去控制舵机旋转相应角度。
    舵机介绍
    舵机实质上可以看作一个伺服电机,它也有驱动电路、控制电路,只不过一般舵机工作范围只旋转一定的角度,最常见的就是180°的舵机,当然也有360°的舵机,这里只以180°舵机为例
    在这里插入图片描述

    图1:SG90舵机

    舵机内部结构

    舵机主要由以下几个部分组成,减速齿轮组、位置反馈电位计、直流电机、内部控制电路板

    在这里插入图片描述

    当直流电机接收到脉冲指令就会开始转动,之后带动减速齿轮组,减速齿轮组会带动下方接的电位器,之后控制板读取到电位器的信号变化,就可以知道当前舵机旋转的角度,这样就形成了一个闭环回路。

    舵机控制

    舵机的控制一般需要一个20ms的脉宽调制(PWM)信号,该脉冲的高电平部分一般为0.5ms-2.5ms范围相对应舵盘位置的0-180°,那么对应的控制关系如下:
    0.5ms--------------0度
    1.0ms--------------45度
    1.5ms--------------90度
    2.0ms--------------135度
    2.5ms--------------180度

    舵机与脉冲高电平时间关系动图(周期20ms):
    在这里插入图片描述
    一般舵机有三根信号线
    在这里插入图片描述

    棕色表示GND,
    红色表示VCC,
    橙色表示信号脚(即脉冲输入引脚)

    代码实现

    那我们知道了舵机的控制原理了,我们只需要使用STM32的定时器外设不断输出周期为20ms的脉冲信号,且控制高电平时间在0.5ms - 2.5ms之间即可控制舵机旋转角度了。
    本文将使用STM32F407,TIM8_CH1输出脉冲控制舵机
    CubeMX配置
    在这里插入图片描述

    这样就配置好不断输出周期20ms脉冲信号了
    代码编写:
    在这里插入图片描述
    ①启动TIM8_CH1的脉冲输出;
    ②在while里边,每秒修改高电平持续时间
    0.5ms对应0°,
    1ms对应45°,
    1.5ms对应90°,
    2ms对应135°,
    2.5ms对应180°。

    这样就大功告成了!!!大家有问题可以留言,或者留下你们想看的内容。

    展开全文
  • stm32控制舵机旋转到不同角度

    万次阅读 多人点赞 2018-07-29 18:43:17
    最近学习了stm32,就想用它来控制舵机,然后...舵机的主要组成部分为伺服电机,所谓伺服就是服从信号的要求而动作。在信号来之前,转子停止不动;信号来到之后,转子立即运动。因此我们就可以给舵机输入不同的信号,...

    最近学习了stm32,就想用它来控制舵机,然后写下这篇文章分享给大家,如果有理解不到位的地方欢迎大家指正。(我使用的是stm32f103ve型号的开发板,即使和你的型号不同,也有参考价值)

    想要控制舵机的转动,首先你得知道舵的工作原理。


    舵机的主要组成部分为伺服电机,所谓伺服就是服从信号的要求而动作。在信号来之前,转子停止不动;信号来到之后,转子立即运动。因此我们就可以给舵机输入不同的信号,来控制其旋转到不同的角度。
    舵机接收的是PWM信号,当信号进入内部电路产生一个偏置电压,触发电机通过减速齿轮带动电位器移动,使电压差为零时,电机停转,从而达到伺服的效果。简单来说就是给舵机一个特定的PWM信号,舵机就可以旋转到指定的位置。
    舵机上有三根线,分别是GND、VCC和SIG,也就是地线、电源线和信号线,其中的PWM波就是从信号线输入给舵机的。
    一般来说,舵机接收的PWM信号频率为50HZ,即周期为20ms。当高电平的脉宽在0.5ms-2.5ms之间时舵机就可以对应旋转到不同的角度。如下图。


    那么我们如何使用stm32给舵机输入信号,让它听从我们的指挥呢?


    想要输出PWM信号自然就得用上TIM定时器,而基本定时器没有PWM信号的输出功能,所以只能选用通用定时器和高级定时器。对于初始化这些外设无非也就是那些套路,我总结为如下几点:1、开启该外设的时钟2、配置初始化结构体(如果有对应的GPIO还需要初始化该GPIO)3、调用结构体初始化函数4、该使能的使能
    对于TIM来说初始化结构体有两个,分别是时基结构体和输出比较结构体,除此之外还需要做的是先选择具体开启哪条输出通道,我选择的是TIM1(高级定时器)的CH1(通道一),对应的GPIO是PA8。我还初始化了通道一的互补通道PB13,为了更加方便测试。下面是初始化部分的代码。

    static void TIM_GPIO_Config(void)
    {
    	GPIO_InitTypeDef GPIO_InitStructure;
    
      // 输出比较通道 GPIO 初始化
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
        GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_8;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
    
      // 输出比较通道互补通道 GPIO 初始化
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
        GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_13;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
    	
    	// BKIN引脚默认先输出低电平
    	GPIO_ResetBits(ADVANCE_TIM_BKIN_PORT,ADVANCE_TIM_BKIN_PIN);
    }
    
    static void Advance_TIM_Config(void)
    {
    	  // 开启定时器时钟,即内部时钟CK_INT=72M
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
    
    /*--------------------时基结构体初始化-------------------------*/
    	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    	// 自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断
    	TIM_TimeBaseStructure.TIM_Period= (200-1);	
    	// 驱动CNT计数器的时钟 = Fck_int/(psc+1)
    	TIM_TimeBaseStructure.TIM_Prescaler= (7200-1);	
    	// 时钟分频因子 ,用于配置死区时间,没用到,随意
    	TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;		
    	// 计数器计数模式,设置为向上计数
    	TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;		
    	// 重复计数器的值,没用到,可以随意设置
    	TIM_TimeBaseStructure.TIM_RepetitionCounter=0;	
    	// 初始化定时器
    	TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
    
    	/*--------------------输出比较结构体初始化-------------------*/		
    	TIM_OCInitTypeDef  TIM_OCInitStructure;
    	// 配置为PWM模式2
    	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
    	// 输出使能
    	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    	// 互补输出使能
    	TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; 
    	// 设置占空比大小
    	TIM_OCInitStructure.TIM_Pulse = 0;
    	// 输出通道电平极性配置
    	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
    	// 互补输出通道电平极性配置
    	TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
    	// 输出通道空闲电平极性配置
    	TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
    	// 互补输出通道空闲电平极性配置
    	TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;
    	TIM_OC1Init(ADVANCE_TIM, &TIM_OCInitStructure);
    	TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);
    	
    	// 使能计数器
    	TIM_Cmd(TIM1, ENABLE);	
    	// 主输出使能,当使用的是通用定时器时,这句不需要
    	TIM_CtrlPWMOutputs(TIM1, ENABLE);
    }
    
    void TIM_Init(void)
    {
    	TIM_GPIO_Config();
    	Advance_TIM_Config();
    }

    在代码中要特别注意的是时基结构体的TIM_Period(自动重装载寄存器值,简称arr)和TIM_Prescaler(预分频寄存器值,简称psc),因为这两个决定了输出PWM信号的周期。具体的周期计算公式为:周期=(arr+1)*(psc+1)/CLK。其中CLK为计数器的时钟频率,我的是72MHZ,也就是72000000。最后计算结果单位为秒,结果为0.02s,也就是20ms。这样的配置就是为了让输出的PWM信号达到前面说到的舵机要求的20ms周期。

    在初始化完成之后,就可以在main函数中实现信号的输出了。

    前面说过,在周期20ms的PWM信号中,不同的脉宽对应舵机不同的转动角度,在0.5ms-2.5ms间有效,因此我们可以在main函数中配置几个不同的脉宽。要注意的是stm32并不直接配置脉宽,而是通过配置占空比来配置脉宽的。

    配置占空比有个重要的函数TIM_SetCompare1(),具体用法如果不懂可以去看手册。main函数代码如下。

    #include "stm32f10x.h"
    #include "bsp_Advance_tim.h"
    #include "delay.h"
    
    int main(void)
    {
    	int delay_time;
    	delay_init(); //延时函数初始化
    	TIM_Init(); //定时器初始化
    	
    	delay_time = 500;
    	while(1)
    	{
    		delay_ms(delay_time);
    		TIM_SetCompare1(ADVANCE_TIM, 175); //对应180度
            delay_ms(delay_time);
    		TIM_SetCompare1(ADVANCE_TIM, 180); //对应135度
            delay_ms(delay_time);
    		TIM_SetCompare1(ADVANCE_TIM, 185); //对应90度
            delay_ms(delay_time);
    		TIM_SetCompare1(ADVANCE_TIM, 190); //对应45度
            delay_ms(delay_time);
    		TIM_SetCompare1(ADVANCE_TIM, 195); //对应0度
    	}
    }

    如果在定时器初始化时TIM_OCInitStructure.TIM_OCMode配置的是PWM1模式那么main中的占空比就依次为25、20、15、10、5。在你们自己试验时,可以将占空比设置成各种不同的值,看看有什么不同的效果。

    在这补充一点如何连线:可以用杜邦线将舵机的电源与stm32的5v或3.3v引脚连接,将地线与stm32的GND连接,将舵机的信号线与stm32的PWM信号输出引脚连接。

    stm32控制舵机旋转到不同角度完整代码

    展开全文
  • 大家先看懂这张图,我们就是根据这张图 实现定时器产生PWM控制舵机旋转,本次采用的STM32F1单片机控制S90舵机,直接COPY就可以使用,经过本人实测,采用PB13 定时器1PWM通道1实现本次的控制,从0度控制180度旋转改变...

    大家先看懂这张图,我们就是根据这张图 实现定时器产生PWM控制舵机旋转,本次采用的STM32F1单片机控制S90舵机,直接COPY就可以使用,经过本人实测,采用PB13 定时器1PWM通道1实现本次的控制,从0度控制180度旋转改变占空比实现舵机不同角度的控制占空比越准,那么控制舵机角度更精准,本次仅仅实现了舵机控制,精度未测试,不在本次测试范围内。
    大家先看懂这张图,我们就是根据这张图 实现定时器产生PWM控制舵机旋转,本次采用的STM32F1单片机控制S90舵机,直接COPY就可以使用,经过本人实测,采用PB13 定时器1PWM通道1实现本次的控制,从0度控制180度旋转改变占空比实现舵机不同角度的控制占空比越准,那么控制舵机角度更精准,本次仅仅实现了舵机控制,精度未测试,不在本次测试范围内。主要注意定时器配置和IO口的复用功能。千万不要当普通IO口使用。

    static void TIM_GPIO_Config(void)
    {
    	GPIO_InitTypeDef GPIO_InitStructure;
     
      // 输出比较通道 GPIO 初始化
    	  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
        GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_8;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
     
      // 输出比较通道互补通道 GPIO 初始化
    	  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
        GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_13;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
    	
    	// BKIN引脚默认先输出低电平
    	GPIO_ResetBits(GPIOB,GPIO_Pin_13);
    }
     
    static void Advance_TIM_Config(void)
    {
    	 	TIM_OCInitTypeDef  TIM_OCInitStructure;
    		TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    	  // 开启定时器时钟,即内部时钟CK_INT=72M
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
    
    /*--------------------时基结构体初始化-------------------------*/
    
    	// 自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断
    	TIM_TimeBaseStructure.TIM_Period= (200-1);	
    	// 驱动CNT计数器的时钟 = Fck_int/(psc+1)
    	TIM_TimeBaseStructure.TIM_Prescaler= (7200-1);	
    	// 时钟分频因子 ,用于配置死区时间,没用到,随意
    	TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;		
    	// 计数器计数模式,设置为向上计数
    	TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;		
    	// 重复计数器的值,没用到,可以随意设置
    	TIM_TimeBaseStructure.TIM_RepetitionCounter=0;	
    	// 初始化定时器
    	TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
     
    	/*--------------------输出比较结构体初始化-------------------*/		
    
    	// 配置为PWM模式2
    	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
    	// 输出使能
    	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    	// 互补输出使能
    	TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; 
    	// 设置占空比大小
    	TIM_OCInitStructure.TIM_Pulse = 0;
    	// 输出通道电平极性配置
    	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
    	// 互补输出通道电平极性配置
    	TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
    	// 输出通道空闲电平极性配置
    	TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
    	// 互补输出通道空闲电平极性配置
    	TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;
    	TIM_OC1Init(TIM1, &TIM_OCInitStructure);
    	TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);
    	
    	// 使能计数器
    	TIM_Cmd(TIM1, ENABLE);	
    	// 主输出使能,当使用的是通用定时器时,这句不需要
    	TIM_CtrlPWMOutputs(TIM1, ENABLE);
    }
     
    void TIM_Init(void)
    {
    	TIM_GPIO_Config();
    	Advance_TIM_Config();
    }
    void main()
    {
     u16     delay_time = 1000;
      delay_init();	    	 //延时函数初始化	  
      NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 	 
      TIM_Init();
    while1{
    	       delay_ms(delay_time);
    		   TIM_SetCompare1(TIM1, 25); //对应180度
               delay_ms(delay_time);
    		   TIM_SetCompare1(TIM1, 5); //对应0度
              delay_ms(delay_time);
    }
    
    }
    

    [百度云下载链接]
    链接:https://pan.baidu.com/s/1zUEgEFqh0OTUbKQHLL7m_Q
    提取码:1234

    展开全文
  • stm32f407的舵机控制,角度范围为0-180度,可通过按键来改变pwm占空比,进而对舵机转动角度进行控制。也可以自行设置转动角度
  • STM32控制舵机转动

    千次阅读 2021-01-23 09:42:05
    舵机1.STM32CubeMX基础配置2.程序设计 1.STM32CubeMX基础配置 1.1 MCU的选择 1.2 时钟选择 1.3 开启Debug 1.4 定时器的配置 注:一个PWM的周期为20ms,即20000us 1.5 时钟树的配置 2.程序设计 注: HAL_TIM_...
  • STM32控制舵机的原理及代码

    万次阅读 多人点赞 2020-05-04 11:01:20
    舵机内部的控制电路,电位计(可变电阻器)和电机均被连接到电路板上,如内部结构图的右边部分。控制电路通过电位计可监控舵机的当前角度。 如果轴的位置与控制信号相符,那么电机就会关闭。如果控制电路发现这个...
  • 本程序是在keil平台上编写的stm32单片机控制SG90小舵机(对其它舵机同样适用)旋转任意角度的程序,在硬件开发和控制系统中,控制舵机按照自己的想法任意旋转角度是基础的底层控制设计,本代码为自写自测,可用,...
  • STM32控制舵机的方法及实例

    千次阅读 2020-05-18 18:04:21
    STM32控制SG90舵机 在这篇博客中,我讲解的是SG90的180°型号的舵机。其它型号的舵机也可以参考。首先,舵机控制方式是采用PWM方式进行控制的。在使用STM32舵机进行控制时就需要STM32的引脚输出PWM信号,PWM...
  • 通过stm32驱动五路舵机,并带有速度控制,而且封装到一个函数里,简单好用,因为作比赛用了五路舵机,还可以继续添加。函数是duojiset5(u16 value0,u16 value1,u16 value2,u16 value3,u16 value4,u16 fast).
  • 用stm32控制舵机——以stm32F103C8T6为例

    万次阅读 多人点赞 2019-08-04 22:31:49
    使用stm32控制机器时,经常要用到舵机,如使某个部位转到特定的角度,或者在行进过程中的方向控制,这篇文章将以stm32F103C8T6为例,从分析舵机的原理出发,到介绍使用stm的TIM功能输出PWM波,掌握理论后进行实战,...
  • STM32控制舵机

    千次阅读 2018-07-28 09:30:51
    怎么控制6个舵机啊?求大佬指点
  • stm32f103舵机控制模板

    2019-03-19 21:40:09
    用到的舵机型号在压缩包里有,该版本适用于stm32f103内核的单片机,逻辑亦适用于其他型号的stm32单片机。源码为项目所用,现公开方便各位同学学习和调用,程序步骤简明,调试无bug。欢迎下载!注意舵机调试需考虑...
  • stm32单片机控制伺服电机转动固定角度

    千次阅读 热门讨论 2021-05-28 14:48:33
    stm32单片机控制伺服电机转动固定角度 在用伺服电机进行二维平台移动时,会涉及让二维平台移动一个步长的情况,落实到伺服电机上,就是让伺服电机转动一个固定的角度。所以本文说说让伺服电机转动固定角度,然后停下...
  • stm32f407舵机控制程序,stm32控制舵机的例程源码.zip.zip
  • 这是一个基于STM32控制舵机代码,可以参考一下。
  • 通过蓝牙发送信号给控制板来控制舵机,注意舵机最好接外接电源,不然控制板可能电压不稳定导致舵机只转一个角度后就卡死了
  • 基于STM32F103C8T6的舵机控制舵机控制,TIM_SetCompare1(TIM1,1950); //对应0度 2.5
  • 利用ESP32的WIFI模块,创建一个简单的网络服务器来控制伺服电机。 实例代码 #include <WiFi.h> #include "Servo.h" Servo myservo; // create servo object to control a servo // twelve servo ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 16,771
精华内容 6,708
关键字:

32控制伺服电机