舵机的控制一般需要一个20ms左右的时基脉冲,该脉冲的高电平部分一般为0.5ms-2.5ms范围内的角度控制脉冲部分,总间隔为2ms。以180度角度伺服为例,那么对应的控制关系是这样的:
   0.5ms--------------0度;
   1.0ms------------45度;
   1.5ms------------90度;
   2.0ms-----------135度;

2.5ms-----------180度;

对于stm32来说,我们可以使用定时器PWM输出来控制舵机。

下面给出封装的舵机控制程序:

第一步:初始化定时器

void initServoPWM(TIM_TypeDef* TIMx,uint32_t RCC_APB1Periph_TIMx)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

//开启TIMx时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIMx, ENABLE);

//配置TIMx
TIM_DeInit(TIMx); 
TIM_TimeBaseStructure.TIM_Period = 2000;//20ms 50频率
TIM_TimeBaseStructure.TIM_Prescaler =819;//定时器分频系数,定时器时钟为82MHz,分频后得0.01MHz,即10kHz,0.1ms定时器加1
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIMx, &TIM_TimeBaseStructure);
}

第二步:初始化PWM输出通道

void initServoChannel(GPIO_TypeDef* GPIOx,uint32_t RCC_AHB1Periph_GPIOx,u16 GPIO_Pin_x,uint16_t GPIO_PinSourcex,uint8_t GPIO_AF_TIMx,TIM_TypeDef* TIMx,u8 ch,u16 servoInitAngle)
{
servo_angle=servoInitAngle;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOx, ENABLE);
//配置复用功能,AGPIO1复用位TIMx
GPIO_PinAFConfig(GPIOx,GPIO_PinSourcex,GPIO_AF_TIMx);

//配置PWM输出管脚 初始化
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_x;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//设置为复用模式
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//复用推挽输出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
  GPIO_Init(GPIOx, &GPIO_InitStructure);

//PWM模式设置 与通道设置TIMx_CHx,每个定时器只有一个频率,每个通道可以设置不同的占空比
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//模式PWM1,无论定时器是向上计数还是向下计数,计数值>有效值时为有效电平。PWM2模式相反        
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//输出比较使能
TIM_OCInitStructure.TIM_Pulse = servoInitAngle*200/180+50;//设置比较值,写CCRx,当计数器到达100时,电平发送跳变,即设置CCRx的值
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//设输出极性为高,即有效值为高电平,当计数器<200时,PWM为高电平

switch(ch)//选择pwm通道
{
case 1:
TIM_OC1Init(TIMx, &TIM_OCInitStructure);//通道2初始化
TIM_OC1PreloadConfig(TIMx, TIM_OCPreload_Enable);//使能输出比较预装载
break;
case 2:
TIM_OC2Init(TIMx, &TIM_OCInitStructure);//通道初始化
TIM_OC2PreloadConfig(TIMx, TIM_OCPreload_Enable);//使能输出比较预装载
break;
case 3:
TIM_OC3Init(TIMx, &TIM_OCInitStructure);//通道初始化
TIM_OC3PreloadConfig(TIMx, TIM_OCPreload_Enable);//使能输出比较预装载
break;
case 4:
TIM_OC4Init(TIMx, &TIM_OCInitStructure);//通道初始化
TIM_OC4PreloadConfig(TIMx, TIM_OCPreload_Enable);//使能输出比较预装载
break;
}
TIM_ARRPreloadConfig(TIMx, ENABLE);//使能自动重装载寄存器允许位
//开启TIMx
TIM_Cmd(TIMx, ENABLE); 
}

第三步:通道改变占空比控制舵机转动的角度:

void setServoAngle(int angle,TIM_TypeDef* TIMx,u8 ch)
{

if(angle>180)
angle=180;
else if(angle<0)
angle=0;

servo_temp=angle*200/180+50;//计算占空比
switch(ch)//选择pwm通道
{
case 1:
TIM_SetCompare1(TIMx,servo_temp);
break;
case 2:
TIM_SetCompare2(TIMx,servo_temp);
break;
case 3:
TIM_SetCompare3(TIMx,servo_temp);
break;
case 4:
TIM_SetCompare4(TIMx,servo_temp);
break;
}
//计算延迟时间
servo_temp=servo_angle-angle;
if(servo_temp<0)
servo_temp=-servo_temp;
servo_temp=servo_temp*3+10;

USART_SendNumber(USART1,angle);
delay_ms(servo_temp);

servo_angle=angle;

}

基于STM32F4的舵机控制相关推荐

  1. stm32的语音识别_免费开源基于STM32的智能垃圾桶之舵机控制(HAL库)

    大家好,我是『芯知识学堂』的SingleYork,前面给大家简单介绍了<基于STM32的智能垃圾桶之成员简介>.<基于STM32的智能垃圾桶之语音识别>和<基于STM32 ...

  2. 基于STM32F4单片机对步进电机的控制(有代码)

    步进电机简介 步进电机是将电脉冲控制信号转变为角位移或线位移的一种常用的数字控制执行元件,又称为脉冲电机.在驱动电源的作用下,步进电机受到脉冲的控制,其转子的角位移量和速度严格地与输入脉冲的数量和脉冲 ...

  3. 第六篇、基于Arduino uno,控制180度舵机(SG90)转动——结果导向

    0.结果 说明:让舵机转动,需要用PWM来控制,下面的程序是舵机从0度一直转到180度,然后又从180度转到0度的这样一个过程. 1.外观 说明:虽然舵机的型号有很多种,但是只要是180度的舵机,控制 ...

  4. 基于Arduino和AS608模块的指纹门禁锁--舵机控制

    网上刷到很多视频,看见很多和我一样的大学生自己用单片机给自己宿舍安装指纹锁,我们宿舍经常忘带钥匙,而且随身携带钥匙也很麻烦,所以我选择像网上的一样自己给自己做一个指纹锁,刚好实验室有3D打印机,也正好 ...

  5. 基于PID的树莓派控制二自由度舵机人脸追踪云台设计

    人脸追踪云台的设计 一.舵机控制概述 脉冲宽度与舵机转角: 在脉冲信号频率50Hz的条件下输入的脉冲信号宽度和舵机转角的对应关系图以如图1.所示,该转角的计算公式如下.树莓派端通过占空比信号对舵机进行 ...

  6. 基于STM32F4的四轴航拍飞行器(开源)

    网址:http://www.stmcu.org/module/forum/thread-603398-1-2.html 摘要 本设计是基于STM32F4的四轴航拍平台.以STM32F407为控制核心, ...

  7. 树莓派输出pwm波c语言,树莓派Ubuntu18.04使用pigpio库产生PWM波实现舵机控制

    树莓派Ubuntu18.04使用pigpio库产生PWM波实现舵机控制 树莓派Ubuntu18.04使用pigpio库产生PWM波实现舵机控制 一:pigpio库简介 pigpio是一个用于树莓派的库 ...

  8. 基于stm32f4的按键检测

    基于stm32f4的按键检测 所谓按键检测,即是检测按键是长按,还是短按.(长按.短按由按键的时间的长短来衡量)通过查阅相关资料,找到了两种比较好理解的按键检测方法.一种是通过输入捕获的方式检测按键按 ...

  9. 基于STM32F4开发的智能台灯

    基于STM32F4开发的智能台灯 写这篇博客的目的有2个,首先是记录一下学习STM32大半年来的第一个自己动手开发的项目,整理一下开发过程和思路:其次也是希望可以和更多的同行交流开发经验,有什么问题可 ...

最新文章

  1. LoadRunner12使用教程(三)——Action迭代
  2. [二分查找] 二:二分查找的经典例题
  3. python四十七:在子类中调用父类方法
  4. windows下挂载ext4_WSL2 支持挂载物理磁盘,Windows 可直接访问 ext4
  5. python实际应用方面的材料_python应用于哪些方面
  6. zabbix解决中文乱码
  7. 基于ZYNQ FPGA实现图像采集存储显示
  8. 代码模块化编程思想!!
  9. Qt 5.12--color
  10. [Unity3D] [学习] Unity3D的官方文档
  11. 各种图片、文字无缝滚动
  12. boto3 连接aws_Python,Boto3和AWS S3:神秘化
  13. 速看!2022年6月编程语言排行榜出炉!第一名太牛啦
  14. MAC删除多余的声音驱动文件
  15. java抽取word,pdf的四种武器
  16. 夜光带你走进python开发 (二十九)传奇语言
  17. 【已解决】批处理执行,提示无效的参数量
  18. SuperMap iClient3D for WebGL教程(Entity)- PathGraphics
  19. 22岁失去 “万亿美金机会”,28岁被硅谷最牛孵化器录取,30岁他的经历被拍成电视剧...
  20. 问题 D: 货币套汇(图路径)-- Guard

热门文章

  1. 球球大作战显示中国服务器较差,球球大作战延迟卡顿原因分析及解决方法
  2. 正则表达式,删除空行,删除特定字符所在行
  3. 博客园添加鼠标粒子吸附特效
  4. 从对集合数据去重到Distinct源码分析
  5. 数据结构Java版之排序算法(二)
  6. Linux杂碎2/SHELL
  7. iOS模型输出和打印
  8. ECSHOP中transport.js和jquery的冲突的简单解决办法
  9. 用友U8固定资产总账重算语句
  10. android里R.layout.的问题