【发布时间】:2018-11-29 18:06:23
【问题描述】:
首先我要为我糟糕的英语以及我非常的 C 语言基本技能道歉。我真的很挣扎。
我目前正在尝试为直流电机实施级联 PID 调节。我正在使用 PIC1887f22 进行调节,并且正在使用 MPLAB X IDE 4.05 进行编码。
我在尝试构建项目时遇到了一些问题,我需要你们的一些指导。
这是我的 PID 函数在名为 mcc.c 的文件中的原型/声明
int16_t PID_Courant(int16_t erreur_courant, int16_t consigne_courant,int16_t
integrale_courant, int16_t kp_courant, int16_t ki_courant, int16_t
kd_courant,int16_t wind_up_flag_courant)
{
int32_t prop=0;
int32_t dev=0;
int16_t Erreur_courant_old=0;
int32_t integra=0;
int32_t u=0;
int16_t a=0;
Erreur_courant_old = erreur_courant;
a = get_courant();
erreur_courant = consigne_courant-a;
prop = kp_courant * erreur_courant;
if(!wind_up_flag_courant)
{
integrale_courant = integrale_courant + erreur_courant;
}
integra = ki_courant * integrale_courant;
dev = erreur_courant-Erreur_courant_old;
u = prop + integra + dev;
u = u/100000000;
if (abs(u)>TENSION_MAX)
{
wind_up_flag_courant=1;
if(u<0)
{
u=-TENSION_MAX;
}
else
{
u=TENSION_MAX;
}
}
return u;
}
函数的参数都在我的main.c中(在我的main函数之前)声明为全局变量,如下:
#include <xc.h>
#include"mcc_generated_files/epwm1.h"
#include"mcc_generated_files/epwm2.h"
#include"mcc_generated_files/epwm3.h"
#include"mcc_generated_files/interrupt_manager.h"
#include"mcc_generated_files/mcc.h"
#include"mcc_generated_files/tmr2.h"
#include"mcc_generated_files/pin_manager.h"
#define KE 1
#define KC 1
#define TE_COURANT 0.00001
#define TE_VITESSE 0.0001
#define VITESSE_MAX 60000
#define COURANT_MAX 50000 //mA
#define TENSION_MAX 240000 //mV
int16_t Security_flag=1;
int Stop_flag=1;
int Start_flag=0;
int Wind_up_flag_courant=0;
int Wind_up_flag_vitesse=0;
int Emergency_flag=0;
int Choix_Mode=0;
int16_t MESURE_COURANT=0;
int16_t MESURE_VITESSE=0;
int16_t Consigne_courant =0;
int16_t Consigne_vitesse = 0;
int16_t Kp_courant=0;
int16_t Ki_courant=0;
int16_t Kd_courant=0;
int16_t Kp_vitesse=0;
int16_t Ki_vitesse=0;
int16_t Kd_vitesse=0;
int16_t Erreur_courant=0;
int16_t Erreur_vitesse=0;
int32_t Integrale_courant=0;
int32_t Integrale_vitesse=0;
诀窍在于,在PID_Courant 函数内部,我修改了用于调用该函数的变量,但我不确定这是否适合我的编译器。无论如何,我收到了这些错误代码:
mcc_generated_files/mcc.c:116: error: (984) type redeclared
和:
mcc_generated_files/mcc.c:116: error: (1098) conflicting declarations for variable "PID_Courant" (mcc_generated_files/mcc.c:115)
我看不出这里有什么冲突。是不是因为我试图将两个int16_t 相乘的结果放入另一个int16_t?
我尝试将其中一些变量切换为 int32_t,但没有任何改变。
这是我的 main.c 的完整代码:
#include <xc.h>
#include"mcc_generated_files/epwm1.h"
#include"mcc_generated_files/epwm2.h"
#include"mcc_generated_files/epwm3.h"
#include"mcc_generated_files/interrupt_manager.h"
#include"mcc_generated_files/mcc.h"
#include"mcc_generated_files/tmr2.h"
#include"mcc_generated_files/pin_manager.h"
#define KE 1
#define KC 1
#define TE_COURANT 0.00001
#define TE_VITESSE 0.0001
#define VITESSE_MAX 60000
#define COURANT_MAX 50000 //mA
#define TENSION_MAX 240000 //mV
int16_t Security_flag=1;
int Stop_flag=1;
int Start_flag=0;
int Wind_up_flag_courant=0;
int Wind_up_flag_vitesse=0;
int Emergency_flag=0;
int Choix_Mode=0;
int16_t MESURE_COURANT=0;
int16_t MESURE_VITESSE=0;
int16_t Consigne_courant =0;
int16_t Consigne_vitesse = 0;
int16_t Kp_courant=0;
int16_t Ki_courant=0;
int16_t Kd_courant=0;
int16_t Kp_vitesse=0;
int16_t Ki_vitesse=0;
int16_t Kd_vitesse=0;
int16_t Erreur_courant=0;
int16_t Erreur_vitesse=0;
int32_t Integrale_courant=0;
int32_t Integrale_vitesse=0;
void main(void)
{
SYSTEM_Initialize();
TMR2_StartTimer();
while(!Start_flag)
{
;
}
if(Choix_Mode)
{
EPWM2_Initialize();
EPWM3_Initialize();
}
else
{
EPWM1_Initialize();
}
Consigne_courant=PID_Vitesse(Erreur_vitesse,Consigne_vitesse,Kp_vitesse,Ki_vitesse,Kd_vitesse,Wind_up_flag_vitesse);
while(!Stop_flag)
{
int16_t tension=0;
int i=0;
do
{
tension = PID_Courant(Erreur_courant,Consigne_courant,Integrale_courant,Kp_courant,Ki_courant,Kd_courant,Wind_up_flag_courant);
Put_Rapport_Cyclique(tension,Choix_Mode);
i++;
}while(i<10);
Consigne_courant = PID_Vitesse(Erreur_vitesse,Consigne_vitesse,Integrale_vitesse,Kp_vitesse,Ki_vitesse,Kd_vitesse,Wind_up_flag_vitesse);
Security_flag = Update_Security_flag();
}
if(Choix_Mode)
{
STOP_EPWM2();
STOP_EPWM3();
}
else
{
STOP_EPWM1();
}
}
这是我的 mcc.c:
#include "mcc.h"
#define A 399/240000
#define B 199/240000
#define VITESSE_MAX 6000
#define COURANT_MAX 5000 //mA
#define TENSION_MAX 24000 //mV
void SYSTEM_Initialize(void)
{
INTERRUPT_Initialize();
PIN_MANAGER_Initialize();
OSCILLATOR_Initialize();
//EPWM1_Initialize();
TMR2_Initialize();
//EPWM2_Initialize();
//EPWM3_Initialize();
}
void OSCILLATOR_Initialize(void)
{
// SCS FOSC; IDLEN disabled; IRCF 16MHz_HF;
OSCCON = 0x70;
// SOSCGO disabled; MFIOSEL disabled;
OSCCON2 = 0x00;
// INTSRC INTRC; PLLEN disabled; TUN 0;
OSCTUNE = 0x00;
// ROSEL System Clock(FOSC); ROON disabled; ROSSLP Disabled in Sleep mode; RODIV Fosc;
REFOCON = 0x00;
}
int16_t get_courant()
{
return 1;
}
int16_t get_vitesse()
{
return 1;
}
int16_t PID_Courant(int16_t erreur_courant, int16_t consigne_courant,int16_t integrale_courant, int16_t kp_courant, int16_t ki_courant, int16_t kd_courant,int16_t wind_up_flag_courant)
{
int32_t prop=0;
int32_t dev=0;
int16_t Erreur_courant_old=0;
int32_t integra=0;
int32_t u=0;
int16_t a=0;
Erreur_courant_old = erreur_courant;
a = get_courant();
erreur_courant = consigne_courant-a;
prop = kp_courant * erreur_courant;
if(!wind_up_flag_courant)
{
integrale_courant = integrale_courant + erreur_courant;
}
integra = ki_courant * integrale_courant;
dev = erreur_courant-Erreur_courant_old;
u = prop + integra + dev;
u = u/100000000;
if (abs(u)>TENSION_MAX)
{
wind_up_flag_courant=1;
if(u<0)
{
u=-TENSION_MAX;
}
else
{
u=TENSION_MAX;
}
}
return u;
}
int16_t PID_Vitesse(int16_t erreur_vitesse, int16_t consigne_vitesse,int16_t integrale_vitesse ,int16_t Kk_vitesse, int16_t ki_vitesse, int16_t kd_vitesse, int wind_up_flag_vitesse)
{
int16_t prop=0;
int16_t dev=0;
int32_t integra=0;
int32_t u=0;
int16_t a=0;
int16_t Erreur_vitesse_old=0;
Erreur_vitesse_old = Erreur_vitesse;
a = get_vitesse();
Erreur_vitesse = Consigne_vitesse-a;
prop = Kp_vitesse * Erreur_vitesse;
if(!Wind_up_flag_vitesse)
{
Integrale_vitesse = Integrale_vitesse + Erreur_vitesse;
}
integra = Ki_vitesse*Integrale_vitesse;
dev = Erreur_vitesse-Erreur_vitesse_old;
u = prop + integra + dev;
u = u / (1000000);
if (u>abs(COURANT_MAX))
{
Wind_up_flag_vitesse=1;
if(u<0)
{
u=-COURANT_MAX;
}
else
{
u=COURANT_MAX;
}
}
return u;
}
void Put_Rapport_Cyclique(int16_t u, int choix_mode)
{
if(choix_mode=1)
{
if (u<=0)
{
bit_set(CCP1CON,1);
}
else
{
bit_clr(CCP1CON,1);
}
u=A*u;
EPWM1_LoadDutyValue(u);
}
else
{
u=199+u*B;
}
EPWM2_LoadDutyValue(u);
EPWM3_LoadDutyValue(u);
}
int Update_Security_flag(void)
{
int a=0;
int b=0;
a=get_courant();
b=get_vitesse();
if (abs(a)> COURANT_MAX || abs(b)> VITESSE_MAX)
{
return 1;
}
else
{
return 0;
}
}
void STOP_EPWM1(void)
{
bits_off(CCP1CON,0b00001111);
}
//EPWM1_LoadDutyValue(0);
void STOP_EPWM2(void)
{
//EPWM2_LoadDutyValue(0);
bits_off(CCP2CON,0b00001111);
}
void STOP_EPWM3(void)
{
//EPWM3_LoadDutyValue(0);
bits_off(CCP3CON, 0b00001111);
}
和 mcc.h :
#define MCC_H
#include <xc.h>
#include<math.h>
#include<stdlib.h>
#include<stdio.h>
#include<stdint.h>
#include "pin_manager.h"
#include <stdint.h>
#include <stdbool.h>
#include "interrupt_manager.h"
#include "epwm1.h"
#include "epwm2.h"
#include "tmr2.h"
#include "epwm3.h"
#define unsigned char RAPPORT_CYCLIQUE 0
#define bit_set(var,bitno) ((var) |= 1 << (bitno))
#define bit_clr(var,bitno) ((var) &= ~(1 << (bitno)))
#define bits_on(var,mask) var |= mask
#define bits_off(var,mask) var &= ~0 ^ mask
#define _XTAL_FREQ 16000000
/*
* Initializes the device to the default states configured in the MCC GUI
*/
void SYSTEM_Initialize(void);
/*
* Initializes the oscillator to the default states configured in the MCC GUI
*/
void OSCILLATOR_Initialize(void);
void STOP_EPWM1(void);
void STOP_EPWM2(void);
void STOP_EPWM3(void);
int16_tget_courant(void);
int16_tget_vitesse(void);
int16_t PID_Courant(int16_t erreur_courant, int16_t consigne_courant, int16_t kp_courant, int16_t ki_courant, int16_t kd_courant,int wind_up_flag_courant);
int16_t PID_Vitesse(int16_t erreur_vitesse, int16_t consigne_vitesse, int16_t kp_vitesse, int16_t ki_vitesse, int16_t kd_vitesse,int wind_up_flag_vitesse);
int16_t Put_Rapport_cyclique(int16_t u, int choix_mode);
int Update_Security_flag(void);
任何人都可以在这里看到问题吗? 您认为导致这些错误的原因是什么? 非常感谢您阅读本文!
【问题讨论】:
-
由于错误消息为您提供了错误的行号,您应该能够找到它的位置,并发布一段更简洁的包含错误的代码。
-
谢谢,我知道问题出在我的 PID_Courant(...) 函数上,但我看不出它有什么问题。
-
PID_Courant似乎在一个地方有 5 个参数,在其他地方有 6 个和 7 个。 -
Jǝssǝ 的意思是,您应该使显示问题的代码尽可能小,删除所有不相关的部分。它使查找错误变得更加容易,并让其他人有兴趣为您查找错误。
标签: c types declaration