OpenEdv-开源电子网

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

舵机驱动不起来,怎么破?

[复制链接]

20

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2014-10-16
在线时间
44 小时
发表于 2015-9-21 13:12:36 | 显示全部楼层 |阅读模式
5金钱
原子哥,我用PWM例程改遍舵机程序,=周期20ms,改变占空比,舵机一直不动,帮忙看看程序哪里不对
[mw_shl_code=c,true]#include "pwm.h" #include "led.h" #include "stm32f10x.h" ////////////////////////////////////////////////////////////////////////////////// //本程序只供学习使用,未经作者许可,不得用于其它任何用途 //ALIENTEK Mini STM32开发板 //PWM 驱动代码 //正点原子@ALIENTEK //技术论坛:www.openedv.com //修改日期:2010/12/03 //版本:V1.0 //版权所有,盗版必究。 //Copyright(C) 正点原子 2009-2019 //All rights reserved ////////////////////////////////////////////////////////////////////////////////// //PWM输出初始化 //arr:自动重装值 //psc:时钟预分频数 void TIM1_PWM_Init(u16 arr,u16 psc) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);// RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA| RCC_APB2Periph_AFIO, ENABLE); //使能GPIO外设时钟使能 //设置该引脚为复用输出功能,输出TIM1 CH1的PWM脉冲波形 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //TIM_CH1|TIM_CH4 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 80K TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 不分频 TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式 TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能 TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高 TIM_OC1Init(TIM1, &TIM_OCInitStructure); //根据TIM_OCInitStruct中指定的参数初始化外设TIMx TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能 TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性高 TIM_OC2Init(TIM1, &TIM_OCInitStructure); //根据TIM_OCInitStruct中指定的参数初始化外设TIMx TIM_CtrlPWMOutputs(TIM1,ENABLE); //MOE 主输出使能 TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); //CH1预装载使能 TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable); //CH2预装载使能 TIM_ARRPreloadConfig(TIM1, ENABLE); //使能TIMx在ARR上的预装载寄存器 TIM_Cmd(TIM1, ENABLE); //使能TIM1 } #include "stm32f10x.h" #include "pwm.h" #include "led.h" #include "sys.h" #include "key.h" #include "delay.h" //TIM1_PWM_Init(u16 arr,u16 psc); void Delay(u32 count) { u32 i=0; for(;i<count;i++); } int main(void) { delay_init(); //延时函数初始化 // LED_Init(); //初始化与LED连接的硬件接口 // KEY_Init(); TIM1_PWM_Init(199,7199);//不分频。PWM频率=72000/(899+1)=80Khz (7200*200)/72000000=0.02=20ms while(1) { TIM_SetCompare1(TIM1,50); delay_ms(1500); TIM_SetCompare1(TIM1,100); delay_ms(1500); TIM_SetCompare1(TIM1,150); delay_ms(1500); // TIM_SetCompare2(TIM1,8000); } } [/mw_shl_code]
原子哥以及各位大神帮忙解解惑,谢谢啦

最佳答案

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

回复【11楼】待机唤醒: -------------------------------- http://www.openedv.com/posts/list/15889.htm 你看看这个帖子能不能帮助你,我刚刚的设置数好像是错误的~
奋斗才能新生
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

15

主题

95

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
267
金钱
267
注册时间
2012-11-5
在线时间
11 小时
发表于 2015-9-21 13:12:37 | 显示全部楼层
回复【11楼】待机唤醒:
--------------------------------
http://www.openedv.com/posts/list/15889.htm
你看看这个帖子能不能帮助你,我刚刚的设置数好像是错误的~
学习之路漫长而修远......
回复

使用道具 举报

20

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2014-10-16
在线时间
44 小时
 楼主| 发表于 2015-9-21 13:12:37 | 显示全部楼层
回复【8楼】stm师弟:
---------------------------------
调好了,舵机坏了,换了新的试了试,可以了,  数据取下面这些,谢谢啦
  TIM_SetCompare1(TIM3,195);

     delay_ms(500);

    TIM_SetCompare1(TIM3,190);

     delay_ms(500);

    TIM_SetCompare1(TIM3,185);

     delay_ms(500);
奋斗才能新生
回复

使用道具 举报

70

主题

6763

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13129
金钱
13129
注册时间
2012-11-26
在线时间
3814 小时
发表于 2015-9-21 14:37:24 | 显示全部楼层
有条件的话,最好用示波器看下
学无止境
回复

使用道具 举报

15

主题

95

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
267
金钱
267
注册时间
2012-11-5
在线时间
11 小时
发表于 2015-9-21 16:09:55 | 显示全部楼层
不够0.5ms吧...
学习之路漫长而修远......
回复

使用道具 举报

20

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2014-10-16
在线时间
44 小时
 楼主| 发表于 2015-9-21 16:25:24 | 显示全部楼层
回复【3楼】stm师弟:
---------------------------------
这个我随便设的,但是舵机不动啊,大神知道原因么?
奋斗才能新生
回复

使用道具 举报

70

主题

6763

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13129
金钱
13129
注册时间
2012-11-26
在线时间
3814 小时
发表于 2015-9-21 16:27:12 | 显示全部楼层
回复【4楼】待机唤醒:
---------------------------------
数据还可以随便设。。。麻烦你再看看舵机的角度占空比数据吧  呵呵
学无止境
回复

使用道具 举报

20

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2014-10-16
在线时间
44 小时
 楼主| 发表于 2015-9-21 16:28:36 | 显示全部楼层


这是软件仿真图
奋斗才能新生
回复

使用道具 举报

20

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2014-10-16
在线时间
44 小时
 楼主| 发表于 2015-9-21 16:52:00 | 显示全部楼层
回复【5楼】jermy_z:
---------------------------------
回复【5楼】jermy_z:
---------------------------------
我把  TIM_SetCompare1(TIM1,50);改为  TIM_SetCompare1(TIM1,5);这样可以么?
奋斗才能新生
回复

使用道具 举报

15

主题

95

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
267
金钱
267
注册时间
2012-11-5
在线时间
11 小时
发表于 2015-9-21 16:54:36 | 显示全部楼层
回复【4楼】待机唤醒:
---------------------------------
你用通用定时器来试试,不要用TIM1;
看看舵机是不是在响,但是没有动。如果是的话,给舵机单独供电;
设置的时间你试下TIM_SetCompare1(TIMx,180);
                        TIM_SetCompare1(TIMx,540);
                        TIM_SetCompare1(TIMx,900);

本人是菜鸟,对问题只能说说自己的看法,如有不行,请别见怪~
学习之路漫长而修远......
回复

使用道具 举报

70

主题

6763

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13129
金钱
13129
注册时间
2012-11-26
在线时间
3814 小时
发表于 2015-9-21 16:55:48 | 显示全部楼层
回复【7楼】待机唤醒:
---------------------------------
0.5~2.5ms / 20ms

超出这个范围都扯淡  自己算算吧
学无止境
回复

使用道具 举报

20

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2014-10-16
在线时间
44 小时
 楼主| 发表于 2015-9-21 17:14:58 | 显示全部楼层
[mw_shl_code=c,true]#include "led.h" #include "sys.h" #include "key.h" #include "delay.h" //TIM1_PWM_Init(u16 arr,u16 psc); void Delay(u32 count) { u32 i=0; for(;i<count;i++); } int main(void) { delay_init(); //延时函数初始化 // LED_Init(); //初始化与LED连接的硬件接口 // KEY_Init(); TIM3_PWM_Init(199,7199);//不分频。PWM频率=72000/(899+1)=80Khz (7200*200)/72000000=0.02=20ms while(1) { TIM_SetCompare1(TIM3,195); delay_ms(500); TIM_SetCompare1(TIM3,190); delay_ms(500); TIM_SetCompare1(TIM3,185); delay_ms(500); } } [/mw_shl_code]
这样呢?
奋斗才能新生
回复

使用道具 举报

20

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2014-10-16
在线时间
44 小时
 楼主| 发表于 2015-9-21 17:15:42 | 显示全部楼层
回复【8楼】stm师弟:
---------------------------------
舵机一点动静也没有,没声音
奋斗才能新生
回复

使用道具 举报

20

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2014-10-16
在线时间
44 小时
 楼主| 发表于 2015-9-21 17:28:06 | 显示全部楼层
回复【9楼】jermy_z:
---------------------------------
我调出来了,谢谢大神指导
奋斗才能新生
回复

使用道具 举报

20

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2014-10-16
在线时间
44 小时
 楼主| 发表于 2015-9-21 17:32:44 | 显示全部楼层
回复【13楼】待机唤醒:
---------------------------------
不过舵机转的太快了,能不能降速?
奋斗才能新生
回复

使用道具 举报

15

主题

95

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
267
金钱
267
注册时间
2012-11-5
在线时间
11 小时
发表于 2015-9-21 17:55:53 | 显示全部楼层
回复【15楼】待机唤醒:
---------------------------------
你延时时间长一点应该可以
学习之路漫长而修远......
回复

使用道具 举报

20

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2014-10-16
在线时间
44 小时
 楼主| 发表于 2015-9-21 18:01:14 | 显示全部楼层
回复【16楼】stm师弟:
---------------------------------
这样太卡了,不怎么圆滑,慢不下来
奋斗才能新生
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-18 06:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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