OpenEdv-开源电子网

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

关于驱动舵机问题。

[复制链接]

22

主题

77

帖子

0

精华

初级会员

Rank: 2

积分
166
金钱
166
注册时间
2016-4-2
在线时间
42 小时
发表于 2016-4-20 22:18:37 | 显示全部楼层 |阅读模式
5金钱
各位好,我想用PB5(TIM3 的CH2)输出pwm来驱动舵机。做出来的效果是,舵机在通电的一刻动了一下 之后就没反应了,后来我试着摇动一下杜邦线(vcc接的板上的5v,还有GND),舵机又动了一下,然后就不不动了,下面贴出代码,。望各位朋友指教。

#include "pwm.h"

void PWM_Init(u16 arr,u16 psc)
{
        GPIO_InitTypeDef PWM_GPIO_structure;        
        TIM_TimeBaseInitTypeDef PWM_TIME_struture;
        TIM_OCInitTypeDef PWM_DATA_structure;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
       
        PWM_GPIO_structure.GPIO_Mode=GPIO_Mode_AF_PP;
        PWM_GPIO_structure.GPIO_Pin=GPIO_Pin_5;
        PWM_GPIO_structure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOB,&PWM_GPIO_structure);
        GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE);
       
        PWM_TIME_struture.TIM_ClockDivision=TIM_CKD_DIV1;
        PWM_TIME_struture.TIM_Period=arr;
        PWM_TIME_struture.TIM_Prescaler=psc;
        PWM_TIME_struture.TIM_CounterMode=TIM_CounterMode_Up;
        TIM_TimeBaseInit(TIM3,&PWM_TIME_struture);
       
        PWM_DATA_structure.TIM_OCMode=TIM_OCMode_PWM2;
        PWM_DATA_structure.TIM_OCPolarity=TIM_OCPolarity_High;
        PWM_DATA_structure.TIM_OutputState=TIM_OutputState_Enable;
        TIM_OC2Init(TIM3,&PWM_DATA_structure);
       
         TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);
         
         TIM_Cmd(TIM3,ENABLE);



int main(void)
{

         u16 data;
         delay_init();
         LED_Init();
         Hongwai_Init();
PWM_Init(899,0);
        while(1);





       
       
       
       
       
       
       
       
       



最佳答案

查看完整内容[请看2#楼]

我的代码 [mw_shl_code=applescript,true]/****************************************************************************** 定义PWM输出频率,Period值统一定义成100 ******************************************************************************/ #define Camera_PWM_Prescaler (uint16_t)72 //分频prs:72000 000 / 72 = 1MHz #define Camera_PWM_Period ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2016-4-20 22:18:38 | 显示全部楼层
我的代码
[mw_shl_code=applescript,true]/******************************************************************************
                      定义PWM输出频率,Period值统一定义成100
******************************************************************************/

#define Camera_PWM_Prescaler                     (uint16_t)72  //分频prs:72000 000 / 72 = 1MHz
#define Camera_PWM_Period                        (uint16_t)20000  //计数per:20000次

/**
  *****************************************************************************
  * @Name   : 摄像头舵机PWM初始化
  *
  * @Brief  : none
  *
  * @Input  : none
  *
  * @Output : none
  *
  * @Return : none
  *****************************************************************************
**/
void Camera_PWMInit(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef TIM_TimeBaseStructuer;
        TIM_OCInitTypeDef  TIM_OCInitStructure;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE);  //开启定时器时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE);
       
        //
        //初始化管脚 PC.08
        //
        GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_8;
        GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;  //复用推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOC, &GPIO_InitStructure);
       
        TIM_TimeBaseStructuer.TIM_Period            = Camera_PWM_Period - 1;  //自动重装值
        TIM_TimeBaseStructuer.TIM_Prescaler         = Camera_PWM_Prescaler - 1;  //预分频值
        TIM_TimeBaseStructuer.TIM_ClockDivision     = 0;//TIM_CKD_DIV1;  //设置时钟分割
        TIM_TimeBaseStructuer.TIM_CounterMode       = TIM_CounterMode_Up;  //向上计数模式
        TIM_TimeBaseStructuer.TIM_RepetitionCounter = 0;
       
        TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructuer);  //初始化TIM
       
        //
        ///初始化TIM PWM模式
        //
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;  //选择定时器模式:TIM脉冲宽度调制模式1
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;  //比较输出使能
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;  //输出极性:TIM输出比较极性低
        TIM_OCInitStructure.TIM_Pulse      = 1500;
       
        TIM_OC3Init(TIM8, &TIM_OCInitStructure);

        TIM_OC3PreloadConfig(TIM8, TIM_OCPreload_Enable);  //使能TIM在CCRx上的预装载寄存器
       
        TIM_ARRPreloadConfig(TIM8, ENABLE);
        TIM_Cmd(TIM8, ENABLE);
       
        TIM_CtrlPWMOutputs(TIM8, ENABLE);
}[/mw_shl_code]
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

3

主题

794

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
1502
金钱
1502
注册时间
2015-3-3
在线时间
460 小时
发表于 2016-4-20 23:35:32 | 显示全部楼层
本帖最后由 hpeng1874 于 2016-4-20 23:39 编辑

给50Hz的PWM,0.5ms~2.5ms的高电平

上电抖动一下好像是正常的,我的舵机也是这样子的
给脉冲后就会转动角度


回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-4-20 23:39:29 | 显示全部楼层
帮顶
回复

使用道具 举报

6

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
160
金钱
160
注册时间
2016-4-2
在线时间
33 小时
发表于 2016-4-20 23:41:22 | 显示全部楼层
PWM驱动舵机,PWM信号占空比不同,舵机转动的角度也不同,给舵机一个PWM信号,舵机就会转动相应角度
回复

使用道具 举报

22

主题

77

帖子

0

精华

初级会员

Rank: 2

积分
166
金钱
166
注册时间
2016-4-2
在线时间
42 小时
 楼主| 发表于 2016-4-21 12:33:35 | 显示全部楼层
叶致习 发表于 2016-4-20 23:41
PWM驱动舵机,PWM信号占空比不同,舵机转动的角度也不同,给舵机一个PWM信号,舵机就会转动相应角度

我是一直都输出pwm 但是动了一下就不动了。
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2016-4-21 22:19:33 | 显示全部楼层
我这个舵机大约5ms转1°的
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

22

主题

77

帖子

0

精华

初级会员

Rank: 2

积分
166
金钱
166
注册时间
2016-4-2
在线时间
42 小时
 楼主| 发表于 2016-4-22 09:31:47 | 显示全部楼层
八度空间 发表于 2016-4-21 22:19
我这个舵机大约5ms转1°的

请问是周期5m吗?
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2016-4-22 09:50:02 | 显示全部楼层
PYIPHANG 发表于 2016-4-22 09:31
请问是周期5m吗?

比如中间位置是1300ms高电平,那么+5ms就是右转(假定)1°,-5ms就左转1°,详细看商家给的资料介绍吧
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

22

主题

77

帖子

0

精华

初级会员

Rank: 2

积分
166
金钱
166
注册时间
2016-4-2
在线时间
42 小时
 楼主| 发表于 2016-4-22 18:42:24 | 显示全部楼层
八度空间 发表于 2016-4-20 22:18
我的代码
[mw_shl_code=applescript,true]/*********************************************************** ...

您好,我按你的参数 调好了 但是舵机依然没动 知识嗡嗡嗡地响。。是不是哪里出错了?

还有 我设置的是按键触发 代码是 if(KEY0==0) pwm_init();这样每次触发都会初始化一次,这样有问题吗?
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2016-4-24 00:51:50 | 显示全部楼层
PYIPHANG 发表于 2016-4-22 18:42
您好,我按你的参数 调好了 但是舵机依然没动 知识嗡嗡嗡地响。。是不是哪里出错了?

还有 我设置的是 ...

这样可定有问题呀,每次都复位了这样,看舵机的规格书呀,有占空比范围的
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

6

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
160
金钱
160
注册时间
2016-4-2
在线时间
33 小时
发表于 2016-4-26 00:29:09 | 显示全部楼层
叶致习 发表于 2016-4-20 23:41
PWM驱动舵机,PWM信号占空比不同,舵机转动的角度也不同,给舵机一个PWM信号,舵机就会转动相应角度

是啊,你给了一个PWM信号,舵机转动相应角度后当然就不转了,难道你还想它向电机一样一直转吗
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-17 04:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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