首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

STM32--舵机驱动

  • 25-03-08 01:01
  • 4594
  • 10274
blog.csdn.net

目录

舵机接线:

数字舵机与模拟舵机的区别:

舵机驱动(90度、180度、270度、360度):

90度舵机驱动:

180度舵机驱动:

270度舵机驱动:

360度舵机驱动:

STM32定时器配置:

stm32f4为例(时钟频率为84Mhz):

stm32f1为例(时钟频率为72Mhz):

STM32定时器PWM输出配置要点:

STM32定时器配置:


舵机接线:

红色线电源线(VCC)
黑色  /  棕色地线(GND)
白色  /  黄色信号线(pwm输出)

注意:如果外接电源,那么舵机和开发板、电源之间需要共GND,即开发板上的GND与电源的GND和舵机的GND三者相连接。

如果三者没有共GND,这时舵机无法接收到正常的pwm驱动信号,如图所示,开发板输出周期为20ms,脉冲宽度(高电平宽度)为1.5ms的pwm完全变形,无法正常驱动舵机。


数字舵机与模拟舵机的区别:

数字舵机只需发送1次PWM信号就能运动到预定的角度,模拟舵机需要给它不停的发送PWM信号,才能让它保持在预定的角度。

数字舵机与模拟舵机的驱动控制方法是一样的。


舵机驱动(90度、180度、270度、360度):

90度舵机驱动:

转动角度脉冲周期脉冲宽度(高电平宽度)
-45度20ms0.5ms
0度20ms1.5ms
45度20ms2.5ms

180度舵机驱动:

转动角度脉冲周期脉冲宽度(高电平宽度)
-90度20ms0.5ms
-45度20ms1ms
0度20ms1.5ms
45度20ms2ms
90度20ms2.5ms


270度舵机驱动:

转动角度脉冲周期脉冲宽度(高电平宽度)
-135度20ms0.5ms
0度20ms1.5ms
135度20ms2.5ms

360度舵机驱动:

转动角度脉冲周期脉冲宽度(高电平宽度)
-180度20ms0.5ms
-90度20ms1ms
0度20ms1.5ms
90度20ms2ms
180度20ms2.5ms

所以90度、180度、270度、360度的舵机驱动方法是一样的。

1.驱动脉冲周期都是20ms

2.所有舵机在脉冲宽度为1.5ms驱动下,都位于0度。


STM32定时器配置:

stm32f4为例(时钟频率为84Mhz):

设置arr(自动重装载值)为10000-1=9999,psc(定时器分频系数)为168-1=167

时钟周期计算公式:T=(arr+1)*(psc+1)/ Tck

                                   =(9999+1)*(167+1)/  84Mhz                

                                   =  20  ms


stm32f1为例(时钟频率为72Mhz):

设置arr(自动重装载值为10000-1=9999),psc(定时器分频系数144-1=143)

时钟周期计算公式:T=(arr+1)*(psc+1)/ Tck

                                   =(9999+1)*(143+1)/  84Mhz                

                                   =  20  ms

*(stmf4的时钟频率为84Mhz,stm32f1时钟频率为72Mhz,Tck为时钟频率)*


STM32定时器PWM输出配置要点:

***  注意定时器通道的输出极性  ***

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高。

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性低。

1. TIM_OCPolarity_High:当定时器计数小于比较数值是输出高电平,大于比较数值是输出低电平。

  输出极性:TIM_OCPolarity_High  比较极性高     

设置 arr=9999,psc=167,TIM_SetCompare1(TIM14,500);

如图所示:周期20ms,频率50Hz,脉冲宽度(高电平宽度)= 1ms

2.TIM_OCPolarity_Low:当定时器计数小于比较数值是输出低电平,大于比较数值是输出高电平。

 输出极性:TIM_OCPolarity_Low比较极性低      

设置 arr=9999,psc=167,TIM_SetCompare1(TIM14,500);

如图所示:周期20ms,频率50Hz,脉冲宽度(高电平宽度)= 19 ms

输出极性:TIM_OCPolarity_High  比较极性高      TIM_SetCompare1(TIM14,number);

设置 arr=9999,psc=167

脉冲宽度(高电平宽度)比较数值,
0.5msnumber  =  250
1msnumber  =  500
1.5msnumber  =  750
2msnumber  =  1000
2.5msnumber  =  1250

 输出极性:TIM_OCPolarity_Low比较极性低      TIM_SetCompare1(TIM14,number);

设置 arr=9999,psc=167

脉冲宽度(高电平宽度)比较数值,TIM_SetCompare1(TIM14,number);
0.5msnumber  =  9750
1msnumber  =  9500
1.5msnumber  =  9250
2msnumber  =  9000
2.5msnumber  =  8750

STM32定时器配置:

  1. #include "sys.h"
  2. #include "delay.h"
  3. #include "usart.h"
  4. #include "pwm.h"
  5. int main(void)
  6. {
  7. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  8. delay_init(168);
  9. TIM14_PWM_Init(10000-1,168-1);
  10. while(1)
  11. {
  12. TIM_SetCompare1(TIM14,500);
  13. }
  14. }
  15. void TIM14_PWM_Init(u32 arr,u32 psc)
  16. {
  17. //此部分需手动修改IO口设置
  18. GPIO_InitTypeDef GPIO_InitStructure;
  19. TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  20. TIM_OCInitTypeDef TIM_OCInitStructure;
  21. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14,ENABLE); //TIM14时钟使能
  22. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE); //使能PORTF时钟
  23. GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_TIM14); //GPIOF9复用为定时器14
  24. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //GPIOF9
  25. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用功能
  26. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //速度100MHz
  27. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
  28. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
  29. GPIO_Init(GPIOF,&GPIO_InitStructure); //初始化PF9
  30. TIM_TimeBaseStructure.TIM_Prescaler=psc; //定时器分频
  31. TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
  32. TIM_TimeBaseStructure.TIM_Period=arr; //自动重装载值
  33. TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
  34. TIM_TimeBaseInit(TIM14,&TIM_TimeBaseStructure);//初始化定时器14
  35. //初始化TIM14 Channel1 PWM模式
  36. TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2
  37. TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  38. TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
  39. TIM_OC1Init(TIM14, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM1 4OC1
  40. TIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Enable); //使能TIM14在CCR1上的预装载寄存器
  41. TIM_ARRPreloadConfig(TIM14,ENABLE);//ARPE使能
  42. TIM_Cmd(TIM14, ENABLE); //使能TIM14
  43. }
注:本文转载自blog.csdn.net的peinCK的文章"https://blog.csdn.net/dengn191020/article/details/136685355"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2491) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top