智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 13720|回复: 68
打印 上一主题 下一主题

不看会后悔的(pwm------舵机)

  [复制链接]

68

主题

1086

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
4578

活跃会员奖章优秀会员奖章论坛元老奖章论坛骨干奖章在线王奖章

QQ
威望
2515
贡献
1213
兑换币
1382
注册时间
2012-9-19
在线时间
425 小时
跳转到指定楼层
1#
发表于 2012-12-10 00:01:29 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
                                 
   总是潜水,现在为大家服务一下吧,希望能对一些人有帮助!!! 以前没有深入关注过pwm,自以为是比较了解的,可是直到前几天,才发现我对pwm不是很了解,01、23、45、67级联后,起作用的均是高一级的口(就是1、3、5、7),当时写程序时没有注意,以为级联后就万事大吉啦,谁知道并不好使,一个很小的细节没有注意,导致了程序的崩溃。弄了好几天,郁闷死了。亲先给你们附上一段程序吧,看看有错没有,总线频率为40MHZ。

#include <hidef.h>      /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */
#define ZK1 PWMDTY1     //电机占空比
#define ZK5 PWMDTY5
#define ZK3 PWMDTY3   //舵机占空比

void Steer_Init(void)
{
    PWME_PWME3 = 0;      //先禁止各通道输出
    PWMCTL_CON23 = 1;    //两两级联成16位PWM
    PWMPRCLK_PCKB = 2;  //预分频系数为B 4,总线频率,即10MHZ
    PWMSCLB = 2;  //SB_CLK = B_CLK / (2*2) ==2.5MHz
    PWMCLK_PCLK3 = 1;   //通道选  clock SB做时钟源
                                             
    PWMCNT3=0;  //23计数器清零
    PWMCAE_CAE3=0;    //选择输出模式为左对齐输出模式   
    PWMPOL_PPOL3=1;    //先输出高电平,计数到DTY时,反转电平
   
    PWMPER23=50000; // 20ms ;50Hz
    PWMDTY23=0;
    PWME_PWME3 = 1;      
}

void main(void)
{
   PLL_Init_40M();
   Steer_Init();
   IO_Init();
   Motor_Init();
   ZK3=5000;  //舵机摆正
   ZK1=100;
   ZK5=0;
}

当然啦,其他的程序都是没有错误的,都很好使的,亲们你们发现有什么不对了吗???
如果发现了,恭喜你,你真的很厉害,是一个有心人。如果没有发现的话,也不要紧的,
下面再给你们附上另外的一段程序,仔细看好了啊,亲。

#include <hidef.h>      /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */
#define ZK1 PWMDTY01     //电机占空比
#define ZK5 PWMDTY45
#define ZK3 PWMDTY23   //舵机占空比

void Steer_Init(void)
{
    PWME_PWME3 = 0;      //先禁止各通道输出
    PWMCTL_CON23 = 1;    //两两级联成16位PWM
    PWMPRCLK_PCKB = 2;  //预分频系数为B 4,总线频率,即10MHZ
    PWMSCLB = 2;  //SB_CLK = B_CLK / (2*2) ==2.5MHz
    PWMCLK_PCLK3 = 1;   //通道选  clock SB做时钟源
                                             
    PWMCNT3=0;  //23计数器清零
    PWMCAE_CAE3=0;    //选择输出模式为左对齐输出模式   
    PWMPOL_PPOL3=1;    //先输出高电平,计数到DTY时,反转电平
   
    PWMPER23=50000; // 20ms ;50Hz
    PWMDTY23=0;
    PWME_PWME3 = 1;      
}

void main(void)
{
   PLL_Init_40M();
   Steer_Init();
   IO_Init();
   Motor_Init();
   ZK3=5000;  //舵机摆正
   ZK1=100;
   ZK5=0;
}

亲们发现两段程序有什么不同的吗???亲,不要告诉我说他们没有一点区别,完全一样,用你的火眼金睛再仔细的看一遍吧!!!他们是有区别的,而且就是这么小小的区别,让我们队的车子楞是跑不起来,可是害苦我了啊!!!我整整发了近三天的时间才找到的这不算问题的问题啊,哎!!!现在我是真的深有体会,无论什么事都是马虎不得的,不然会吃大亏的啊,尤其是做比赛的童鞋们,真的是伤不起啊!!!



#define ZK1 PWMDTY1     //电机占空比
#define ZK5 PWMDTY5
#define ZK3 PWMDTY3   //舵机占空比

#define ZK1 PWMDTY01     //电机占空比
#define ZK5 PWMDTY45
#define ZK3 PWMDTY23   //舵机占空比
现在发现了吧,上面的是 PWMDTY1, PWMDTY5, PWMDTY3
下面的是  PWMDTY01, PWMDTY45, PWMDTY23,

就是这些让我郁闷死了,若这样写(PWMDTY3),虽然23级联了,但是单片机还是认为他们并不级联,任然是8位的(注:8位最大值只能是255),而不是我们想象的16位(注:最大值是65535),为此我亲自做了实验,这样写(PWMDTY3),写入数值小于等于255的时候可以,运行时软件没有出现warning,写256就不行了,软件就出现warning,原来以为出现warning,没有错误就行,但是事实却不是如此,我当时写的是(ZK3=5000),舵机就是要么往一个方向摆、要么就是出现各种不正常的问题,但是当我把(PWMDTY3)改成(PWMDTY23)时,苦逼了啊,一切都没有问题了(我当时控制的是舵机),舵机在正常不过了,一切都好了,我当时就笑了,这是什么玩意啊,我多么宝贵的几天的时间啊,哎,童鞋们,就写到这吧,我的能力有限,剩下的还得靠你们自己去摸索。那些还在为舵机不
能正常工作而发愁的童鞋们,你们看一看,是不是与我一样不小心啊,希望对你们能有一些帮助。有什么不对的,请指出来,谢谢。







评分

1

查看全部评分

68

主题

1086

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
4578

活跃会员奖章优秀会员奖章论坛元老奖章论坛骨干奖章在线王奖章

QQ
威望
2515
贡献
1213
兑换币
1382
注册时间
2012-9-19
在线时间
425 小时
2#
 楼主| 发表于 2012-12-12 22:50:09 | 显示全部楼层
万能pcb 发表于 2012-12-12 21:44
目前还看不懂

没事的,刚开始都是看不懂,慢慢就好了,坚持
回复 支持 反对

使用道具 举报

68

主题

1086

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
4578

活跃会员奖章优秀会员奖章论坛元老奖章论坛骨干奖章在线王奖章

QQ
威望
2515
贡献
1213
兑换币
1382
注册时间
2012-9-19
在线时间
425 小时
3#
 楼主| 发表于 2013-3-18 17:35:38 | 显示全部楼层
回复 支持 反对

使用道具 举报

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

本版积分规则

关于我们|联系我们|小黑屋|亿加合和智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-5-5 04:19 , Processed in 0.075881 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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