OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2507|回复: 3

TIM3_CH2部分重映射到PB5PWM输出控制舵机角度

[复制链接]

28

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
116
金钱
116
注册时间
2019-10-16
在线时间
18 小时
发表于 2019-11-23 11:08:20 | 显示全部楼层 |阅读模式
一般来说,舵机接收的PWM信号频率为50HZ,即周期为20ms。当高电平的脉宽在0.5ms-2.5ms之间时舵机就可以对应旋转到不同的角度。如下图
舵机旋转.png
舵机有3根线,棕色为地,红色为电源正,橙色为信号线,但不同牌子的舵机,线的颜色可能不同。舵机的转动的角度是通过调节PWM(脉冲宽度调制)信号的占空比(1. 占空比是指高电平在一个周期之内所占的时间比率。2. 正脉冲的持续时间与脉冲总周期的比值。例如:正脉冲宽度1μs,信号周期10μs的脉冲序列占空比为0.1。
标准PWM(脉冲宽度调制)信号的周期固定为20ms(50Hz),理论上脉宽分布应在1ms到2ms之间,但是,事实上脉宽可由0.5ms到2.5ms之间,脉宽和舵机的转角0°~180°相对应。

舵机接线.jpg

以下为代码,讲解可以看我上有关于PWM控制led亮度的一个帖子
pwm.h
  1. #ifndef __PWM_H
  2. #define __PWM_H

  3. #include "sys.h"

  4. void TIM3_PWM_Init(u16 arr,u16 psc);

  5. #endif
复制代码


pwm.c
  1. #include "pwm.h"


  2. void TIM3_PWM_Init(u16 arr,u16 psc)
  3. {
  4.        
  5.         GPIO_InitTypeDef GPIO_InitStructure;
  6.         TIM_TimeBaseInitTypeDef TIM_TimeBaseInitstruct;
  7.         TIM_OCInitTypeDef TIM_OCInitStructure;
  8.        
  9.        
  10.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
  11.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
  12.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  13.        
  14.        
  15.         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
  16.         GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;
  17.         GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  18.         GPIO_Init(GPIOB,&GPIO_InitStructure);
  19.   GPIO_SetBits(GPIOB,GPIO_Pin_5);
  20.        
  21.         GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);
  22.        

  23.         TIM_TimeBaseInitstruct.TIM_ClockDivision=TIM_CKD_DIV1;
  24.         TIM_TimeBaseInitstruct.TIM_CounterMode=TIM_CounterMode_Up;
  25.         TIM_TimeBaseInitstruct.TIM_Period=arr;
  26.         TIM_TimeBaseInitstruct.TIM_Prescaler=psc;
  27.         TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitstruct);
  28.        

  29.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择 PWM 模式 2
  30.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  31.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性高
  32.         TIM_OC2Init(TIM3, &TIM_OCInitStructure); //初始化 TIM3 OC2
  33.        
  34.         TIM_Cmd(TIM3, ENABLE);
  35.        
  36.         TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);

  37. }
复制代码


main.c
  1. #include "stm32f10x.h"
  2. #include "delay.h"
  3. #include "pwm.h"


  4. int main()
  5. {

  6.         u16        delay_time = 500;
  7.         u16 angle=195;
  8.         u8 i;
  9.         delay_init();
  10.        
  11.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);       

  12.         TIM3_PWM_Init(199,7199);

  13.         while(1)
  14.         {
  15.                 for(i=0;i<4;i++)
  16.                 {
  17.                 delay_ms(delay_time);
  18.                 TIM_SetCompare2(TIM3,angle);
  19.                 angle-=5;
  20.                 }
  21.                 for(i=0;i<4;++)
  22.                 {
  23.                 delay_ms(delay_time);
  24.                 TIM_SetCompare2(TIM3,angle);//舵机从0->45->90->135->180->135->90->45->0->45->...
  25.                 angle+=5;
  26.                 }
  27.         }       
  28.                
  29. }
复制代码





正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

1127

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1656
金钱
1656
注册时间
2019-8-15
在线时间
102 小时
发表于 2019-11-23 12:51:01 | 显示全部楼层
成功没有捷径
回复 支持 反对

使用道具 举报

6

主题

1127

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1656
金钱
1656
注册时间
2019-8-15
在线时间
102 小时
发表于 2019-11-23 12:51:29 | 显示全部楼层
感谢;楼主分享         
成功没有捷径
回复 支持 反对

使用道具 举报

1

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2019-8-8
在线时间
19 小时
发表于 2020-4-2 16:55:26 | 显示全部楼层
首先感谢楼主的分享。以下是我在实践中遇到的问题。
1.代码书写格式有错误,编译后很好发现和解决(或者我自己的问题?)
2.以90°舵机来测试i=5才能满90°
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-24 12:10

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表