高级会员
- 积分
- 955
- 威望
- 609
- 贡献
- 260
- 兑换币
- 147
- 注册时间
- 2012-10-16
- 在线时间
- 43 小时
|
显示错误竟然这样,请问是哪里的问题?
[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
|