na N pulsen een uitgangspuls

Arduino specifieke Software
Berichten: 6
Geregistreerd: 26 Apr 2021, 22:31

na N pulsen een uitgangspuls

Berichtdoor jawih » 26 Apr 2021, 22:49

hoi,
mijn programmeerervaring is maar zeer beperkt, daardoor krijg ik het volgende niet gefikst:

probleem:

er zijn binnenkomende pulsen van circa 50uS met een herhalingstijd van 10mS.
na N pulsen moet er direkt (binnen 0,1mS na de N-e puls) een puls van 0,5mS uitgestuurd worden
N kan varieren van 1 tot 11

Dit zal wel met een interrupt moeten gebeuren die de binnenkomende pulsen inleest maar hoe krijg ik de N daarin en de uitgaande puls?

Wie helpt me uit de brand?

Advertisement

Berichten: 180
Geregistreerd: 26 Aug 2015, 11:57

Re: na N pulsen een uitgangspuls

Berichtdoor Frits1956 » 27 Apr 2021, 12:29

Wat heb je al?

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: na N pulsen een uitgangspuls

Berichtdoor shooter » 27 Apr 2021, 13:19

Je hebt helemaal gelijk omdat de pulsduur zo kort is doe je dat met interupt, in die interupt komt een teller met teller++ en een test als teller >max dan een functie starten.
paul deelen
shooter@home.nl

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: na N pulsen een uitgangspuls

Berichtdoor shooter » 27 Apr 2021, 17:26

die test beter in de gewone loop, dan heb je maar een heel korte interupt, hier niet belangrijk maar is wel beter voor je ontwikkeling
paul deelen
shooter@home.nl

Berichten: 6
Geregistreerd: 26 Apr 2021, 22:31

Re: na N pulsen een uitgangspuls

Berichtdoor jawih » 28 Apr 2021, 14:57

#define triacPulse 7

int n = 0;
int deeltal=0;
int val;
int aantal=0;
int telop;

void setup() {
delay(500);
Serial.begin(19200);
Serial.println("detect-zero-crossing");
pinMode(2, INPUT);
digitalWrite(2, HIGH); // pull up
pinMode(triacPulse, OUTPUT);
attachInterrupt(0, telop, RISING);
}

void loop() {
{


//(analogRead(0) ); // read AD1
val=(analogRead(0));
Serial.print("input=");
Serial.print(val);

if (val <200) {deeltal=9;}
if (val>200 and val<400){deeltal=7;}
if (val>400 and val<600){deeltal=5;}
Serial.println(n);
}
if (val>600 and val<800){deeltal=3;}
if (val>800 ){deeltal=1;}
Serial.print("deeltal=");
Serial.print(deeltal);
Serial.print(" n=");

} // end loop



// begin AC interrupt routine
// delay() will not work! ???? het wordt wel gebruikt.
void telop(){

(n++);
{
if (n==deeltal)
digitalWrite(triacPulse, HIGH);
//delayMicroseconds(200); // delay 200 uSec on output pulse to turn on triac
delay(1000); // delay 1000 mSec on output pulse to turn on triac
digitalWrite(triacPulse, LOW);

n=0;}
}

zover ben ik gekomen maar het werkt dus niet
het stukje waarin het deeltal wordt geselecteerd werkt.
Ik doe iets fout met het declareren maar wat?

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: na N pulsen een uitgangspuls

Berichtdoor shooter » 29 Apr 2021, 11:50

onder serial.println staat een } dus hier eindigt jouw loop dat is dus fout.

verder begint je setup met een delay Waaarom?
doe eens CTRL T dan verspringt de listing en kun je beter zien wat er gebeurt zoals dubbele {{ aan het begin van je loop
de interupt is met delay dat werkt dus echt niet dan staat er zelfs een delay in van een hele seconde en dat bij 50 Hz is niet goed.
en een triac heeft flink wat voltage nodig en dus 230 maar daar ga je aan dood dus denk goed na.
paul deelen
shooter@home.nl

Berichten: 6
Geregistreerd: 26 Apr 2021, 22:31

Re: na N pulsen een uitgangspuls

Berichtdoor jawih » 29 Apr 2021, 14:03

ja, er is met het kopieren wel e.e.a. fout gegaan, zag ik later ook.

ik heb nu een draaiende sketch:


#define triacPulse 8
#define SW 4
#define aconLed 13
#define pwronrelais 12

int n = 0;
int deeltal=0;
int deeltalN=0;
int deeltalO=0;
int val;
int aantal=0;

void setup() {
Serial.begin(19200);
delay(500);
Serial.println("detect-zero-crossing");
pinMode(2, INPUT);
digitalWrite(2, HIGH); // pull up
pinMode(triacPulse, OUTPUT);
pinMode(pwronrelais, OUTPUT);
digitalWrite(pwronrelais, LOW);
pinMode(aconLed, OUTPUT);
digitalWrite(aconLed, LOW);
attachInterrupt(0, telop, RISING);
}

void loop() {
{
val=(analogRead(0));
if (val >20) {pwronrelais, HIGH;}
if (val <200) {deeltal=10;}
if (val>200 and val<400){deeltal=8;}
if (val>400 and val<600){deeltal=6;}
if (val>600 and val<800){deeltal=4;}
if (val>800 ){deeltal=2;}
deeltalN=deeltal;
if (deeltalN!=deeltalO){
Serial.print("input=");
Serial.print(val);
Serial.print(" deeltal=");
Serial.println(deeltal);}
deeltalO=deeltalN;
}

} // end loop



// begin AC interrupt routine
void telop(){
(n++);
// Serial.print(" n=");
// Serial.println(n);
if (n==deeltal) {
digitalWrite(triacPulse, HIGH);
delayMicroseconds(1500); // delay 1500 uSec on output pulse to turn on triac
// delay(500); // delay 500 mSec on output pulse to turn on triac
digitalWrite(triacPulse, LOW);
n=0;
}
}


enkel als ik de potmeter snel varieer stopt de proc ermee

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: na N pulsen een uitgangspuls

Berichtdoor shooter » 29 Apr 2021, 18:39

ach ja er zitten nog wel meer kleine foutjes in, zoals als de val precies 400 dan zie je dat niet dus je moetb de ifs aanpassen met een gelijkteken.
en omdat de loop zo snel is kan de serialprint het niet bijhouden dus of de print eruit of in een aparte functie elke seconde even printen.
paul deelen
shooter@home.nl

Berichten: 6
Geregistreerd: 26 Apr 2021, 22:31

Re: na N pulsen een uitgangspuls

Berichtdoor jawih » 30 Apr 2021, 11:37

nu heb ik het voor elkaar,
de volgende listing geeft het goede resultaat:

#define triacPulse 8
#define pwronrelais 12

int n = 0;
int deeltal=0;
int deeltalO=0;
int val;
int aantal=0;

void setup() {
Serial.begin(19200);
delay(500);
Serial.println("periodeskipping-zerocrosdet");
pinMode(2, INPUT);
digitalWrite(2, HIGH); // pull up
pinMode(triacPulse, OUTPUT);
pinMode(pwronrelais, OUTPUT);
digitalWrite(pwronrelais, LOW);
attachInterrupt(0, telop, RISING);
}

void loop() {
{
val=(analogRead(0));
if (val >20) {digitalWrite(pwronrelais, HIGH);}
if (val <20) {digitalWrite(pwronrelais, LOW);}
if (val <200) {deeltal=10;}
if (val>200 and val<400){deeltal=8;}
if (val>400 and val<600){deeltal=6;}
if (val>600 and val<800){deeltal=4;}
if (val>800 ){deeltal=2;}
if (deeltal!=deeltalO){
Serial.print("input=");
Serial.print(val);
Serial.print(" deeltal=");
Serial.println(deeltal);}
deeltalO=deeltal;
}

} // end loop

// begin AC interrupt routine
void telop(){
(n++);
if (n==deeltal) {
digitalWrite(triacPulse, HIGH);
delayMicroseconds(1000); // delay 1000 uSec on output pulse to turn on triac
digitalWrite(triacPulse, LOW);
n=0;
}
else if (n>deeltal){n=0;}

}



In de interruptroutine is de else if opgenomen, daarmee wordt voorkomen dat de lus zich ophangt wanneer n groter dan het gekozen deeltal is . Daarmee liep de routine vast.
En nog wat, de deeltallen zijn gewijzigd.
De schakeling is bedoeld om een triac te sturen, zodanig dat er een regeling ontstaat door hele periodehelften te skippen. Dat
kan enkel door het zo te doen dat na een positieve helft altijd een negatieve helft komt en na die negatieve weer een positieve.
Dat kan door te delen met de hier aangegeven deeltallen. Als er tussenliggende getallen zouden worden gebruikt ontstaat er een gelijkstroomkomponent.
Er ontstaat zo een soort frekwentiedeling waarop een motor met kortsluitanker (ventilator) aangesloten kan worden.

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: na N pulsen een uitgangspuls

Berichtdoor shooter » 30 Apr 2021, 12:04

dat verhaal over de deeltallen klopt in werkelijkheid niet hoor, zet er maar een scoop op dan zul je het wel zien. 50 Hz gaat best snel en dus gaat je timing compleet verloren in wat je er nog tussendoor doet.
paul deelen
shooter@home.nl

Volgende

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 2 gasten