【问题标题】:Issues with conflicting declarations and type redeclaration on PIC18F87f22 (C language)PIC18F87f22(C 语言)上的冲突声明和类型重新声明问题
【发布时间】: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


【解决方案1】:

我昨天没有机会阅读您的代码(您发布了很多代码),但我想我发现了您的错误。在您的 mcc.h 中,您已将 PID_courant 声明为

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);

但是,在您的 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)

如果比较两者,您会发现第一个(在 mcc.h 中)缺少第三个参数 int16_t integrale_courant。您还将最后一个参数声明为 int wind_up_flag_courant 它 mcc.h 但在 mcc.c 中声明为 int16_t wind_up_flag_courant

本质上,您的代码试图改变 PID_courant 在 mcc.h 中的声明方式;即试图重新定义它。这就是引发错误的原因。

【讨论】:

  • 非常好,我前几天发现的!
  • 太棒了!要将您的问题标记为已解决,您可以通过单击投票按钮下方的复选标记将答案标记为正确(这也会给您两个声望点)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-23
  • 1970-01-01
  • 2018-12-12
  • 1970-01-01
  • 2018-11-27
  • 2017-07-15
相关资源
最近更新 更多