Hallo,
habe das Problem eine Interrupt Schleife aufzurufen :~
Leider finde ich im Netz nur Beispiel Sketche mit der
Blinkenden LED. Bei diesem Sketch wird ja der Zustand der
LED über eine eigene Variable geändert, die über die Interrupt
Schleife auf HIGH oder LOW gesetzt wird.
Ich lege an Interrupt 0 (Digitaler Pin 2) 5V Spannung an und
möchte dass dann die Interrupt-Schleife so lange durchlaufen
wird, bis die 5V wider weg genommen werden.
void loop und interrupt loop unterscheiden sich nur durch
Unterschiedliche Potentiometer Signale.
Rufe ich den Interrupt Befehl so richtig auf?
Muss doch mit einer "volatile int" Variablen gearbeitet werden?
In wie weit spielt der Pull-Up Resistor an Pin 2 eine Rolle?
Gibt es eine ganz andere Lösung ohne Interrupt?
Vielen Dank im Vorraus für jegliche Hilfe!
int
PWM_A = 8,
DIR_A = 9,
signal_soll,
signal_ist,
signal_soll_skaliert,
signal_ist_skaliert,
signal_soll_berechnet,
regelabweichung;
float
potenz6,
potenz5,
potenz4,
potenz3,
potenz2,
summand6,
summand5,
summand4,
summand3,
summand2,
summand1;
const float FACTOR6 = 3.2445916909115E-14;
const float FACTOR5 = 6.26984473115432E-11;
const float FACTOR4 = 4.14486340076514E-08;
const float FACTOR3 = 8.05562633887646E-06;
const float FACTOR2 = 0.00229807982179864;
const float FACTOR1 = 1.35441912656097;
void setup() {
pinMode(PWM_A, OUTPUT);
pinMode(DIR_A, OUTPUT); // Direction pin on channel A
pinMode(signal_soll,INPUT); // Soll-Signal
pinMode(signal_ist,INPUT); // Potenziometer Ist-Signal
// Interrupt0 am Digital Pin 2 Ausführen
attachInterrupt (0, interrupt, RISING);
}
void loop() {
signal_soll = analogRead(A2); // liest Soll-Signal ein (160 - 760 = 0.8 - 3.7V)
signal_ist = analogRead(A4); // liest Ist-Signal ein (60 - 936 = 0.30 - 4.55V)
// Signale auf gleichen Wertebereich (0 - 900) skalieren
signal_soll_skaliert = map (signal_soll, 165, 758, 0, 900);
signal_ist_skaliert = map (signal_ist, 60, 930, 0, 900);
potenz6 = pow(signal_soll_skaliert,6);
potenz5 = pow(signal_soll_skaliert,5);
potenz4 = pow(signal_soll_skaliert,4);
potenz3 = pow(signal_soll_skaliert,3);
potenz2 = pow(signal_soll_skaliert,2);
summand6 = FACTOR6 * potenz6;
summand5 = FACTOR5 * potenz5;
summand4 = FACTOR4 * potenz4;
summand3 = FACTOR3 * potenz3;
summand2 = FACTOR2 * potenz2;
summand1 = FACTOR1 * signal_soll_skaliert;
signal_soll_berechnet = summand6 - summand5 + summand4 - summand3 - summand2 + summand1;
//Regelabweichung aus Potistellungen berechnen
regelabweichung = signal_soll_berechnet - signal_ist_skaliert;
if ( regelabweichung < 0 )
{
if ( regelabweichung < -30 ) {
digitalWrite(DIR_A, LOW);
analogWrite(PWM_A, 60); //120
}
if ( regelabweichung >= -30 && regelabweichung < -20) {
digitalWrite(DIR_A, LOW);
analogWrite(PWM_A, 50); //100
}
if ( regelabweichung >= -20 && regelabweichung < -10) {
digitalWrite(DIR_A, LOW);
analogWrite(PWM_A, 40); //80
}
if ( regelabweichung >= -10 && regelabweichung < -5) {
digitalWrite(DIR_A, LOW);
analogWrite(PWM_A, 35); //60
}
if ( regelabweichung >= -5 && regelabweichung < 0 ) {
digitalWrite(DIR_A, LOW);
analogWrite(PWM_A, 30); //45
}
}
else
{
if ( regelabweichung > 30 ) {
digitalWrite(DIR_A, HIGH);
analogWrite(PWM_A, 100);
}
if ( regelabweichung <= 30 && regelabweichung > 20) {
digitalWrite(DIR_A, HIGH);
analogWrite(PWM_A, 70);
}
if ( regelabweichung <= 20 && regelabweichung > 10) {
digitalWrite(DIR_A, HIGH);
analogWrite(PWM_A, 50);
}
if ( regelabweichung <= 10 && regelabweichung > 5) {
digitalWrite(DIR_A, HIGH);
analogWrite(PWM_A, 35);
}
if ( regelabweichung <= 5 && regelabweichung >= 0 ) {
digitalWrite(DIR_A, HIGH);
analogWrite(PWM_A, 30);
}
}
}
void interrupt(){
signal_soll = analogRead(A2); // liest Soll-Signal ein (160 - 760 = 0.8 - 3.7V)
signal_ist = analogRead(A4); // liest Ist-Signal ein (96 - 936)
// Signale auf gleichen Wertebereich (0 - 900) skalieren
signal_soll_skaliert = map (signal_soll, 165, 758, 0, 900);
signal_ist_skaliert = map (signal_ist, 96, 930, 0, 900);
potenz6 = pow(signal_soll_skaliert,6);
potenz5 = pow(signal_soll_skaliert,5);
potenz4 = pow(signal_soll_skaliert,4);
potenz3 = pow(signal_soll_skaliert,3);
potenz2 = pow(signal_soll_skaliert,2);
summand6 = FACTOR6 * potenz6;
summand5 = FACTOR5 * potenz5;
summand4 = FACTOR4 * potenz4;
summand3 = FACTOR3 * potenz3;
summand2 = FACTOR2 * potenz2;
summand1 = FACTOR1 * signal_soll_skaliert;
signal_soll_berechnet = summand6 - summand5 + summand4 - summand3 - summand2 + summand1;
//Regelabweichung aus Potistellungen berechnen
regelabweichung = signal_soll_berechnet - signal_ist_skaliert;
if ( regelabweichung < 0 )
{
if ( regelabweichung < -30 ) {
digitalWrite(DIR_A, LOW);
analogWrite(PWM_A, 60); //120
}
if ( regelabweichung >= -30 && regelabweichung < -20) {
digitalWrite(DIR_A, LOW);
analogWrite(PWM_A, 50); //100
}
if ( regelabweichung >= -20 && regelabweichung < -10) {
digitalWrite(DIR_A, LOW);
analogWrite(PWM_A, 40); //80
}
if ( regelabweichung >= -10 && regelabweichung < -5) {
digitalWrite(DIR_A, LOW);
analogWrite(PWM_A, 35); //60
}
if ( regelabweichung >= -5 && regelabweichung < 0 ) {
digitalWrite(DIR_A, LOW);
analogWrite(PWM_A, 30); //45
}
}
else
{
if ( regelabweichung > 30 ) {
digitalWrite(DIR_A, HIGH);
analogWrite(PWM_A, 100);
}
if ( regelabweichung <= 30 && regelabweichung > 20) {
digitalWrite(DIR_A, HIGH);
analogWrite(PWM_A, 70);
}
if ( regelabweichung <= 20 && regelabweichung > 10) {
digitalWrite(DIR_A, HIGH);
analogWrite(PWM_A, 50);
}
if ( regelabweichung <= 10 && regelabweichung > 5) {
digitalWrite(DIR_A, HIGH);
analogWrite(PWM_A, 35);
}
if ( regelabweichung <= 5 && regelabweichung >= 0 ) {
digitalWrite(DIR_A, HIGH);
analogWrite(PWM_A, 30);
}
}
}