Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp
- Committer:
- jack1930
- Date:
- 2021-06-30
- Revision:
- 0:763fd05f2a27
- Child:
- 1:73315e249185
File content as of revision 0:763fd05f2a27:
/* mbed Microcontroller Library
* Copyright (c) 2019 ARM Limited
* SPDX-License-Identifier: Apache-2.0
*/
#include "mbed.h"
#include "platform/mbed_thread.h"
#include "LCD.h"
#include <string>
// Blinking rate in milliseconds
#define BLINKING_RATE_MS 500
#define Init 0
#define Zu 1
#define Oeffnen 2
#define Offen 3
#define Schliessen 4
#define Gestoppt 5
lcd mylcd;
DigitalIn TorAuf(PA_1);
DigitalIn TorZu(PA_6);
InterruptIn Stop(PA_10);
DigitalIn EndschalterOffen(PB_0);
DigitalIn EndschalterZu(PB_3);
PwmOut CW(PC_6);
PwmOut CCW(PC_7);
AnalogIn Poti(PA_0);
DigitalOut Leuchte(PC_0);
int Zustand=Init;
string meldung[]={"Tor-auf","Tor-zu","Tor-stop","Tor-faehrt"};
void blinkenEin()
{
TIM6->CR1=1;
}
void blinkenAus()
{
TIM6->CR1=0;
Leuchte=0;
}
void isr_Timer()
{
Leuchte=!Leuchte;
HAL_NVIC_ClearPendingIRQ(TIM6_IRQn);
TIM6->SR=0;
}
void Timer_init()
{
RCC->APB1ENR |= 0b10000; //TIM6
TIM6->PSC=31999; //1ms
TIM6->ARR=499; //500ms
TIM6->CNT=0; //Counter startet bei 0
TIM6->SR=0; //UIF =0
TIM6->DIER=1; //Interrupt Freigabe
NVIC_SetVector(TIM6_IRQn,(uint32_t)&isr_Timer);
HAL_NVIC_EnableIRQ(TIM6_IRQn);
__enable_irq();
}
void ADC_PWMCW()
{
CCW=0;
CW=Poti;
}
void ADC_PWMCCW()
{
CW=0;
CCW=Poti;
}
void LCDout(int nr)
{
mylcd.clear();
mylcd.cursorpos(0);
mylcd.printf("%s",meldung[nr].c_str());
}
void motorstop()
{
CW=0;
CCW=0;
}
void normaleFrequenz()
{
TIM6->ARR=499; //500ms
}
void doppelteFrequenz()
{
TIM6->CNT=0; //Counter startet bei 0
TIM6->ARR=249; //250ms
}
void ISR_EXT_IR()
{
if (Zustand==Schliessen || Zustand==Oeffnen)
{
Zustand=Gestoppt;
motorstop();
LCDout(2);
doppelteFrequenz();
}
}
void init()
{
TorAuf.mode(PullDown);
TorZu.mode(PullDown);
Stop.mode(PullDown);
EndschalterOffen.mode(PullDown);
EndschalterZu.mode(PullDown);
Stop.fall(&ISR_EXT_IR);
Stop.enable_irq();
CW.period_us(100);
CCW.period_us(100);
CW=0;
CCW=0;
Timer_init();
Zustand=Zu;
}
int main()
{
init();
while (true) {
switch(Zustand)
{
case Zu: if (TorAuf==1)
{
Zustand=Oeffnen;
blinkenEin();
LCDout(3);
}
break;
case Oeffnen:
ADC_PWMCCW();
if (EndschalterOffen==1)
{
blinkenAus();
Zustand=Offen;
motorstop();
LCDout(0);
}
break;
case Offen: if (TorZu==1)
{
Zustand=Schliessen;
blinkenEin();
LCDout(3);
}
break;
case Schliessen:
ADC_PWMCW();
if (EndschalterZu==1)
{
Zustand=Zu;
LCDout(1);
motorstop();
blinkenAus();
}
break;
case Gestoppt:
if (TorAuf==1)
{
LCDout(3);
Zustand=Oeffnen;
blinkenEin();
normaleFrequenz();
}
if (TorZu==1)
{
LCDout(3);
Zustand=Schliessen;
blinkenEin();
normaleFrequenz();
}
break;
}
}
}