Spridarprovare, Arduino eller PLC

Planering och tankar kring eventuella framtida projekt.
Janson1
Inlägg: 1351
Blev medlem: 1 december 2016, 09:06:02
Ort: Marks Kommun

Re: Spridarprovare, Arduino eller PLC

Inlägg av Janson1 »

Jag byggde en egen spridartestare för nåt år sedan till mitt dieselprojekt, denna testare hade bara variabel pulsbreddsmodulering med fast grundfrekvens, jag tror runt 500 eller 980 hz och jag märkte då att det var väldigt praktiskt att kunna justera kontinuerligt så det tror jag inte man skall bygga bort i detta fall.
Jag funderar på om det över huvud taget går att programmera så att det går att köra med display samtidigt utan att det blir interferenser då och då vid vissa frekvenser/vissa pulsbredder...
Jag gjorde ett tillägg i går kväll till första alstret och testade med displaydrivning smtidigt och såg dom här fenomenen som jag råkat ut för förut ochså. (Jag tror det har med anrop av samma timer..?)
Om jag orkar/hinner så skall jag prova med en seriell display ochså.
Janson1
Inlägg: 1351
Blev medlem: 1 december 2016, 09:06:02
Ort: Marks Kommun

Re: Spridarprovare, Arduino eller PLC

Inlägg av Janson1 »

Hittar inget bra bibliotek just nu för seriell display... Nu har jag ingen SPI display men det skulle kunna fungera utan att störa ut utsignalen?
Är det någon som orkar testa?
Janson1
Inlägg: 1351
Blev medlem: 1 december 2016, 09:06:02
Ort: Marks Kommun

Re: Spridarprovare, Arduino eller PLC

Inlägg av Janson1 »

Nu tror jag att jag har lösningen.. 2 st Arduino NANO på varandra (2 vånings) där den ena har pulsprogrammet och den andra har pulsprogram plus displayprogram minus aktiv utgång. Det är en lite fullösning men detta kommer att funka! (dubbelcore)
Jag har gjort displaydelen klar men inte hunnit prova den mot en riktig display än men är det fortfarande intressant så kan jag göra det och i så fall lägga ut sketchen sen.
Janson1
Inlägg: 1351
Blev medlem: 1 december 2016, 09:06:02
Ort: Marks Kommun

Re: Spridarprovare, Arduino eller PLC

Inlägg av Janson1 »

Så här någonting tänkte jag mig ett färdigt resultat kan se ut, man kan inte sätta ihop alla ben utan tex rx-tx måste skiljas på, annars kan man inte programmera dom...
20181011_071717.jpg
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
mrfrenzy
Co Admin
Inlägg: 14850
Blev medlem: 16 april 2006, 17:04:10

Re: Spridarprovare, Arduino eller PLC

Inlägg av mrfrenzy »

En arduino har hårdvara som sköter PWM-utgångarna. Om man använder det kan man göra vadsomhelst i mainloop utan att utgången påverkas alls. Prata med displayen, skicka seriedata, räkna ut värdet på PI etc.

Här är ett väldigt kort exempel:

Kod: Markera allt

#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
  pinMode(3, OUTPUT);

   TCCR2A = _BV(COM2A1) | _BV(COM2B1) | _BV(WGM21) | _BV(WGM20);
   TCCR2B = _BV(WGM22) | _BV(CS20);
   OCR2A = 0;
   OCR2B = 0;

  while (1) { //Det spelar ingen roll ifall detta tar 1ms eller 1s, pwm-utgången snurrar på ostört ändå
    Kolla ifall startknapp är intryckt, isåfall nollställ tiden och börja om

    Kolla ifall tiden nått maxvärde, isåfall stanna

    läs värden från potentiometrar
    kolla om värden ändrats sen förra gången
    Om värdena ändrats, uppdatera OCR2A och OCR2B för att ändra frekvensen och pulsbredd
    Uppdatera sedan displayen med samma data
      }
}

Lite relaterade länkar:
https://www.arduino.cc/en/Tutorial/SecretsOfArduinoPWM (introduktion)
https://github.com/tardate/LittleArduin ... ardwarePWM (testprogram för den som vill bli expert)
Janson1
Inlägg: 1351
Blev medlem: 1 december 2016, 09:06:02
Ort: Marks Kommun

Re: Spridarprovare, Arduino eller PLC

Inlägg av Janson1 »

Jag tror det finns ett problem med detta, den har fast frekvens... TS vill ju ha 10-150 hz variabelt.
Användarvisningsbild
mrfrenzy
Co Admin
Inlägg: 14850
Blev medlem: 16 april 2006, 17:04:10

Re: Spridarprovare, Arduino eller PLC

Inlägg av mrfrenzy »

Justja. Då använder man ICR för att styra frekvensen.

Här är ett exempel med färdig kod som läser två potentiometrar och justerar frekvens samt duty cycle steglöst:

https://www.oxgadgets.com/2011/04/creat ... o-uno.html
Janson1
Inlägg: 1351
Blev medlem: 1 december 2016, 09:06:02
Ort: Marks Kommun

Re: Spridarprovare, Arduino eller PLC

Inlägg av Janson1 »

Men displayen då?
Användarvisningsbild
mrfrenzy
Co Admin
Inlägg: 14850
Blev medlem: 16 april 2006, 17:04:10

Re: Spridarprovare, Arduino eller PLC

Inlägg av mrfrenzy »

Displayen kan du koda i while-loopen på valfritt sätt och det spelar ingen roll hur lång tid det tar att skriva till den för PWM-utgången jobbar på i bakgrunden.
Janson1
Inlägg: 1351
Blev medlem: 1 december 2016, 09:06:02
Ort: Marks Kommun

Re: Spridarprovare, Arduino eller PLC

Inlägg av Janson1 »

Jag ser en while-lopp i ditt förslag där det är fast frekvens, men ingen while-loop där det är variabel frekvens/dutycycle...
Jag fattar nog inte riktigt?
sc3
Inlägg: 173
Blev medlem: 10 januari 2011, 11:05:40
Ort: Umeå

Re: Spridarprovare, Arduino eller PLC

Inlägg av sc3 »

Det är i detta exempel du lägger in displaykoden.
mrfrenzy skrev: Här är ett exempel med färdig kod som läser två potentiometrar och justerar frekvens samt duty cycle steglöst:

https://www.oxgadgets.com/2011/04/creat ... o-uno.html
Janson1
Inlägg: 1351
Blev medlem: 1 december 2016, 09:06:02
Ort: Marks Kommun

Re: Spridarprovare, Arduino eller PLC

Inlägg av Janson1 »

Tyvärr fixar jag inte detta... Men kanske skulle kunna fixa det på "mitt" sätt? Få se vad TS vill först i alla fall.
sc3
Inlägg: 173
Blev medlem: 10 januari 2011, 11:05:40
Ort: Umeå

Re: Spridarprovare, Arduino eller PLC

Inlägg av sc3 »

Okej, du skulle ha mycket nytta av att kunna periferienheterna i mikrokontrollers med tanke på dina tidskritiska program. Har du läst innehållet i länken, är det mesta obegripligt? Det kan lätt bli det till en början när mycket är nytt.
Janson1
Inlägg: 1351
Blev medlem: 1 december 2016, 09:06:02
Ort: Marks Kommun

Re: Spridarprovare, Arduino eller PLC

Inlägg av Janson1 »

Jag har ögnat igenom länken men lovar ta det under luppen. Jag började med att försöka ladda ner exempelprogrammet men det hängde sig i kompilatorn vid analogread()… å nåt är galet där...
Användarvisningsbild
mrfrenzy
Co Admin
Inlägg: 14850
Blev medlem: 16 april 2006, 17:04:10

Re: Spridarprovare, Arduino eller PLC

Inlägg av mrfrenzy »

Det har ramlat bort några ">" i exempelkoden.
Nedanstående är korrigerad så den kompilerar.

Jag har tyvärr ingen Arduino här så jag kan prova men håller på att porta det till en Wemos D1 / ESP8266 för det har jag.

Kod: Markera allt

unsigned long duty1,duty2;
// Duty Cycle in terms of a percentage.
unsigned long plus;
// Value read from A1, in case plus mode is activated
float xxx;
// Float numbers to calculate duty for PWM 1 and PWM 2
float yyy;
unsigned long pwm1;
// Value read from A0 and A2 to give PWM duty cycle output in terms // of 0-5V
unsigned long pwm2;

void setup() {
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
TCCR1A = _BV(COM1A1) | _BV(COM1B1) ; // phase and frequency correct mode. NON-inverted mode
// TCCR1A = _BV(COM1A1) | _BV(COM1B1) | _BV(COM1A0) | _BV(COM1B0) ;
//phase/frequency correct mode. SELECT THIS FOR INVERTED OUTPUTS.
TCCR1B = _BV(WGM13) | _BV(CS11);
// Select mode 8 and select divide by 8 on main clock.

}

void loop() {
// Program that lets different values on A3 choose different values of frequency, e.g. 100,200,400,500,1k,2k,3k,4k,10k,
//etc in relation with a free input.
if (analogRead(A3) < 100) ICR1 = 10000; // 100Hz - Default value to 100Hz for A3 = 0V
if (analogRead(A3) > 100) ICR1 = 5000; // 200Hz
if (analogRead(A3) > 200) ICR1 = 2500; // 400Hz
if (analogRead(A3) > 300) ICR1 = 1000; // 1000Hz
if (analogRead(A3) > 400) ICR1 = 500; // 2000Hz
if (analogRead(A3) > 500) ICR1 = 333; // 3000Hz
if (analogRead(A3) > 600) ICR1 = 250; // 4000Hz
if (analogRead(A3) > 700) ICR1 = 100; // 10000Hz
if (analogRead(A3) > 800) ICR1 = 1000; // Default value to 1kHz for A3 = 5V
//ICR1 = 1000; // for ICR1 = 1000, frequency = 1kHz.
pwm1 = analogRead(A2); // read duty from A2 for PWM 2
pwm2 = analogRead(A0); // read duty from A0 for PWM 1
xxx = float(pwm2);
// Turn read values from the POTs to float for mathematical
// adjustment.
yyy = float(pwm1);
xxx = xxx * ICR1;
// Multiply with ICR1 and divide by 1023 to give required percentage
yyy = yyy * ICR1;
xxx = xxx / 1023;
yyy = yyy / 1023;
//Assign values to OCR Registers, which output the PWM duty cycle.
OCR1B = int(xxx);
OCR1A = int(yyy);


}
Skriv svar