STM32

您所在的位置:网站首页 arduino按钮控制舵机旋转固定角度 STM32

STM32

2024-07-11 01:47| 来源: 网络整理| 查看: 265

一、舵机控制原理 (一)概述

        舵机是一种位置伺服驱动器器,是一种带有输出轴的小装置。当我们向伺服器发送一个控制信号时,输出轴就可以转到特定的位置。只在控制信号持续不变,伺服机构就会保持相对的角度位置不变。如果控制信号发生变化,输出轴的位置也会相应发生变化。舵机的控制大部分都是通过PWM信号控制的。

        注:舵机按角度分为90°、180°、270°、360°舵机,其中360°舵机只能控制旋转速度不能固定在某一角度上。

(二)PWM

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

通过向舵机的信号线发送PWM信号控制舵机的输出量,一般来说,PWM的周期及占空比,可通过程序控制的。

        当我们向舵机发送脉冲宽度为1.5ms时,舵机的输出轴将移至中间位置0°;

        当脉冲宽度为1ms时,舵机的输出轴将移至中间位置-45°;

        脉冲宽度为2ms时,舵机的输出轴将移至中间位置45°。

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

占空比 = t / T 相关参数如下: t = 0.5ms —————— 舵机会转到 -90 ° t = 1.0ms —————— 舵机会转到 -45° t = 1.5ms —————— 舵机会转到 0° t = 2.0ms —————— 舵机会转到 45° t = 2.5ms —————— 舵机会转到 90°

void TIM4_CH1_PWM_Init(u16 arr,u16 psc) { GPIO_InitTypeDef GPIO_InitStruct; TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct; TIM_OCInitTypeDef TIM_OCInitTypeStruct; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE); //要开启复用功能的时钟才能重映射 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB ,ENABLE); //TIM3部分重映射 /* *查看数据手册,引脚的定时器通道是完全映射,还是部分映射 *二者调用参数不相同 *完全映射 :GPIO_FullRemap_TIM4 *部分映射 :GPIO_PartialRemap_TIM4 */ //设置该引脚为复用输出功能 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB,&GPIO_InitStruct); //初始化TIM4 TIM_TimeBaseStruct.TIM_Period = arr;//重装载值 TIM_TimeBaseStruct.TIM_Prescaler = psc;//预分频值 TIM_TimeBaseStruct.TIM_ClockDivision = 0; //时钟分频1、2、4分频 TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up;//设置计数模式 TIM_TimeBaseInit(TIM4,&TIM_TimeBaseStruct); //初始化输出比较参数 TIM_OCInitTypeStruct.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式 TIM_OCInitTypeStruct.TIM_OutputState = TIM_OutputState_Enable;//比较输出使能 TIM_OCInitTypeStruct.TIM_OCPolarity = TIM_OCPolarity_High;//输出极性 TIM_OC1Init(TIM4,&TIM_OCInitTypeStruct); //选择定时器输出通道 TIM4_CH1 //使能预装载寄存器 TIM_OC1PreloadConfig(TIM4,TIM_OCPreload_Enable); //使能定时器 TIM_Cmd(TIM4,ENABLE); } int main(void) { TIM4_CH1_PWM_Init(1999,719);//PWM频率=72000000/(719+1)/(1999+1)=50hz=20ms while(1) { //-90度 TIM_SetCompare1(TIM4,1750);//占空比(2000-1750)/2000*20ms=2.5ms //45度 //TIM_SetCompare1(TIM4,1800);//占空比(2000-1800)/2000*20ms=2ms //0度 //TIM_SetCompare1(TIM4,1850);//占空比(2000-1850)/2000*20ms=1.5ms //-45度 //TIM_SetCompare1(TIM4,1900);//占空比(2000-1900)/2000*20ms=1ms //-90度 //TIM_SetCompare1(TIM4,1945);//占空比(2000-1945)/2000*20ms=0.5ms } }



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3