Är en STM32 bra att använda som USB I/O-modul?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
AndLi
Inlägg: 17049
Blev medlem: 11 februari 2004, 18:17:59
Ort: Knivsta
Kontakt:

Re: Är en STM32 bra att använda som USB I/O-modul?

Inlägg av AndLi »

Om inget annat blir jag väldigt sugen på att testa...

Frågan är ju om det libet har några jobbiga beroende på andra lib...

Värt att prova, jag kan ju nästan kanske tom se att jag skulle ha ett behov av detta framöver :)
Fast jag kommer då prova med IAR kompilator.
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Är en STM32 bra att använda som USB I/O-modul?

Inlägg av Al_Bundy »

Jag använder Atollic. Om någon som har lyckas att implementera GSL liblioteket för STM32 så skriv här. Det vore mycket perfekt om man kunde få allt I ett istället för att ha: C <---> Java <---> MATLAB
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Är en STM32 bra att använda som USB I/O-modul?

Inlägg av Al_Bundy »

Jag har ett annat sätt där man kan använda kvadratisk programmering i endast i matrisform. Dock så blir det ingen signalbegränsning då i beräkningen. Men det kanske man tillämpa, utan några problem.
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Är en STM32 bra att använda som USB I/O-modul?

Inlägg av Al_Bundy »

Exempel så skulle man kunna göra så här:

Kod: Markera allt

>> A = [0 1; -3 -5]; B = [0; 1]; C = [1 0]; Np = 20; Nc = 20; % Våra datamatriser och prediktions nivåer
>> sys = ss(0, A, B, C)
ans = D matrix assumed to be a zero 1x1 matrix
sys =

  scalar structure containing the fields:

    A =

       0   1
      -3  -5

    B =

       0
       1

    C =

       1   0

    D = 0
    delay = 0
    type = SS
    sampleTime = 0

>> sysd = c2d(sys, 0.5); % 0.5 samplingsintervall
>> sysd
sysd =

  scalar structure containing the fields:

    A =

       0.8196313   0.1634547
      -0.4903640   0.0023580

    B =

       0.060123
       0.163455

    C =

       1   0

    D = 0
    delay = 0
    type = SS
    sampleTime =  0.50000

>> A = sysd.A; B = sysd.B; C = sysd.C; % Hämta våra matriser från sysd
>> function [PHI] = PHImatrix(C, A, Np)

  PHI = [];
  for i = 1:(Np)
    PHI = [PHI; C*A^i];
  endfor

endfunction
>> function [GAMMA] = GAMMAmatrix(C, A, B, Np, Nc)
  PHI = [];
  GAMMA = [];

  for j = 1:Nc
    for i = (1-j):(Np-j)

      if i < 0
        PHI = [PHI; 0*C*A^i*B];
      else
        PHI = [PHI; C*A^i*B];
      endif

    endfor

    % Add to PHI
    GAMMA = [GAMMA PHI];
    % Clear F
    PHI = [];
  endfor

endfunction
>>>> PHI = PHImatrix(C, A, Np)
PHI =

   0.81963132   0.16345465
   0.59164322   0.13435799
   0.41904500   0.09702366
   0.29588550   0.06872364
   0.20881742   0.04852591
   0.14735794   0.03424661
   0.10398588   0.02416710
   0.07337941   0.01705396
   0.05178141   0.01203442
   0.03654042   0.00849229
   0.02578536   0.00599273
   0.01819587   0.00422887
   0.01284022   0.00298417
   0.00906092   0.00210583
   0.00639399   0.00148601
   0.00451202   0.00104863
   0.00318399   0.00073998
   0.00224683   0.00052218
   0.00158552   0.00036849
   0.00111885   0.00026003

>> GAMMA = GAMMAmatrix(C, A, B, Np, Nc)
GAMMA =

 Columns 1 through 7:

   0.060123   0.000000   0.000000   0.000000   0.000000   0.000000   0.000000
   0.075996   0.060123   0.000000   0.000000   0.000000   0.000000   0.000000
   0.057533   0.075996   0.060123   0.000000   0.000000   0.000000   0.000000
   0.041053   0.057533   0.075996   0.060123   0.000000   0.000000   0.000000
   0.029023   0.041053   0.057533   0.075996   0.060123   0.000000   0.000000
   0.020486   0.029023   0.041053   0.057533   0.075996   0.060123   0.000000
   0.014457   0.020486   0.029023   0.041053   0.057533   0.075996   0.060123
   0.010202   0.014457   0.020486   0.029023   0.041053   0.057533   0.075996
   0.007199   0.010202   0.014457   0.020486   0.029023   0.041053   0.057533
   0.005080   0.007199   0.010202   0.014457   0.020486   0.029023   0.041053
   0.003585   0.005080   0.007199   0.010202   0.014457   0.020486   0.029023
   0.002530   0.003585   0.005080   0.007199   0.010202   0.014457   0.020486
   0.001785   0.002530   0.003585   0.005080   0.007199   0.010202   0.014457
   0.001260   0.001785   0.002530   0.003585   0.005080   0.007199   0.010202
   0.000889   0.001260   0.001785   0.002530   0.003585   0.005080   0.007199
   0.000627   0.000889   0.001260   0.001785   0.002530   0.003585   0.005080
   0.000443   0.000627   0.000889   0.001260   0.001785   0.002530   0.003585
   0.000312   0.000443   0.000627   0.000889   0.001260   0.001785   0.002530
   0.000220   0.000312   0.000443   0.000627   0.000889   0.001260   0.001785
   0.000156   0.000220   0.000312   0.000443   0.000627   0.000889   0.001260

 Columns 8 through 14:

   0.000000   0.000000   0.000000   0.000000   0.000000   0.000000   0.000000
   0.000000   0.000000   0.000000   0.000000   0.000000   0.000000   0.000000
   0.000000   0.000000   0.000000   0.000000   0.000000   0.000000   0.000000
   0.000000   0.000000   0.000000   0.000000   0.000000   0.000000   0.000000
   0.000000   0.000000   0.000000   0.000000   0.000000   0.000000   0.000000
   0.000000   0.000000   0.000000   0.000000   0.000000   0.000000   0.000000
   0.000000   0.000000   0.000000   0.000000   0.000000   0.000000   0.000000
   0.060123   0.000000   0.000000   0.000000   0.000000   0.000000   0.000000
   0.075996   0.060123   0.000000   0.000000   0.000000   0.000000   0.000000
   0.057533   0.075996   0.060123   0.000000   0.000000   0.000000   0.000000
   0.041053   0.057533   0.075996   0.060123   0.000000   0.000000   0.000000
   0.029023   0.041053   0.057533   0.075996   0.060123   0.000000   0.000000
   0.020486   0.029023   0.041053   0.057533   0.075996   0.060123   0.000000
   0.014457   0.020486   0.029023   0.041053   0.057533   0.075996   0.060123
   0.010202   0.014457   0.020486   0.029023   0.041053   0.057533   0.075996
   0.007199   0.010202   0.014457   0.020486   0.029023   0.041053   0.057533
   0.005080   0.007199   0.010202   0.014457   0.020486   0.029023   0.041053
   0.003585   0.005080   0.007199   0.010202   0.014457   0.020486   0.029023
   0.002530   0.003585   0.005080   0.007199   0.010202   0.014457   0.020486
   0.001785   0.002530   0.003585   0.005080   0.007199   0.010202   0.014457

 Columns 15 through 20:

   0.000000   0.000000   0.000000   0.000000   0.000000   0.000000
   0.000000   0.000000   0.000000   0.000000   0.000000   0.000000
   0.000000   0.000000   0.000000   0.000000   0.000000   0.000000
   0.000000   0.000000   0.000000   0.000000   0.000000   0.000000
   0.000000   0.000000   0.000000   0.000000   0.000000   0.000000
   0.000000   0.000000   0.000000   0.000000   0.000000   0.000000
   0.000000   0.000000   0.000000   0.000000   0.000000   0.000000
   0.000000   0.000000   0.000000   0.000000   0.000000   0.000000
   0.000000   0.000000   0.000000   0.000000   0.000000   0.000000
   0.000000   0.000000   0.000000   0.000000   0.000000   0.000000
   0.000000   0.000000   0.000000   0.000000   0.000000   0.000000
   0.000000   0.000000   0.000000   0.000000   0.000000   0.000000
   0.000000   0.000000   0.000000   0.000000   0.000000   0.000000
   0.000000   0.000000   0.000000   0.000000   0.000000   0.000000
   0.060123   0.000000   0.000000   0.000000   0.000000   0.000000
   0.075996   0.060123   0.000000   0.000000   0.000000   0.000000
   0.057533   0.075996   0.060123   0.000000   0.000000   0.000000
   0.041053   0.057533   0.075996   0.060123   0.000000   0.000000
   0.029023   0.041053   0.057533   0.075996   0.060123   0.000000
   0.020486   0.029023   0.041053   0.057533   0.075996   0.060123

>>>> r = 30; % Våran referens (börvärde)
>> R = ones(1, Np)'*r;
>> a = 0.000001; % Parameter för att inv() inte ska balla ur
>> x0 = [0;0]; % Initsiala startvektor på position 0 och hastighet 0
>> U = inv(GAMMA'*GAMMA + a)*GAMMA'*(R-PHI*x0) % Våra insignaler. 
U =

   498.875
  -131.709
   187.974
    46.667
   109.128
    81.519
    93.722
    88.328
    90.713
    89.658
    90.125
    89.917
    90.013
    89.962
    90.003
    89.942
    90.067
    89.790
    90.415
    89.108

>>>> t = 0:0.5:(9.5); % Tidsvektor då vi har 0.5 i samplingsintervall.

>> y = lsim(sysd, U', t); % nu simulerar vi
Då testar vi att simulera våran modell med U insigal. Perfekt! Men i verkligheten så kanske U kan max vara 255. Vi säger att vi säger att alla över 255 ska vara 255!
Skärmbild från 2019-01-06 18-55-16.png

Kod: Markera allt

>> U2 = U;
>> U2(U2 > 255) = 255;
>> U2
U2 =

   255.000
  -131.709
   187.974
    46.667
   109.128
    81.519
    93.722
    88.328
    90.713
    89.658
    90.125
    89.917
    90.013
    89.962
    90.003
    89.942
    90.067
    89.790
    90.415
    89.108

>> y = lsim(sysd, U2', t);
Och här är resultatet. Tystnad uppstår.....helt plötsligt var PID asatråkigt! :mrgreen:

Så vad tror ni? Kan jag implementera detta i en uC?
Skärmbild från 2019-01-06 18-58-01.png
Glömde också att säga att alla värden som är under 0 ska vara 0.

Kod: Markera allt

>> U2(U2 < 0) = 0;
>> y = lsim(sysd, U2', t);
Resultat då:
Skärmbild från 2019-01-06 19-01-57.png
Nej TomasL! Du kan inte ta patent på detta. Rätt så gammal teknik.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Shimonu
Inlägg: 294
Blev medlem: 21 oktober 2015, 22:44:33

Re: Är en STM32 bra att använda som USB I/O-modul?

Inlägg av Shimonu »

Vad menar du är det som hindrar det här från att implementeras på en µC?
Glattnos
Inlägg: 2972
Blev medlem: 29 oktober 2009, 20:01:18

Re: Är en STM32 bra att använda som USB I/O-modul?

Inlägg av Glattnos »

Al_Bundy skrev:Och här är resultatet. Tystnad uppstår.....helt plötsligt var PID asatråkigt! :mrgreen:
Nu jämför du med PID igen. Jag är inget proffs och det är väl därför jag inte förstår, men kan du förklara på vilket sätt detta ersätter PID? Inte hur det fungerar eller hur bra det är, utan på vilket sätt det är en ersättare för PID.
Hur kan man reglera nått utan att ta hänsyn till vare sig proportion, integral eller förändrningshastighet hos in-signalerna? På många reglersystem så ser jag inte ens hur detta skulle funka. Funkar det bara på data-strukturer och system som är väldefinierade och har matematiska modeller framtagna?
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Är en STM32 bra att använda som USB I/O-modul?

Inlägg av Al_Bundy »

Shimonu skrev:Vad menar du är det som hindrar det här från att implementeras på en µC?
Jag vet inte. Håller på att utveckla ett litet C-bibliotek för linjär algebra. Den ska ha grundläggande funktioner som MATLAB har. Vill folk vara med på tåget?
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Är en STM32 bra att använda som USB I/O-modul?

Inlägg av Al_Bundy »

Glattnos skrev:
Al_Bundy skrev:Och här är resultatet. Tystnad uppstår.....helt plötsligt var PID asatråkigt! :mrgreen:
Nu jämför du med PID igen. Jag är inget proffs och det är väl därför jag inte förstår, men kan du förklara på vilket sätt detta ersätter PID? Inte hur det fungerar eller hur bra det är, utan på vilket sätt det är en ersättare för PID.
Hur kan man reglera nått utan att ta hänsyn till vare sig proportion, integral eller förändrningshastighet hos in-signalerna? På många reglersystem så ser jag inte ens hur detta skulle funka. Funkar det bara på data-strukturer och system som är väldefinierade och har matematiska modeller framtagna?
En PID har följande nackdelar:

1. D-delen tål ej frekvenser
2. Den har bara 1-steg prediktion som är väldigt dålig.
3. Du måste hitta parametrarna P,I och D.
4. I-delen gör den seg vid vissa tillfällen

Övrigt så är PID riktigt bra vid snabba system.

En PID vill ju ha förstärkning, integrering och derivering. En MPC räknar helt enkelt bara ut det värdet vi ska ha igenom att minimera en kvadratisk kostfunktion. Så länge du har en matematisk beskrivning av systemet så kommer du inte behöva trimma in din regulator. Därför applicerar jag alltid systemidentifiering med MPC och då har man i praktiken machine learning.
Glattnos
Inlägg: 2972
Blev medlem: 29 oktober 2009, 20:01:18

Re: Är en STM32 bra att använda som USB I/O-modul?

Inlägg av Glattnos »

Tackar för beskrivningen :)
Kan det användas för att stabilisera en drönare? :humm:
svanted
Inlägg: 5082
Blev medlem: 30 augusti 2010, 21:20:38
Ort: Umeå

Re: Är en STM32 bra att använda som USB I/O-modul?

Inlägg av svanted »

Al_Bundy skrev:
svanted skrev:jag fattar absolut inget, om man har ett är värde som ska regleras mot ett börvärde gör man det propotionellt,
vill man ha snabbare stegsvar använder man derivatan,
och vill man ha högre nogrannhet använder man integralen,
vad är teorin bakom att göra på något annat sätt?
Derivator, Integraler fingerar fint. Men tänk om du har en bil utan bromsar. Den enda bromsningen du har är allt luftmotstånd och friktion från vägen. Då gäller det att du måste ha en bra optimerad fot på gaspedalen.

Exempel på system som inte har någon "broms" är temperatur och flöde. Processindustrin använder sig alltid av prediktiv reglering. PID fungerar utmärkt för t.ex. servomotorer där man kan "vrida åt andra hållet" om det gick fel.

Vem har en kylare i sin tekokare? :D
jag fattar fortfarande inte hur du menar?

du menar att trycket med foten ska regleras?
det är ingen reglering, det är snarare en frikoppling som indikeras av att ett drivande hjul börjar snurra fortare än det icke drivande.
å en sån "reglering" går inte att simulera efterssom det handlar om friktionen mot vägbanan.
Exempel på system som inte har någon "broms" är temperatur och flöde. Processindustrin använder sig alltid av prediktiv reglering. PID fungerar utmärkt för t.ex. servomotorer där man kan "vrida åt andra hållet" om det gick fel.
PID fungerar utmärkt för temperaturreglering,
ärvärde ska vara lika med börvärde och PID däremellan.


en servomotor går åckså utmärkt att PID reglera,
ärvärdet är lika med positionen, läses av typ mha en potentiometer eller mätskala,
om man behöver "vrida åt andra hållet" är PID regleringen feljusterad

vart kom tekokaren ifrån?
skulle kylaren vara en broms?
eller har man prediktiv reglering på en tekokare?
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Är en STM32 bra att använda som USB I/O-modul?

Inlägg av Al_Bundy »

Glattnos skrev:Tackar för beskrivningen :)
Kan det användas för att stabilisera en drönare? :humm:
Japp. Det kan den. Det finns många som redan har implementerat en MPC för en drönare.
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Är en STM32 bra att använda som USB I/O-modul?

Inlägg av Al_Bundy »

svanted skrev:
Al_Bundy skrev:
svanted skrev:jag fattar absolut inget, om man har ett är värde som ska regleras mot ett börvärde gör man det propotionellt,
vill man ha snabbare stegsvar använder man derivatan,
och vill man ha högre nogrannhet använder man integralen,
vad är teorin bakom att göra på något annat sätt?
Derivator, Integraler fingerar fint. Men tänk om du har en bil utan bromsar. Den enda bromsningen du har är allt luftmotstånd och friktion från vägen. Då gäller det att du måste ha en bra optimerad fot på gaspedalen.

Exempel på system som inte har någon "broms" är temperatur och flöde. Processindustrin använder sig alltid av prediktiv reglering. PID fungerar utmärkt för t.ex. servomotorer där man kan "vrida åt andra hållet" om det gick fel.

Vem har en kylare i sin tekokare? :D
jag fattar fortfarande inte hur du menar?

du menar att trycket med foten ska regleras?
det är ingen reglering, det är snarare en frikoppling som indikeras av att ett drivande hjul börjar snurra fortare än det icke drivande.
å en sån "reglering" går inte att simulera efterssom det handlar om friktionen mot vägbanan.
Exempel på system som inte har någon "broms" är temperatur och flöde. Processindustrin använder sig alltid av prediktiv reglering. PID fungerar utmärkt för t.ex. servomotorer där man kan "vrida åt andra hållet" om det gick fel.
PID fungerar utmärkt för temperaturreglering,
ärvärde ska vara lika med börvärde och PID däremellan.


en servomotor går åckså utmärkt att PID reglera,
ärvärdet är lika med positionen, läses av typ mha en potentiometer eller mätskala,
om man behöver "vrida åt andra hållet" är PID regleringen feljusterad

vart kom tekokaren ifrån?
skulle kylaren vara en broms?
eller har man prediktiv reglering på en tekokare?
PID fungerar utmärkt för temperaturreglering, tills du inser att du har inte råd med överskjut.

PID skulle jag säga passar väldigt bra för snabba system, då man kan bygga en PID från analog elektronik också.

Tekokaren kom från ingenstans.
Du kan inte implementera en kylning om man inte har råd.
MPC?
Mindmapper
Inlägg: 6389
Blev medlem: 31 augusti 2006, 16:42:43
Ort: Jamtland

Re: Är en STM32 bra att använda som USB I/O-modul?

Inlägg av Mindmapper »

Finns väl massor med industriella processer som är optimerade för att inte ha överskjut.
Fast de flesta använder bara PI.

Du menar alltså att med kvadratisk programmering behövs ingen PID och att det inte har några nackdelar? Vilket borde innebära att det är det ultimata reglersystemet användbart i alla sammanhang!

Själv blir jag alltid skeptisk när folk kommer och säger att de hittat det ultimata systemet, oavsett vad det är.
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Är en STM32 bra att använda som USB I/O-modul?

Inlägg av Al_Bundy »

Mindmapper skrev:Finns väl massor med industriella processer som är optimerade för att inte ha överskjut.
Fast de flesta använder bara PI.

Du menar alltså att med kvadratisk programmering behövs ingen PID och att det inte har några nackdelar? Vilket borde innebära att det är det ultimata reglersystemet användbart i alla sammanhang!

Själv blir jag alltid skeptisk när folk kommer och säger att de hittat det ultimata systemet, oavsett vad det är.
Om de inte får överskjut med en PI så betyder det att processen har en hög dämpning och kanske en hög tröghet. Jag har studerat teorin angående detta.

Nackdelen med kvadratisk programmering är att man behöver större mjukvara och större processor. När en PID duger så finns det ingen anledning att ha MPC.
Jag skulle säga att om du har ett snabbt SISO system så duger PID riktigt bra. Har du ett MIMO system som är snabbt så duger en LQR. Men har du ett SISO eller MIMO system som har tröghet eller låg dämpning så är nog MPC det bästa alternativet.

Det finns inget ultimat reglersystem. Däremot finns det häftiga reglersystem som drar åt sig uppmärksamhet.
Rick81
Inlägg: 746
Blev medlem: 30 december 2005, 13:07:09

Re: Är en STM32 bra att använda som USB I/O-modul?

Inlägg av Rick81 »

Men jobbet att ta fram en korrekt matematiskt modell för ett system måste väl ändå vara jobbigare/mer tidskrävande än att räkna ut PID konstanterna?
Skriv svar