OpenEdv-开源电子网

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

寄存器的 pwm输出控制舵机,舵机一直抖,求教错哪了?拜托

[复制链接]

5

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
119
金钱
119
注册时间
2015-12-23
在线时间
37 小时
发表于 2016-8-9 20:11:24 | 显示全部楼层 |阅读模式
5金钱
#include"stm32f10x.h"
#include"delay.h"
#include"mokuai.h"
#include"usart.h"

void TIM1_PWM_Init(u16 arr,u16 psc)        //  周期  分频
{                                                        //定时器1 的CH2PWM输出初始化
        RCC->APB2ENR|=1<<11;                  //定时器1使能
        RCC->APB2ENR|=1<<2;                //IO口A时钟使能
        GPIOA->CRH&=0XFFFFFF0F;                //设置A9为推挽复用输出
        GPIOA->CRH|=0X000000B0;
        GPIOA->ODR=1<<9;
       
        TIM1->ARR|=arr;
        TIM1->PSC|=psc;
        TIM1->CCMR1=6<<12;        //PWM        模式1
        TIM1->CCMR1=1<<11;        //预装载使能
        TIM1->CCER|=1<<4; //CO1输出使能
        TIM1->CR1=0x0080;                //设置第7位 使能缓冲器
        TIM1->CR1|=0x01;
}

int main(void)
{
        Stm32_Clock_Init(9);
        delay_init(72);
        TIM1_PWM_Init(14400,99);   //周期20ms
        while(1)
        {
                delay_ms(500);
                TIM1->CCR2=1080;
                delay_ms(500);
                TIM1->CCR2=1700;
                delay_ms(500);
                TIM1->CCR2=500;
        }
}

麻烦帮我看看我错哪了,我查了网上别人写的,没什么不一样的啊,帮我看一下吧,谢谢了


最佳答案

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

有可能频率不对吧。你看看舵机说明书,你定时器配置的频率是50Hz,这个频率要和舵机工作频率一致才行。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

11

主题

99

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5573
金钱
5573
注册时间
2015-11-5
在线时间
713 小时
发表于 2016-8-9 20:11:25 | 显示全部楼层
厄尔尼诺 发表于 2016-8-11 10:35
舵机连线没有问题,我用别人写的库函数的程序可以运行,程序中我倒是看到了个错误,
TIM1->CCMR1=6

有可能频率不对吧。你看看舵机说明书,你定时器配置的频率是50Hz,这个频率要和舵机工作频率一致才行。
回复

使用道具 举报

6

主题

104

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
436
金钱
436
注册时间
2015-12-11
在线时间
53 小时
发表于 2016-8-9 20:23:49 | 显示全部楼层
舵机用的是模拟舵机吗?模拟舵机用久了都会抖,容易坏。12个模拟角度舵机已经坏了2个了。你可以用示波器测试波形或者软件仿真,如果准确的话有可能就是舵机的问题,换一个舵机插上去试试看。
Try again and there is nothing left to say.
回复

使用道具 举报

6

主题

104

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
436
金钱
436
注册时间
2015-12-11
在线时间
53 小时
发表于 2016-8-9 20:25:36 | 显示全部楼层
还有,哥们,你这么操作舵机的方式不太科学啊。舵机的PWM值不能瞬间跳变的,容易搞坏舵机。要用for循环一次改变一点点占空比平滑变动。
Try again and there is nothing left to say.
回复

使用道具 举报

5

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
119
金钱
119
注册时间
2015-12-23
在线时间
37 小时
 楼主| 发表于 2016-8-9 22:09:11 | 显示全部楼层
墨黥天 发表于 2016-8-9 20:25
还有,哥们,你这么操作舵机的方式不太科学啊。舵机的PWM值不能瞬间跳变的,容易搞坏舵机。要用for循环一次 ...

舵机是盛辉的9g很常见的那种,PWM值需要一点点改吗?我以前用51的时候一直都是这么用,应该没事吧,在网上看他们写的程序也有这么干的~~~,我这程序里有什么错误吗?到底错哪了我怎么没找到~~~~~
回复

使用道具 举报

6

主题

104

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
436
金钱
436
注册时间
2015-12-11
在线时间
53 小时
发表于 2016-8-10 08:33:43 | 显示全部楼层
厄尔尼诺 发表于 2016-8-9 22:09
舵机是盛辉的9g很常见的那种,PWM值需要一点点改吗?我以前用51的时候一直都是这么用,应该没事吧,在网 ...

以我用CYS-S0090模拟舵机的经验来说,是这样的。小型舵机的工作电压一般为4.8V或6V,转速也不是很快,一般为0.22/60度或0.18/60度,所以假如你更改角度控制脉冲的宽度太快时,舵机可能反应不过来。如果需要更快速的反应,就需要更高的转速了。  可以参考下这个博客 http://blog.sina.com.cn/s/blog_adfd22480101nw83.html
Try again and there is nothing left to say.
回复

使用道具 举报

11

主题

99

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5573
金钱
5573
注册时间
2015-11-5
在线时间
713 小时
发表于 2016-8-10 19:14:46 | 显示全部楼层
看看舵机的地线和板子的地线是不是相连的。
回复

使用道具 举报

5

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
119
金钱
119
注册时间
2015-12-23
在线时间
37 小时
 楼主| 发表于 2016-8-11 10:35:35 | 显示全部楼层
逍遥叹乄 发表于 2016-8-10 19:14
看看舵机的地线和板子的地线是不是相连的。

舵机连线没有问题,我用别人写的库函数的程序可以运行,程序中我倒是看到了个错误,
TIM1->CCMR1=6<<12;        //PWM        模式1
TIM1->CCMR1=1<<11;        //预装载使能
其中应该是|=,我写成 = 了,现在程序是
#include"stm32f10x.h"
#include"delay.h"
#include"mokuai.h"
#include"usart.h"

void TIM1_PWM_Init(u16 arr,u16 psc)                //  周期  分频
{                                                                                                                                                                //定时器2 的CH1 PWM输出初始化
        RCC->APB1ENR|=1<<0;          //定时器2使能
        RCC->APB2ENR|=1<<2;                        //IO口A时钟使能
        GPIOA->CRL&=0XFFFFFFF0;        //设置A9为推挽复用输出
        GPIOA->CRL|=0X0000000B;
        GPIOA->ODR=1<<0;
       
        TIM2->ARR|=arr;
        TIM2->PSC|=psc;
        TIM2->CCMR1|=6<<4;        //PWM        模式1
        TIM2->CCMR1|=1<<3;        //预装载使能
        TIM2->CCER|=1<<0;   //CO1输出使能   低电平有效
        TIM2->CR1|=0x0080;                //设置第7位 使能缓冲器
        TIM2->CR1|=0x01;

}

int main(void)
{
        int a=5;
        Stm32_Clock_Init(9);
        delay_init(72);
        TIM1_PWM_Init(199,7199);   //周期20ms
        while(1)
        {
                for(a=5;a<25;a++)
                {
                        TIM2->CCR1=a;
                }
                if(a==25)
                {
                        a=5;
                }
        }
}

用软件模拟端口是有输出的,但连上舵机,舵机不动~~~~~,帮我看一下吧
回复

使用道具 举报

5

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
119
金钱
119
注册时间
2015-12-23
在线时间
37 小时
 楼主| 发表于 2016-8-11 21:06:38 | 显示全部楼层
逍遥叹乄 发表于 2016-8-11 19:10
有可能频率不对吧。你看看舵机说明书,你定时器配置的频率是50Hz,这个频率要和舵机工作频率一致才行。

好像不是这个问题,舵机也是50HZ的,GPIOA->CRL|=0X0000000B,我看别人也是这么设置的,~~~
回复

使用道具 举报

5

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
119
金钱
119
注册时间
2015-12-23
在线时间
37 小时
 楼主| 发表于 2016-8-12 11:36:03 | 显示全部楼层
@正点原子
原子哥能不能帮我看看错哪了,实在是找不到~~~~
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2016-8-12 20:27:22 | 显示全部楼层
厄尔尼诺 发表于 2016-8-12 11:36
@正点原子
原子哥能不能帮我看看错哪了,实在是找不到~~~~

用示波器看看波形
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

5

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
119
金钱
119
注册时间
2015-12-23
在线时间
37 小时
 楼主| 发表于 2016-8-13 11:44:58 | 显示全部楼层
本帖最后由 厄尔尼诺 于 2016-8-13 15:08 编辑

C:\Users\wang\Desktop\PWM舵机
211116cl6irvzrzywq7liu.png
回复

使用道具 举报

5

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
119
金钱
119
注册时间
2015-12-23
在线时间
37 小时
 楼主| 发表于 2016-8-13 11:46:55 | 显示全部楼层

我没有示波器,用软件模拟的,波形看上去很正常啊,但好像下载到板子里就不对了,舵机也是好的,没有问题~~~~
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2016-8-13 18:46:39 | 显示全部楼层
厄尔尼诺 发表于 2016-8-13 11:46
我没有示波器,用软件模拟的,波形看上去很正常啊,但好像下载到板子里就不对了,舵机也是好的,没有问题 ...

改成一个固定脉冲输出看还抖不?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

5

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
119
金钱
119
注册时间
2015-12-23
在线时间
37 小时
 楼主| 发表于 2016-8-14 17:44:01 | 显示全部楼层
正点原子 发表于 2016-8-13 18:46
改成一个固定脉冲输出看还抖不?

改成固定脉冲也还是不会固定在一个位置,并且也是每隔上6,7秒舵机动一下,期间舵机没有力,
后来在别人的提醒下,我把arr和psc从199,7199改成19999,71就可以了,我现在只是知道怎么改了,但不知道为什么,这是什么原因呢?是因为这种计时会有误差?把arr改大,误差相对小了,就可以了?是这个原因吗?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2016-8-17 22:28:27 | 显示全部楼层
厄尔尼诺 发表于 2016-8-14 17:44
改成固定脉冲也还是不会固定在一个位置,并且也是每隔上6,7秒舵机动一下,期间舵机没有力,
后来在别人 ...

这个,不知道你的舵机有多灵敏.
我觉得如果固定CCRx的话,PWM脉宽肯定是固定的.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-2 20:12

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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