当我尝试在eclipse中编译代码时,会发生此错误,
错误
Building target: 0001_BLDC_test.elf
Invoking: AVR C Linker
avr-gcc -Wl,-Map,0001_BLDC_test.map -mmcu=atmega32a -o "0001_BLDC_test.elf" ./bldc.o ./main.o
./main.o: In function `bezpiecznik':
main.c:(.text.bezpiecznik+0x0): multiple definition of `bezpiecznik'
./bldc.o:bldc.c:(.text.bezpiecznik+0x0): first defined here
./main.o: In function `bezpiecznik_stop':
main.c:(.text.bezpiecznik_stop+0x0): multiple definition of `bezpiecznik_stop'
./bldc.o:bldc.c:(.text.bezpiecznik_stop+0x0): first defined here
collect2.exe: error: ld returned 1 exit status
make: *** [0001_BLDC_test.elf] Błąd 1
我使用Windows 10
,我在ECLIPSE和Atmel Sutdio 7.0
中尝试相同的代码,但仍然有相同的错误。
代码
#include <avr/io.h>
#include <util/delay.h>
#include "bldc.h"
#include "bldc.c"
//------------------------------------------------------------------
int main (void)
{
//ustaw i stan początkowy wyjść strujących tranzystorami
U_TR_G_USTAW_DDR
V_TR_G_USTAW_DDR
W_TR_G_USTAW_DDR
U_TR_D_USTAW_DDR
V_TR_D_USTAW_DDR
W_TR_D_USTAW_DDR
U_TR_G_PIN_L
V_TR_G_PIN_L
W_TR_G_PIN_L
U_TR_D_PIN_L
V_TR_D_PIN_L
W_TR_D_PIN_L
//na wszelki wypadek
WYLACZ_TRANZYSTORY
//UWAGA!!!
//Testuj program dowolnie sterując tranzystorami usuwając znak komentarza
//w poniższych instrukcjach, obserwując diody LED poszczególnych
//tranzystorów. Stan zabroniony powinien zostać złapany przez funkcję
//bezpiecznik() i sygnalizowany jej diodą LED.
//faza U tranzystor górny
//U_TR_G_ON;
//U_TR_G_OFF;
//faza U tranzystor dolny
//U_TR_D_ON;
//U_TR_D_OFF;
//faza V tranzystor górny
//V_TR_G_ON;
//V_TR_G_OFF;
//faza V tranzystor dolny
//V_TR_D_ON;
//V_TR_D_OFF;
//faza W tranzystor górny
//W_TR_G_ON;
//W_TR_G_OFF;
//faza W tranzystor dolny
//W_TR_D_ON;
//W_TR_D_OFF;
//sprawdzamy, czy nie ma stanu zabronionego na tranzystorach
//ZAWSZE WYWOŁUJ TĘ FUNKCJĘ, GDY ZMIENIASZ STAN TRANZYSTORÓW!!!
bezpiecznik();
//pętla główna
while(1);
}
bldc.h
//--- D E F I N I C J E D O T. B E Z P I E C Z N I K A ------
//LED bezpiecznika
#define BEZP_LED_DDR DDRD
#define BEZP_LED_PORT PORTD
#define BEZP_LED_PIN PD3
//--- D E F I N I C J E D O T. S I L N I K A ------
//Faza U
//tranzystor górny
#define U_TR_G_PORTx PORTB
#define U_TR_G_DDRx DDRB
#define U_TR_G_PINx PINB
#define U_TR_G_PIN PB1
#define U_TR_G_USTAW_DDR U_TR_G_DDRx |= (1<<U_TR_G_PIN); //ustaw port
#define U_TR_G_PIN_L U_TR_G_PORTx &= ~(1<<U_TR_G_PIN); //ustaw niski
#define U_TR_G_ON U_TR_G_PORTx |= (1<<U_TR_G_PIN); //włącz tranz.
#define U_TR_G_OFF U_TR_G_PORTx &= ~(1<<U_TR_G_PIN); //wyłącz tranz.
#define U_TR_G_SPRAW_STAN (U_TR_G_PINx & (1<<U_TR_G_PIN)) //warunek stanu
//tranzystor dolny
#define U_TR_D_PORTx PORTD
#define U_TR_D_DDRx DDRD
#define U_TR_D_PINx PIND
#define U_TR_D_PIN PD4
#define U_TR_D_USTAW_DDR U_TR_D_DDRx |= (1<<U_TR_D_PIN); //ustaw port
#define U_TR_D_PIN_L U_TR_D_PORTx &= ~(1<<U_TR_D_PIN); //ustaw niski
#define U_TR_D_ON U_TR_D_PORTx |= (1<<U_TR_D_PIN); //włącz tranz.
#define U_TR_D_OFF U_TR_D_PORTx &= ~(1<<U_TR_D_PIN); //wyłącz tranz.
#define U_TR_D_SPRAW_STAN (U_TR_D_PINx & (1<<U_TR_D_PIN)) //warunek stanu
//Faza V
//tranzystor górny
#define V_TR_G_PORTx PORTB
#define V_TR_G_DDRx DDRB
#define V_TR_G_PINx PINB
#define V_TR_G_PIN PB3
#define V_TR_G_USTAW_DDR V_TR_G_DDRx |= (1<<V_TR_G_PIN); //ustaw port
#define V_TR_G_PIN_L V_TR_G_PORTx &= ~(1<<V_TR_G_PIN); //ustaw niski
#define V_TR_G_ON V_TR_G_PORTx |= (1<<V_TR_G_PIN); //włącz tranz.
#define V_TR_G_OFF V_TR_G_PORTx &= ~(1<<V_TR_G_PIN); //wyłącz tranz.
#define V_TR_G_SPRAW_STAN (V_TR_G_PINx & (1<<V_TR_G_PIN)) //warunek stanu
//tranzystor dolny
#define V_TR_D_PORTx PORTD
#define V_TR_D_DDRx DDRD
#define V_TR_D_PINx PIND
#define V_TR_D_PIN PD5
#define V_TR_D_USTAW_DDR V_TR_D_DDRx |= (1<<V_TR_D_PIN); //ustaw port
#define V_TR_D_PIN_L V_TR_D_PORTx &= ~(1<<V_TR_D_PIN); //ustaw niski
#define V_TR_D_ON V_TR_D_PORTx |= (1<<V_TR_D_PIN); //włącz tranz.
#define V_TR_D_OFF V_TR_D_PORTx &= ~(1<<V_TR_D_PIN); //wyłącz tranz.
#define V_TR_D_SPRAW_STAN (V_TR_D_PINx & (1<<V_TR_D_PIN)) //warunek stanu
//Faza W
//tranzystor górny
#define W_TR_G_PORTx PORTB
#define W_TR_G_DDRx DDRB
#define W_TR_G_PINx PINB
#define W_TR_G_PIN PB2
#define W_TR_G_USTAW_DDR W_TR_G_DDRx |= (1<<W_TR_G_PIN); //ustaw port
#define W_TR_G_PIN_L W_TR_G_PORTx &= ~(1<<W_TR_G_PIN); //ustaw niski
#define W_TR_G_ON W_TR_G_PORTx |= (1<<W_TR_G_PIN); //włącz tranz.
#define W_TR_G_OFF W_TR_G_PORTx &= ~(1<<W_TR_G_PIN); //wyłącz tranz.
#define W_TR_G_SPRAW_STAN (W_TR_G_PINx & (1<<W_TR_G_PIN)) //warunek stanu
//tranzystor dolny
#define W_TR_D_PORTx PORTD
#define W_TR_D_DDRx DDRD
#define W_TR_D_PINx PIND
#define W_TR_D_PIN PD7
#define W_TR_D_USTAW_DDR W_TR_D_DDRx |= (1<<W_TR_D_PIN); //ustaw port
#define W_TR_D_PIN_L W_TR_D_PORTx &= ~(1<<W_TR_D_PIN); //ustaw niski
#define W_TR_D_ON W_TR_D_PORTx |= (1<<W_TR_D_PIN); //włącz tranz.
#define W_TR_D_OFF W_TR_D_PORTx &= ~(1<<W_TR_D_PIN); //wyłącz tranz.
#define W_TR_D_SPRAW_STAN (W_TR_D_PINx & (1<<W_TR_D_PIN)) //warunek stanu
//Wspólna definicja wyłączająca wszystkie tranzystory
#define WYLACZ_TRANZYSTORY U_TR_G_OFF; U_TR_D_OFF; V_TR_G_OFF; V_TR_D_OFF; W_TR_G_OFF; W_TR_D_OFF;
bldc.c
/*
* bldc.c
*
* Created on: 30 lip 2019
* Author: krzys
*/
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include "BLDC.h"
void bezpiecznik(void){
//Sprawdzamy, czy nie występuje konflikt sterowania, powodujący
//jednoczene otwarcie tranzystora górnego i dolnego w tej samej fazie,
//co oznacza wystąpienie zwarcia !!!
if(U_TR_G_SPRAW_STAN && U_TR_D_SPRAW_STAN){
//Faza U - oba tranzystory są włączone - sytuacja niedopuszczalna!!!
bezpiecznik();
}else if(V_TR_G_SPRAW_STAN && V_TR_D_SPRAW_STAN){
//Faza V - oba tranzystory są włączone - sytuacja niedopuszczalna!!!
bezpiecznik();
}else if(W_TR_G_SPRAW_STAN && W_TR_D_SPRAW_STAN){
//Faza W - oba tranzystory są włączone - sytuacja niedopuszczalna!!!
bezpiecznik();
}
}
//------------------------------------------------------------------
void bezpiecznik_stop(void){
//Funkcja wyłącza wszelkie tranzystory oraz przechodzi w stan sygnalizacji
//błędu komutacji. Funkcja ta razem z funkcją bezpiecznik() pełni rolę
//zabezpieczenia przeciwzwarciowego dla błędnie działającego algorytmu
// komutacji w czasie pisania i testów programu.
//wyłącz przerwania
cli();
//natychmiast wyłącz tranzystory
WYLACZ_TRANZYSTORY
//i ustaw stany niskie na pinach sterujących
U_TR_G_USTAW_DDR
V_TR_G_USTAW_DDR
W_TR_G_USTAW_DDR
U_TR_D_USTAW_DDR
V_TR_D_USTAW_DDR
W_TR_D_USTAW_DDR
U_TR_G_PIN_L
V_TR_G_PIN_L
W_TR_G_PIN_L
U_TR_D_PIN_L
V_TR_D_PIN_L
W_TR_D_PIN_L
//ustaw pin LED jako wyjście
BEZP_LED_DDR |= (1<<BEZP_LED_PIN);
//zatrzymaj program w pętli nieskończonej sygnalizując błąd
while(1){
//zmień stan LED na przeciwny
BEZP_LED_PORT ^= (1<<BEZP_LED_PIN);
//co 100ms
_delay_ms(100);
}
}
<>