diff --git a/esr24_g10_radar_scanner/main.c b/esr24_g10_radar_scanner/main.c index 7eb9953da979ebfa8a0a614531d443c76ef54549..64e9262c7180184edf69cd4e1381bda41c604d0e 100644 --- a/esr24_g10_radar_scanner/main.c +++ b/esr24_g10_radar_scanner/main.c @@ -2,7 +2,14 @@ * @file main.c * @brief Dies ist eine Beschreibung der main.c Datei. * - * Detaillierte Beschreibung der Datei. + * Diese Datei enthält die Hauptfunktion und die Initialisierungsroutinen für das System. + * Das System verwendet einen MSP430FR2355-Mikrocontroller, um verschiedene Hardware-Komponenten + * zu steuern, einschließlich eines Servos SG90, eines Ultraschallsensor HC-SR04 und eines LC-Displays HD44780. + * + * @authors + * - Alexander Görlitz + * - Aaron Kaipf + * - Christopher Seitz */ /* --COPYRIGHT--,BSD @@ -35,58 +42,17 @@ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * --/COPYRIGHT--*/ -//****************************************************************************** -// Software Trim on 1MHz DCO -// -// This example uses the following peripherals and I/O signals. You must -// review these and change as needed for your own board: -// - CS module -// - GPIO Port peripheral -// -// This example uses the following interrupt handlers. To use this example -// in your own application you must add these interrupt handlers to your -// vector table. -// -// TI sample project cs_ex1_DCO1MHzSWTrim -// Modified by S. Steddin -// 2020-06-22 -//****************************************************************************** + * --/COPYRIGHT-- + */ + /* - * Version 0.1 - * - * Zweckbestimmung: - * Demonstration, wie der Ultraschallsensor SR04 zur Messung eines Abstandes - * über das Launchpad angesteuert werden kann. + * Version 1.0.0 * * Bestimmungsgemäßer Gebrauch: - * 1. Ultraschallsensor gemäß Verdrahtungsplan mit dem Launchpad verbinden. - * Der Sensor soll mit 5V versorgt werden; das an das Launchpad gesendete - * ECHO-Signal muss daher über einen Spannungsteiler mit dem CCIA Pin verbunden - * verbunden werden, damit die maximal zulässigen 3,3V am DIO-Pin nicht über- - * schritten werden. - * 2. Launchpad über USB-Buchse mit Spannung versorgen - * 3. Sensor auf Objekt ausrichten, zu dem der Abstand gemessen werden soll - * 4. Über Breakpoint den errechneten Abstandswert auslesen. - * - * - * Funktionale Anforderungen: - * - Es soll der gesamte mögliche Messbereich des Sensors ausgenützt werden - * - Während der Laufzeit des US-Bursts soll die rote LED leuchten - * - Messwiederholrate 10Hz - * - * Nicht funktionale Anforderungen: - * - SMCLK: 1 MHz kalibriert - * - Timerclock 500 kHz - * - * Iterationsplan: - * - 0.1: clocksystem SMCLK 1 MHz + Definition des us_sensor API - * Version liefert noch keine Ergebnisse; nur das Rohgerüst - * - 0.2: Messwert wird über debugger ausgewertet - * - 0.3: Messwertausgabe über Backchannel UART - * - 0.4: Messwertausgabe über TI GUI-Monitor + * 1. Launchpad über USB-Buchse mit Spannung versorgen * * Ultraschallsensor Verdrahtung: + * * MSP430FR2355 5V---| * ----------------- ----|------- * /|\| | | @@ -100,55 +66,36 @@ * | | | GND * GND * - * * LCD und I2C Verdrahtung: - * MSP430FR2355 4k7 4k7 PCF8574 - * master | | - * ----------------- | | - * -|XIN P1.2/UCB0SDA|<-|----+->| SDA - * | | | | - * -|XOUT | | | - * | P1.3/UCB0SCL|<-+------>|SCL + * MSP430FR2355 PCF8574T + * master + * ----------------- + * -|XIN P1.2/UCB0SDA|<-------->| SDA + * | | | + * -|XOUT | | + * | P1.3/UCB0SCL|<-------->|SCL * LEDred<--|P1.0 | | - * 3,3V-->| Vcc + * 5V-->| Vcc * - * Hinweis zu den pull-up Widerständen: - * Prüfen, ob die Widerstände bereits auf dem PCF8574 board installiert sind (Standard). - * Ggf. müssen diese entfernt werden, wenn das Display nicht mit 3,3V, sondern mit 5V - * betrieben werden soll. Anstelle der entfernten SMD-Widerstände müssen dann externe - * pull-up Widerstände installiert werden, die nicht mit Vcc des Displays (5V), sondern - * mit Vcc des Launchpads (3,3V) verbunden sind. Für die Steuerung des I2C Buses sollten - * in diesem Fall 3,3 V knapp ausreichend sein (> 0,7*Vcc), jedoch wird das Display hierbei - * knapp außerhalb der Spezifikation betrieben. + * MSP430FR235x Demo - Timer1_B3, PWM TB1.1-2, Up Mode, DCO SMCLK * * - *//******************************************************************************* -// MSP430FR235x Demo - Timer1_B3, PWM TB1.1-2, Up Mode, DCO SMCLK -// -// Description: This program generates two PWM outputs on P2.0,P2.1 using -// Timer1_B configured for up mode. The value in CCR0, 1000-1, defines the PWM -// period and the values in CCR1 and CCR2 the PWM duty cycles. Using ~1MHz -// SMCLK as TBCLK, the timer period is ~1ms with a 75% duty cycle on P2.0 -// and 25% on P2.1. -// ACLK = n/a, SMCLK = MCLK = TBCLK = 1MHz -// -// Servo Verdahtung: -// MSP430FR2355 -// --------------- -// /|\| | -// | | | -// --|RST | -// | | -// | P2.0/TB1.1|--> CCR1 - XX% PWM -// | | -// -// -// Darren Lu -// Texas Instruments Inc. -// Oct. 2016 -// Built with IAR Embedded Workbench v6.50 & Code Composer Studio v6.2 -// + * Servo Verdrahtung: + * MSP430FR2355 + * --------------- + * /|\| | + * | | | + * --|RST | + * | | + * | P2.0/TB1.1|--> CCR1 - XX% PWM + * | | + * + * Darren Lu + * Texas Instruments Inc. + * Oct. 2016 + * Built with IAR Embedded Workbench v6.50 & Code Composer Studio v6.2 */ + #include "driverlib.h" #include "Board.h" #include "us_sensor.h" @@ -163,8 +110,17 @@ // Der PCF8574 Baustein hat folgende 7-Bit Adresse: 0x3F (dez 63) : 0011 1111 // Somit ergibt sich für Schreibzugriffe folgender Adresswert: 0111 1110 = 0x7E // Die Driverlib erwartet jedoch die Angabe der tatsächlichen 7-Bit Adresse, also 0x3F -#define SLAVE_ADDRESS 0x27 //#define SLAVE_ADDRESS 0x3F //fuer PCF8574AT bei nur 8574T dann 0x27 +/** + * @brief I2C-Slave-Adresse für den PCF8574 I/O Expander. + * + * Diese Definition legt die I2C-Slave-Adresse für den PCF8574 I/O Expander fest. + * Je nach Version des PCF8574 (PCF8574T oder PCF8574AT) wird die entsprechende Adresse gewählt. + * - PCF8574T: Adresse 0x27 + * - PCF8574AT: Adresse 0x3F + */ +#define SLAVE_ADDRESS 0x27 +///initialisiert die pins void init_gpio(void); void init_cs(void); @@ -176,37 +132,43 @@ void init_i2c(void); void sleep(uint16_t ms); -void detectedSomething(int i, uint16_t pDistance); +void detectedSomething(int pPosition, uint16_t pDistance); void configurePWM(int pwmSignal); void startUp(); -///main funktion für Interactivität +/** + * @brief Hauptfunktion für die Interaktivität. + * + * Diese Funktion initialisiert die Hardware, konfiguriert den PWM für den Servo, + * startet den Ultraschallsensor und verarbeitet die Entfernungsmessungen, um + * erkannte Patienten anzuzeigen. + */ void main (void) { uint16_t distance; - char string1[17] = ""; //null-Terminierung belegt 17. Zeichen - char string2[17] = ""; //wichtig: den String auf ganzer Länge definieren, - //damit am an den letzten Stellen nicht noch der - //Rest von der letzten Ausgabe auftaucht. + char string1[17] = ""; //null-Terminierung belegt 17. Zeichen + char string2[17] = ""; //wichtig: den String auf ganzer Länge definieren, + //damit am an den letzten Stellen nicht noch der + //Rest von der letzten Ausgabe auftaucht. WDT_A_hold(WDT_A_BASE); //Stop watchdog timer - //Servo - P2DIR |= BIT0; // P2.0 output - P2SEL0 |= BIT0; // P2.0 options select + // Servo-Initialisierung + P2DIR |= BIT0; // P2.0 output + P2SEL0 |= BIT0; // P2.0 options select // Disable the GPIO power-on default high-impedance mode to activate // previously configured port settings - //Green LED - P6DIR |= 0x40; // Set P6.6 to output direction - //Green LED End + // Grüne LED-Initialisierung + P6DIR |= 0x40; // Set P6.6 to output direction + // Grüne LED-Initialisierung Ende - PM5CTL0 &= ~LOCKLPM5; + PM5CTL0 &= ~LOCKLPM5; // Port-Einstellungen freigeben - TB1CCR0 = 20000-1; // PWM Period - TB1CCTL1 = OUTMOD_7; // CCR1 reset/set - //Servo End + TB1CCR0 = 20000-1; // PWM Period + TB1CCTL1 = OUTMOD_7; // CCR1 reset/set + // Servo-Initialisierung Ende - init_gpio(); + init_gpio(); // GPIO initialisieren //LCD init_timer(); @@ -214,53 +176,53 @@ void main (void) init_i2c(); //LCD End - sr04_init(); - __bis_SR_register(GIE); //Enable global interrupt - sr04_start(); + sr04_init(); // HC-SR04-Ultraschallsensor initialisieren + __bis_SR_register(GIE); // Globalen Interrupt aktivieren + sr04_start(); // HC-SR04-Ultraschallsenso starten - lcd1602_init(); - lcd1602_backlight(true); + lcd1602_init(); // LCD initialisieren + lcd1602_backlight(true); // LCD-Hintergrundbeleuchtung einschalten lcd1602_write(1,string1); lcd1602_write(2,string2); - int abstandsErkennung = 1500; //Der Abstand in den innerhalb das System etwas erkennen soll in mm + int abstandsErkennung = 1500; // Der Abstand in mm, innerhalb dessen das System etwas erkennen soll + int startGrad = 1000; // Der Wert 500 entspricht -45° + int endGrad = 2000; // Der Wert 2500 entspricht 135° + int pwmSteps = 66; // 90°/16 Display-Ziffern = 5,625° pro Ziffer + // Bereich = 1000 PWM; 1000 PWM/90° = 62,5 PWM/° = pwmSteps + int pwmValue = 0; // Der PWM-Wert, der an den Servo gesendet wird + int i = 8; // Zähler für die Schleife, startet bei 8, damit der Servo in der Mitte ist (45°) + int detectionCounter = 0; // Zähler, um das Display zurückzusetzen - int startGrad = 1000; //Der Wert 500 entspricht -45° - int endGrad = 2000; //Der Wert 2500 entspricht 135° - int pwmSteps = 66; // 90°/16Display digits = 5,625° pro Digit - //Range = 1000pwm; 1000pwm/90° = 62,5pwm/° = pwmSteps - int pwmValue = 0; //Der pwm Wert der an den Servo gesendet wird - int i = 8; //Zaehler fuer die Schleife, startet bei 8 damit der Servo in der mitte ist bei 45° - int detectionCounter = 0; //Dieser counter ist dafuer da, damit das Display resettet wird - startUp(); + startUp(); // Initialisierungsroutine ausführen while (1) { - // Countup from 1000 to 2000 + // Aufwärts zählen von 1000 bis 2000 for (i = i; startGrad + pwmSteps*i <= endGrad; i++) { pwmValue = startGrad + pwmSteps * i; - configurePWM(pwmValue); // Set PWM to current value + configurePWM(pwmValue); // Setzt PWM auf den aktuellen Wert distance = sr04_get_value(); if(distance<=abstandsErkennung){ detectedSomething(i, distance); detectionCounter = 0; } - __delay_cycles(250000); // Delay 1 second (assuming 1 MHz clock) + __delay_cycles(250000); // Sleep 0,25 sekunden (bei 1 MHz clock) } detectionCounter++; - // Countdown from 2000 to 1000 + // Abwärts zählen von 2000 bis 1000 for (i = i-1; startGrad + pwmSteps*i >= startGrad;i--) { pwmValue = startGrad + pwmSteps * i; - configurePWM(pwmValue); // Set PWM to current value + configurePWM(pwmValue); // Setzt PWM auf den aktuellen Wert distance = sr04_get_value(); if(distance<=abstandsErkennung){ detectedSomething(i, distance); detectionCounter = 0; } - __delay_cycles(250000); // Delay 1 second (assuming 1 MHz clock) + __delay_cycles(250000); // Sleep 0,25 sekunden (bei 1 MHz clock) } detectionCounter++; @@ -274,50 +236,89 @@ void main (void) } } -void configurePWM(int pwmSignal){ //zwischen 1000 und 2000 offiziell, aber auch möglich zwischen 500-2500 somit 180 grad - - TB1CCR1 = pwmSignal; // CCR1 PWM duty cycle - TB1CTL = TBSSEL__SMCLK | MC__UP | TBCLR; // SMCLK, up mode, clear TBR +/** + * @brief Konfiguriert das PWM-Signal. + * + * Diese Funktion konfiguriert das PWM-Signal mit einem angegebenen Wert. Der PWM-Signalwert + * kann offiziell zwischen 1000 und 2000 liegen, jedoch sind auch Werte zwischen 500 und 2500 + * möglich, was einem Bereich von 180 Grad entspricht. + * + * @param pwmSignal Der PWM-Signalwert, zwischen 500 und 2500. + */ +void configurePWM(int pwmSignal){ + // Setzen des PWM duty cycle für CCR1 + TB1CCR1 = pwmSignal; + // Konfiguration des Timers + TB1CTL = TBSSEL__SMCLK | MC__UP | TBCLR; } -void startUp(){ //Start Methode beim hochfahren des MSP430, eine Prozedur die ausgefuehrt wird - P6OUT ^= 0x40; // Toggle P6.6 using exclusive-OR, es leuchtet die gruene LED + +/** + * @brief Startet die Initialisierungsprozedur beim Hochfahren des MSP430. + * + * Diese Funktion führt eine Prozedur aus, die beim Hochfahren des MSP430 aufgerufen wird. + * Sie schaltet eine grüne LED ein und führt eine Reihe von PWM-Konfigurationen und Verzögerungen durch, + * bevor sie die LED wieder ausschaltet. + */ +void startUp(){ + // Toggle P6.6 using exclusive-OR, es leuchtet die grüne LED + P6OUT ^= 0x40; + // Konfiguriere PWM mit einem Wert von 1500 und warte configurePWM(1500); __delay_cycles(1000000); + // Konfiguriere PWM mit einem Wert von 500 und warte configurePWM(500); __delay_cycles(1000000); + // Konfiguriere PWM mit einem Wert von 2500 und warte configurePWM(2500); __delay_cycles(1000000); + // Konfiguriere PWM mit einem Wert von 1500 und warte configurePWM(1500); __delay_cycles(1000000); - P6OUT ^= 0x40; // Toggle P6.6 using exclusive-OR, gruene LED wird ausgeschalten + // Toggle P6.6 using exclusive-OR, grüne LED wird ausgeschaltet + P6OUT ^= 0x40; } -void detectedSomething(int i, uint16_t pDistance ){ //Diese Methode wird ausgefuehrt, wenn der SR04 etwas erkennt. - P6OUT ^= 0x40; // Toggle P6.6 using exclusive-OR, es leuchtet die gruene LED +/** + * @brief Diese Methode wird ausgeführt, wenn der HC-SR04-Ultraschallsensor etwas erkennt. + * + * Diese Funktion wird aufgerufen, wenn der SR04-Sensor einen Patienten erkennt. Sie schaltet eine + * grüne LED ein, zeigt die erkannte Entfernung und die Position auf einem LCD-Display an und + * schaltet die LED wieder aus. + * + * @param i Die Position des erkannten Objekts. + * @param pDistance Die gemessene Entfernung zum erkannten Objekt in Millimetern. + */ +void detectedSomething(int pPosition, uint16_t pDistance ){ + // Toggle P6.6 using exclusive-OR, es leuchtet die grüne LED + P6OUT ^= 0x40; - char array[17]; // Erstellen Sie ein char-Array mit einer Länge von 17 - // Initialisieren Sie das Array mit Leerzeichen oder einem anderen Zeichen + // Erstellung eines char-Array mit einer Länge von 17 + char array[17]; + // Initialisierung des Arrays mit Leerzeichen int j; for (j = 0; j < 17; j++) { array[j] = ' '; } - // Setzen Sie das Zeichen 'x' an die gewünschte Position - if (i >= 0 && i < 17) { // Überprüfen Sie, ob die Position im gültigen Bereich liegt - if(i == 16){ - array[16-i] = 'x'; + // Einsetzen des Buchstaben 'x' an die gewünschte Position + if (pPosition >= 0 && pPosition < 17) { // Überprüfen, ob die Position im gültigen Bereich liegt + if(pPosition == 16){ + array[16-pPosition] = 'x'; }else{ - array[16-i-1] = 'x'; + array[16-pPosition-1] = 'x'; } } char string17[17]; + + // Formatierung der Entfernung als Zeichenkette und Anzeige auf dem LCD if(pDistance == 0){ pDistance = 1500; } - sprintf(string17, "%dmm ", pDistance); //z. B. Ausgabe: 1499mm + sprintf(string17, "%dmm ", pDistance); // z. B. Ausgabe: 1499mm lcd1602_write(1,string17); lcd1602_write(2,array); - P6OUT ^= 0x40; // Toggle P6.6 using exclusive-OR, gruene LED wird ausgeschalten + // Toggle P6.6 using exclusive-OR, grüne LED wird ausgeschaltet + P6OUT ^= 0x40; }