智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 1773|回复: 6
打印 上一主题 下一主题

[光电] 电机驱动程序编译还有 错误!请教一下!跪谢!在线等!!!

[复制链接]

5

主题

50

帖子

0

精华

高级会员

Rank: 4

积分
955

活跃会员奖章优秀会员奖章

QQ
威望
609
贡献
260
兑换币
147
注册时间
2012-10-16
在线时间
43 小时
跳转到指定楼层
1#
发表于 2013-4-11 21:23:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
显示错误竟然这样,请问是哪里的问题?
[img]file:///C:\Users\Caryu_Wong\AppData\Roaming\Tencent\Users\564282096\QQ\WinTemp\RichOle\Z$6ECMV[A[F%YZ)_VW@XJ}D.jpg[/img]




程序如下:

#include <hidef.h>      /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */


/*-------------------------------------------------------------------------*/
/*                                 PID控制程序*                     */
/*-------------------------------------------------------------------------*/
typedef struct {
  double ProportionalGain;
  double IntegralGain;
  double DerivativeGain;
  double InputErrorK_1;
  double IntegralPortionK_1;
  double PositivePIDLimit;
  double NegativePIDLimit;
}
PIDSING;
float DoublePIDCalc(double GivenValue, double MeasureValue, PIDSING*pp) {
  float dError, Error;
  Error=GivenValue-MeasureValue;     /*计算Error*/
  pp->IntegralPortionK_1=Error+pp->IntegralPortionK_1;
                                     /*计算SUM error*/
  if(pp->IntegralPortionK_1>pp->PositivePIDLimit)
     pp->IntegralPortionK_1=pp->PositivePIDLimit;
  if(pp->IntegralPortionK_1<pp->PositivePIDLimit)
     pp->IntegralPortionK_1=pp->PositivePIDLimit;
  dError=Error-pp->InputErrorK_1;   /*求误差微分*/
  pp->InputErrorK_1=Error;
  Error=pp->ProportionalGain*Error+pp->IntegralGain*pp->IntegralPortionK_1+pp->DerivativeGain*dError;
                                    /*按照公式计算输出值*/
  if(Error>pp->PositivePIDLimit)
     Error=pp->PositivePIDLimit;
  if(Error<pp->PositivePIDLimit)
     Error=pp->PositivePIDLimit;
  return Error;
}


/***************************************************************************/
/*                             PWM模块初始化                               */
/***************************************************************************/
#define MC33886_EN PTP_PTP7
#define MC33886_IN1 PTP_PTP3
#define MC33886_IN2 PTP_PTP5
//******************************Forward_Init()******************************/
//嘉定前进方向,初始化函数
void Forward_Init(void) {
  MC33886_EN=0;
  PWME_PWME3=0;
  PWME_PWME5=0;
  PWMPRCLK |=0x40;      /*CLOCK B 总线频率的4分频*/
                         /*通道3用clock B时钟源,24MHZ/4=6M*/
  PWMPOL_PPOL3=0;        /*先低电平,第七方式默认左对齐*/
  PWMCTL_CON23=1;        /*16BIT连接*/
  PWMPER23=750;          /*电动机频率8kHZ 1/1.5M*x=1/2kHz*/
  PWMDTY23=300;          /*占空比精度1/750*/
  PWMCNT23=0;            /*启动PWM*/
  MC33886_EN=1;
  //MC33886 Enable
  MC33886_IN2=1;         /*MC33886 IN2前进方向*/
  PWME_PWME3=1;          /*PWM通道输出*/
}
//****************************Backward_Init()********************************/
//假定后退方向,初始化函数
void Backward_Init(void){
  //Forward_Flag=0;
  MC33886_EN=0;
  PWME_PWME5=0;
  PWME_PWME3=0
  PWMPRCLK|=0x03;       /*CLOCKSA总线频率的4分频,通道5用clock A*/
                         /*24MHZ/4=6M*/
  PWMPOL_PPOL5=0;        /*先低电平,对齐方式默认左对齐*/
  PWMCTL_CON45=1;        /*16BIT连接*/
  PWMPER45=750;          /*电动机的频率是8kHz    1/6M*x=1/8kHz*/
  PWMDTY45=200;          /*占空比精度1/750*/
  PWMCNT45=0;
  MC33886_EN=1;          /*MC33886使能*/
  MC33886_IN1=1;         /*MC33886 IN2前进方向*/
  PWME_PWME5=1;          /*PWM通道输出*/
}
void SetDuty(unsigned int temp) {
  PWMDTY23=temp;
}

/****************************************************************************/
/*                            速度测量子函数                                */
/****************************************************************************/
//*******************************ECT_Init()**********************************/
//ECT初始化,使用输入捕捉功能
void ECT_Init(void) {
  TSCR1_TFFCA=1;        /*快速清除标志*/
  TSCR2=0x07;           /*时钟128分频*/
  TIOS_IOS1=0;          /*通道1为输入捕捉*/
  TCTL4_EDG1A=1;        /*捕捉通道1上升沿*/
  TCTL4_EDG1B=0;
  TIE_C1I=1;            /*通道1中断使能*/
  TSCR1_TEN=1;          /*定时器使能*/
}
ulong SpeedTemp[3]={0,0,0};
#pragma CODE_SEG NON_BANKED
/*定时器输入捕捉中断方式*/
#pragma TRAP_PROC
void Int_TimerCapture_C1(void) {
  SpeedTemp[1]=TC1;
  if(SpeedTemp[1] >=SpeedTemp[0])
  SpeedTemp[2]=SpeedTemp[1]-SpeedTemp[0];
  else {
    SpeedTemp[2]=65536-SpeedTemp[0];
    SpeedTemp[2]+=SpeedTemp[1];
    /*SpeedTemp[2]即为捕捉道德数,16位自由计数器的时钟是187.5kHz*/
  }
  SpeedTemp[0]=SpeedTemp[1];
}
#pragma CODE_SEG DEFAULT

/***************************************************************************/
/*                                AD采样函数                               */
/***************************************************************************/
void AdInitial(){
  ATD0CTL2=0xc0;         /*打开AD电源开关边缘触发*/
  ATD0CTL3=0x28;         /*一个序列转换5次,非FIFO模式*/
  ATD0CTL4=0x45;         /*10位精度*/
}
unsigned int GetSampleResult(unsigned char channel){
  unsigned int sum, Max, Min, a[5];
  unsigned char i;
  ATD0CTL5=9xa-=channel; /*右对齐,无符号数,单词转化*/
  while(!ATD0STAT0_SCF); /*等待一个转换队列完成*/
  a[0]=ATD0DR0;
  a[1]=ATD0DR1;
  a[2]=ATD0DR2;
  a[3]=ATD0DR3;
  a[4]=ATD0DR4;
  Max=a[0];
  Min=a[0];
  sum=a[0];
  for(i=1; i<5,i++){
    sum=sum+a;
    if(a > Max) Max=a;
    if(a < Min) Min=a;
  }
  return((sum-Max-Min)/3);
}

/****************************************************************************/
/*                                控制主程序                                */
/****************************************************************************/
void RTI_Init(void){
  RTICTL=0x1F;          /*实时中断,1ms中断一次*/
  CRGINT=0X80;          /*使能实施中断*/
}
#pragma CODE_SEG NON_BANKED
#pragma TRAP_PROC
PIDSING pid;
void Int_RTI(void){
  unsigned int givenvalue;
  float pidvalue;
  CRGFLG=0x80;          /*清RTIF标志*/
  givenvalue=GetSampleResult(0);
  if(givenvalue >= 512){
    Forward_Init();
    givenvalue -= 512;
  } else{
    Backward_Init();
    givenvalue =512-givenvalue;
  }
  pidvalue=DoublePIDCalc(givenvalue,(18750-SpeedTemp[2])*512/18750,&pid);
  SetDuty((unsigned int)pidvalue*65535/512);
}
#pragma CODE_SEG DEFAULT




void main(void) {
  /* put your own code here */

        EnableInterrupts;
  pid.ProportionalGain=0.1;
  pid.IntegralGain=0.08;
  pid.NegativePIDLimit=0;
  pid.PositivePIDLimit=65535;
  AdInitial();
  ECT_Init();
  RTI_Init();


  for(;;) {

  } /* loop forever */
  /* please make sure that you never leave main */
}


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

5

主题

50

帖子

0

精华

高级会员

Rank: 4

积分
955

活跃会员奖章优秀会员奖章

QQ
威望
609
贡献
260
兑换币
147
注册时间
2012-10-16
在线时间
43 小时
2#
 楼主| 发表于 2013-4-11 21:36:17 | 只看该作者
没有大神潜水吗?!自己顶一个!!!求助啊!!!
回复 支持 反对

使用道具 举报

6

主题

182

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1582
威望
764
贡献
520
兑换币
385
注册时间
2012-10-29
在线时间
149 小时
3#
发表于 2013-4-11 22:06:43 | 只看该作者
这么多代码,不好帮你直接找出来,只能提示说少了个分号,你仔细看看,这样的提示机油可能是其他错误造成的,比如 else前一句不是if,缺少“}”,以及“)”等都会提示同样的错误!!!
回复 支持 反对

使用道具 举报

1

主题

128

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1005
威望
495
贡献
262
兑换币
281
注册时间
2012-12-12
在线时间
124 小时
毕业学校
dydu
4#
发表于 2013-4-11 22:27:22 | 只看该作者
明显少了一个分号,你这孩子不动脑啊。做车也白搭,这程序时拿来就用的吧。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

1

主题

2067

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
5124

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

威望
2752
贡献
898
兑换币
59
注册时间
2012-12-8
在线时间
737 小时
5#
发表于 2013-4-11 22:32:33 | 只看该作者
楼上正解
回复 支持 反对

使用道具 举报

1

主题

128

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1005
威望
495
贡献
262
兑换币
281
注册时间
2012-12-12
在线时间
124 小时
毕业学校
dydu
6#
发表于 2013-4-11 22:32:45 | 只看该作者
你第一个图挂了。不知道神马玩意
回复 支持 反对

使用道具 举报

5

主题

50

帖子

0

精华

高级会员

Rank: 4

积分
955

活跃会员奖章优秀会员奖章

QQ
威望
609
贡献
260
兑换币
147
注册时间
2012-10-16
在线时间
43 小时
7#
 楼主| 发表于 2013-4-13 10:45:25 | 只看该作者
iamback 发表于 2013-4-11 22:27
明显少了一个分号,你这孩子不动脑啊。做车也白搭,这程序时拿来就用的吧。

额。。。这我也没发现。。。谢了!
秀下限了~呵呵
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-21 02:37 , Processed in 0.480738 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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