智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 4668|回复: 9
打印 上一主题 下一主题

这个程序有什么问题?!

  [复制链接]

2

主题

8

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
308
威望
248
贡献
44
兑换币
22
注册时间
2009-12-30
在线时间
8 小时
跳转到指定楼层
1#
发表于 2010-1-14 19:40:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
自己的毕业设计

用的是STC12的芯片
电机软件驱动不了
大家帮俺看看
第一次做智能车,还相当的虾米

#include         <STC12C5410AD.h>                                /* STC12C5410AD 的头文件,为MCU中各个硬件寄存器定个名称,以便C语言中使用*/

sbit                        Work_Display = P3^4;                // 根据硬件设计用与“主控工作指示”接近的名称取代硬件,使程序减少与硬件的相关性

#define                TRUE                                1
#define                FALSE                                0

#define                LIGHT                0                                                                // 亮逻辑值,用直观的符号化常数替换与硬件密切相关的逻辑值,增加程序的可读性、可移植性。
#define                DARK                1                                                                // 暗逻辑值

#define                LIGHT_TIME                1000                        // 亮时间,使用符号化常数,便于修改,增加程序可读性
#define                DARK_TIME                        1000                        // 暗时间

#define                P2MODE0                                0x00                        /* 0000 0000,P2 口作为马达控制,均作为推挽输出*/
#define                P2MODE                                0xFF                        /* 1111 1111,*/

#define                P3MODE0                                0x10                        // 00010000,P3.4 设置为开漏输出,其余均为标准 51 口;
#define                P3MODE1                                0x10                        // 00010000,

/* 定时器参数定义 */

#define                T0MODE0 0x00                // 0000 0000,Timer0工作在模式0 ,13位定时;
#define                T0MODE1 0x01                // 0000 0001,Timer0工作在模式1 ,16位定时;
#define                T0MODE2 0x02                // 0000 0010,Timer0工作在模式2 ,8 位自动重加载定时;
#define                T0MODE3 0x03                // 0000 0011,Timer0工作在模式3

#define                T0_TIMER 0x00                // Timer0 工作在定时器模式
#define                T0_COUNTER 0x04        // Timer0 工作在计数器模式
#define                T0_DISGATE 0x00        // Timer0 禁止INT0引脚控制
#define                T0_ENGATE 0x08        // Timer0 允许INT0引脚控制

#define                T1MODE0 0x00                // 0000 0000,Timer1工作在模式0 ,13位定时;
#define                T1MODE1 0x10                // 0000 0001,Timer1工作在模式1 ,16位定时;
#define                T1MODE2 0x20                // 0000 0010,Timer1工作在模式2 ,8 位自动重加载定时;
#define                T1MODE3 0x30                // 0000 0011,Timer1工作在模式3

#define                T1_TIMER 0x00                // Timer1 工作在定时器模式
#define                T1_COUNTER 0x40        // Timer1 工作在计数器模式
#define                T1_DISGATE 0x00        // Timer1 禁止INT1引脚控制
#define                T1_ENGATE 0x80        // Timer1 允许INT1引脚控制

#define                SET_T0X12_C 0x80                // or AUXR
#define                CLR_T0X12_C 0x7F                // and AUXR

#define                SET_T1X12_C 0x40                // or AUXR
#define                CLR_T1X12_C 0xBF                // and AUXR

#define                TIME1ms_C                0xF8D0        /* 1ms 定时的加载值字节,对应 22.1184MHz 定时器12分频 */               
#define                TIME1msH_C        0xF8                /* 1ms 定时的加载值高字节 */
#define                TIME1msL_C        0xD0                /* 1ms 定时的加载值低字节 */

/* 中断处理参数定义 */
#define                EnINT0_C         0x01
#define                EnT0_C                 0x02
#define                EnINT1_C        0x04
#define                EnT1_C                 0x08
#define                EnUART_C        0x10
#define                EnADCSPI_C         0x20
#define                EnPCALVD_C         0x40

#define                INT0_DOWN        0x01                // TCON 中对INT0中断信号的控制,下降沿触发;
#define                INT0_LOW        0x00                // TCON 中对INT0中断信号的控制,低电平触发;

#define                INT1_DOWN        0x04                // TCON 中对INT1中断信号的控制,下降沿触发;
#define                INT1_LOW        0x00                // TCON 中对INT1中断信号的控制,低电平触发;

#define                NOIP_C                0x00                /* 无优先级 */

#define                INT0_HIGH         0x01        // IP 寄存器中的优先级设置,IPH暂不处理。
#define                T0_HIGH                        0x02
#define                INT1_HIGH                0x04
#define                T1_HIGH                        0x08
#define                UART_HIGH                0x10
#define                ADCSPI_HIGH        0x20
#define                PCALVD_HIGH 0x40       



// 马达控制口
#define         MotorDrv                P2                        // P2.0 - P2.2 控制左电机, P2.4 - P2.6 控制右电机,输出

// PCA 初始化常数,
#define                STARTPCA_C         0x40;                // or CCON 中的CR位控制 启动 PCA
#define                STOPPCA_C         0xBF;                // and CCON 中的CR位控制 停止 PCA

#define                FOSCdiv12_C 0x00
#define                FOSCdiv2_C         0x02       
#define                T0Over_C                 0x04                // T0 溢出
#define                ECI_C                         0x06                // 外部脉冲输入

#define                EnCF_C                0x01                        // 允许PCA溢出中断

#define                EnCMP_C                0x40                        // 0100 0000, CCAPMn 中控制位6, 允许比较器
#define                EnCAPP_C        0x20                        // 0010 0000, CCAPMn 中控制位5, 允许上升沿捕获
#define                EnCAPN_C        0x10                        // 0001 0000, CCAPMn 中控制位4, 允许下降沿捕获
#define                EnMAT_C                0x08                        // 0000 1000, CCAPMn 中控制位3, 允许匹配或捕获后置位 CCFn
#define                EnTOG_C                0x04                        // 0000 0100, CCAPMn 中控制位2, 允许匹配或捕获后触发输出翻转
#define                EnPWM_C                0x02                        // 0000 0010, CCAPMn 中控制位1, 允许对应的端子输出PWM信号
#define                EnCCFI_C        0x01                        // 0000 0001, CCAPMn 中控制位0, 允许CCF产生中断


// PCA 中断
#define                EnPCALVD_C         0x40

// PCA 优先级
#define                PCALVD_HIGH 0x40       

#define                MOTOR_L                        0
#define                MOTOR_R                        1

#define                BREAK_PWM                0                        // 刹车 PWM 控制值
#define                FLOAT_PWM                255                // 惰行 PWM 控制值

// 电机控制输出

/* 控制位对应关系:
电机1(左)
P2.0 - CtrlL1, H 桥的左、右上臂,1 电平输出导通 0 电平输出截止,只有在对应下臂截止时有效
P2.1 - CtrlL2, H 桥的左下臂,1 电平输出导通 0 电平输出截止
P2.2 - CtrlL3, H 桥的右下臂,0 电平输出导通 1 电平输出截止


电机 2(右)
P2.4 - CtrlR1, H 桥的左、右上臂,1 电平输出导通 0 电平输出截止,只有在对应下臂截止时有效
P2.5 - CtrlR2, H 桥的左下臂,1 电平输出导通 0 电平输出截止
P2.6 - CtrlR3, H 桥的右下臂,0 电平输出导通 1 电平输出截止

控制逻辑:
Ctrl1                Ctrl2                Ctrl3                Drv1                Drv2                Drv3                Drv4                电机状态
        X                                0                                0                        0/截止        0/导通        0/截止        0/导通                刹车
        PWM                        1                                0                        PWM                        1/截止        0/截止        0/导通                正转
        PWM                        0                                1                        0/截止        0/导通        PWM                        1/截止                反转
        0                                1                                1                        0/截止        1/截止        0/截止        1/截止                惰行
        1                                1                                1                        1/导通        1/截止        1/导通        1/截止                刹车

电机 2 控制逻辑相同,只是对应高 3 位。

*/

// 左电机控制
#define         ML_FORWARD        0x02                        // 0000 0010 前进,左上、右下导通,

#define         ML_BACK                        0x04                        // 0000 0100 后退,左下、右上导通

#define         ML_FLOAT                0x06                        // 0000 0110 浮空,4 个臂都截止,此时 Ctrl1 应停止PWM输出,维持“0”。
#define         ML_BRAKE                0x00                        // 0000 0000 刹车,两个下臂导通,上臂截止

#define                ML_MASK                        0xF8                        // 清除原来输出值,保留另一个电机的输出

// 右电机控制
#define         MR_FORWARD        0x20                        // 0010 0000 前进,左上、右下导通,

#define         MR_BACK                        0x40                        // 0100 0000 后退,左下、右上导通

#define         MR_FLOAT                0x60                        // 0110 0000 行进控制浮空,4 个臂都截止                                                        n
#define         MR_BRAKE                0x00                        // 0000 0000 行进控制刹车,两个下臂导通,上臂截止

#define                MR_MASK                        0x8F                        // 清除原来输出值,保留另一个电机的输出

#define                PWM_OUT_VALID                1                                // PWM 脉冲输出控制上臂导通
#define                PWM_OUT_INVALID                0                                // PWM 脉冲输出控制上臂截止

// -------- 以下为StepByStep之三增加的变量 070618 ------------------

unsigned char code         ga_ucForward[2] = {ML_FORWARD,MR_FORWARD};                // 前进控制
unsigned char code         ga_ucBack[2] = {ML_BACK,MR_BACK};                                                        // 后退控制

unsigned char code         ga_ucFloat[2] = {ML_FLOAT,MR_FLOAT};                                        // 惰行控制
unsigned char code         ga_ucBrake[2] = {ML_BRAKE,MR_BRAKE};                                        // 刹车控制

unsigned char code         ga_ucMask[2] = {ML_MASK,MR_MASK};                                                        // 屏蔽字,为了输出新的控制信号,清除原来的控制值

unsigned int                                ga_uiMotorCtrl[2];                                                // 电机控制参数,高字节控制方向, 0 - 前进 0xFF - 后退,低字节PWM值





/*********** 主程序 *****************/
void main(void)
{       
        unsigned int i,j,k;
  unsigned char ucCtrl_Buf;
        // ----------- 初始化硬件 ---------------
        P3M0 = P3MODE0;                                                                        // 因为只涉及 P3 口,所以此处只初始化 P3
        P3M1 = P3MODE1;

       

        // 初始化 PCA
        CMOD = FOSCdiv12_C;                                                                                // PCA 时钟源为 Fosc/12 , 不允许 count 溢出中断 CF。休眠时 PCA 工作
       
        CCAPM2 = EnCMP_C|EnPWM_C;                                                        // PCA 的模块 2 用于左电机控制,8 位PWM模式;
        PCA_PWM2 = 0x03;                                                                                        // 初始化为PWM恒输出 0, 以便进入惰行状态。
        CCAP2L = 0xFF;
        CCAP2H = 0xFF;

        CCAPM3 = EnCMP_C|EnPWM_C;                                                        // PCA 的模块 3 用于右电机控制,8 位PWM 模式;
        PCA_PWM3 = 0x03;                                                                                        // 初始化为PWM恒输出 0, 以便进入惰行状态。
        CCAP3L = 0xFF;
        CCAP3H = 0xFF;
       
        CL = 0;
        CH = 0;
        CCON = CCON|STARTPCA_C;                                                                // 启动 PCA
    Work_Display = DARK;

ucCtrl_Buf = ga_ucForward[0];
MotorDrv = (MotorDrv&ga_ucMask[0])|ucCtrl_Buf;
PCA_PWM2 = 0x00;                                                               
CCAP2L = 0x7F;
CCAP2H = 0x7F;
ucCtrl_Buf = ga_ucForward[1];
MotorDrv = (MotorDrv&ga_ucMask[1])|ucCtrl_Buf;
PCA_PWM3 = 0x00;                                                               
CCAP3L = 0x7F;
CCAP3H = 0x7F;
       
while(1)
{                                       

for(i=0;i<50000;i++);
for(j=0;j<50000;j++);
for(k=0;k<50000;k++);

Work_Display =        LIGHT;
ucCtrl_Buf = ga_ucBrake[0];
MotorDrv = (MotorDrv&ga_ucMask[0])|ucCtrl_Buf;
ucCtrl_Buf = ga_ucBrake[1];
MotorDrv = (MotorDrv&ga_ucMask[1])|ucCtrl_Buf;

}       
       
        // --------- 主循环 ------------------------
        while(1)
             {}
}

2

主题

8

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
308
威望
248
贡献
44
兑换币
22
注册时间
2009-12-30
在线时间
8 小时
2#
 楼主| 发表于 2010-1-14 19:43:39 | 只看该作者
没编辑过 不好意思啦  

大家帮俺看看吧
回复 支持 反对

使用道具 举报

2

主题

8

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
308
威望
248
贡献
44
兑换币
22
注册时间
2009-12-30
在线时间
8 小时
3#
 楼主| 发表于 2010-1-14 19:44:35 | 只看该作者
编译时没错的   但电机运行不了
硬件应该没问题
回复 支持 反对

使用道具 举报

13

主题

176

帖子

0

精华

常驻嘉宾

宝塔镇河妖

Rank: 8Rank: 8

积分
3622

活跃会员奖章

QQ
威望
832
贡献
2416
兑换币
258
注册时间
2009-1-23
在线时间
187 小时
4#
发表于 2010-1-14 21:08:17 | 只看该作者
电机运行不了,就检查电机驱动模块的电路和PWM。
回复 支持 反对

使用道具 举报

14

主题

586

帖子

0

精华

禁止发言

事人

积分
3226
威望
988
贡献
1966
兑换币
62
注册时间
2008-9-5
在线时间
136 小时
5#
发表于 2010-1-14 23:22:23 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

21

主题

1019

帖子

0

精华

常驻嘉宾

我爱雯婕

Rank: 8Rank: 8

积分
4657
威望
2223
贡献
1682
兑换币
4
注册时间
2009-3-4
在线时间
376 小时
6#
发表于 2010-1-15 17:36:11 | 只看该作者
回复 1# cxlmjy
没编辑过就用代码工具编辑一下吧,这么乱没有人愿意看下去的。确实也太多了,把你认为可能有问题的那部分写出来就可以了,而且你发错地方了,这里是讨论飞思卡尔单片机的代码的地方,其他类型单片机的请在“单片机世界”那个板块里发可能会有更多人答复你。
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

高级会员

Rank: 4

积分
780
威望
233
贡献
545
兑换币
0
注册时间
2011-3-22
在线时间
1 小时
7#
发表于 2011-3-22 09:01:32 | 只看该作者
不好意思,帮不上你
回复 支持 反对

使用道具 举报

16

主题

456

帖子

2

精华

功勋会员

Rank: 10Rank: 10Rank: 10

积分
368562

优秀会员奖章资源大师奖章论坛元老奖章活跃会员奖章

QQ
威望
102135
贡献
266181
兑换币
19
注册时间
2010-3-8
在线时间
123 小时
8#
发表于 2011-3-22 11:44:13 | 只看该作者
PWM 使能输出加了没?
回复 支持 反对

使用道具 举报

2

主题

68

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
QQ
威望
295
贡献
52
兑换币
0
注册时间
2011-3-27
在线时间
5 小时
9#
发表于 2011-3-30 12:53:26 | 只看该作者
你在电机驱动模块那里的主程序看看  是不是出现说明问题了
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-5 20:47 , Processed in 0.066322 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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