PID-reglering + stanna motor exakt
Re: PID-reglering + stanna motor exakt.
Varvtalet kommer att vara upp till ett par tusen varv per minut. Om vi säger 4000rpm kommer det ge 0,075mS mellan interrupten, med en kristall på 10MHz och 4xPLL ger det 750 instruktioner. Jag har lite dålig uppfattning om hur lång tid det tar att utföra beräkningarna, men 750 instruktioner låter lite. Det jag tänkte göra då är att jag sänker upplösningen vid högre varvtal, dvs summera tidsskillnaden från tex 4 interrupt, sedan utför jag en beräkning. Detta fungerar ju däremot inte lika bra om jag kör "moving target" principen.
Upplösningen som jag har skrivit är inte ett absolut krav, utan snarare ett mål, så jag får helt enkelt se hur långt jag kommer med denna uppställningen och se om det duger.
Upplösningen som jag har skrivit är inte ett absolut krav, utan snarare ett mål, så jag får helt enkelt se hur långt jag kommer med denna uppställningen och se om det duger.
Re: PID-reglering + stanna motor exakt.
När du bromsar lägger du på ett moment i motgående riktning som bromsar ner hastigheten och reglerar in mot en önskad slot som du ska stanna på.
Men om du nu i princip har stannat på denna slot, hur hanterar du ett omslag på enkodern? Du vet ju inte om den slog om för att du reglerade lite för lite, dvs den bromsade in nästan till noll på rätt slot, men gled sakta sakta över i nästa, eller om du reglerade lite för hårt, dvs du bromsade in till noll, men pga av att pålagt moment var aningen för starkt så backade den sakta sakt tillbaka en position.
Hur ser hårdvaran ut idag? Varför går det inte att få till en läsgaffel till så att du kan få ut riktning också?
Men om du nu i princip har stannat på denna slot, hur hanterar du ett omslag på enkodern? Du vet ju inte om den slog om för att du reglerade lite för lite, dvs den bromsade in nästan till noll på rätt slot, men gled sakta sakta över i nästa, eller om du reglerade lite för hårt, dvs du bromsade in till noll, men pga av att pålagt moment var aningen för starkt så backade den sakta sakt tillbaka en position.
Hur ser hårdvaran ut idag? Varför går det inte att få till en läsgaffel till så att du kan få ut riktning också?
Re: PID-reglering + stanna motor exakt.
Precis det Andax skriver är det jag menar men Andax hade förmågan att beskriva det på ett förträffligt sätt.
OM du nu ska fortsätta med endast en läsgaffel så skulle jag rekomendera att använda en timer/counter (konfigurerad som räknare) istället, läsgaffeln och kodskivan "klockar" räknaren, sen har du ett timerinterrupt som "triggar" PID-loppen med lämpligt intervall. Här läser du av räknaren, differentierar mot "förra" avläsningen - och presto så har du en hastighet. Om du dessutom adderar "hastigheten" till en 'stor' variabel så har du positionen.
Om du med beräkning menar PID-loppen så är det viktigt att den görs med så exakt intervall som möjligt. Om det tar olika lång tid mellan gångerna som PID-loopen körs så innebär "en puls" olika hastigheter vilket kommer ge dig svängningar på regulatorn utgång och således på motorns hastighet.
Om du ska köra med "äkta" kvadratur avläsning (och inte spikat vilken uC) du ska ha så kan jag rekomendera 18F2431, den har inbyggs hårdvaruräknare för inkrementalenkoder. Annars får du köra Interrupt On Change eller liknande. Jag är övertygad om att andra uC också har modeller med inkrementalräknare etc ifall du inte använder PIC.
OM du nu ska fortsätta med endast en läsgaffel så skulle jag rekomendera att använda en timer/counter (konfigurerad som räknare) istället, läsgaffeln och kodskivan "klockar" räknaren, sen har du ett timerinterrupt som "triggar" PID-loppen med lämpligt intervall. Här läser du av räknaren, differentierar mot "förra" avläsningen - och presto så har du en hastighet. Om du dessutom adderar "hastigheten" till en 'stor' variabel så har du positionen.
Om du med beräkning menar PID-loppen så är det viktigt att den görs med så exakt intervall som möjligt. Om det tar olika lång tid mellan gångerna som PID-loopen körs så innebär "en puls" olika hastigheter vilket kommer ge dig svängningar på regulatorn utgång och således på motorns hastighet.
Om du ska köra med "äkta" kvadratur avläsning (och inte spikat vilken uC) du ska ha så kan jag rekomendera 18F2431, den har inbyggs hårdvaruräknare för inkrementalenkoder. Annars får du köra Interrupt On Change eller liknande. Jag är övertygad om att andra uC också har modeller med inkrementalräknare etc ifall du inte använder PIC.
Re: PID-reglering + stanna motor exakt.
Jag måste hålla med Andax och H.O.
Som jag ser det så är det bara att lägga ner denna lösning.
Det finns inget som helst som talar om i *vilken* riktning det
hela snurrar. Bara en signal som säger *att* det snurrar...
Som jag ser det så är det bara att lägga ner denna lösning.
Det finns inget som helst som talar om i *vilken* riktning det
hela snurrar. Bara en signal som säger *att* det snurrar...
Re: PID-reglering + stanna motor exakt.
Hej igen. Nu har jag fått delar och börjat labba med att få den att snurra i konstant varvtal, men avläsningen av spaltskivan visade sig vara svårare än jag trodde..
Jag använder en CNA1302K som skall ha en rise- och fall time på 35µS, så tekniskt sett med mina 100 spalter per varv skall den klara av 60/(35*10^-6)*2*100 = 8571 rpm. Lysdioden driver jag från 5v med 150ohm resistor som strömbegränsning vilket ger den 22,5 mA. RL har jag satt till 2,2kOhm. Nu klarar den av ca 1100 rpm innan det blir helt galna mätvärden... Tidigare använde jag en 160ohms resistor vilket gav ca 20mA till lysdioden, då klarade den bara runt 400 rpm innan den blev galen..
Testriggen ser ut såhär: Här sitter läsgaffeln monterad: Vid 700 rpm blir det bra avläsning:
(tryck på bilden för större version) Men här fortsätter jag att öka varvtalet. Efter 1150 rpm flippar den ut helt och visar 0 istället... Antagligen hinner inte spänningen på utgången ändras tillräckligt mycket för att det skall noteras av mikroprocessorn? Första delen inzoomad.. Utgången från läsgaffeln är kopplad till min INT1 ingång på PIC18F4620, som ju är en schmitt trigger, som triggar ett interrupt (med hög prioritet). Min interrupt-rutin ser helt enkelt ut som såhär:
Har ni några idéer på hur jag kan få den bättre?
Mvh. Daniel
Jag använder en CNA1302K som skall ha en rise- och fall time på 35µS, så tekniskt sett med mina 100 spalter per varv skall den klara av 60/(35*10^-6)*2*100 = 8571 rpm. Lysdioden driver jag från 5v med 150ohm resistor som strömbegränsning vilket ger den 22,5 mA. RL har jag satt till 2,2kOhm. Nu klarar den av ca 1100 rpm innan det blir helt galna mätvärden... Tidigare använde jag en 160ohms resistor vilket gav ca 20mA till lysdioden, då klarade den bara runt 400 rpm innan den blev galen..
Testriggen ser ut såhär: Här sitter läsgaffeln monterad: Vid 700 rpm blir det bra avläsning:
(tryck på bilden för större version) Men här fortsätter jag att öka varvtalet. Efter 1150 rpm flippar den ut helt och visar 0 istället... Antagligen hinner inte spänningen på utgången ändras tillräckligt mycket för att det skall noteras av mikroprocessorn? Första delen inzoomad.. Utgången från läsgaffeln är kopplad till min INT1 ingång på PIC18F4620, som ju är en schmitt trigger, som triggar ett interrupt (med hög prioritet). Min interrupt-rutin ser helt enkelt ut som såhär:
Kod: Markera allt
void interrupt highIsr(void)
{
if (TMR1IE && TMR1IF){
// Kolla hur många spalter som har passerat...
lastNbrPassed = nbrPassed;
nbrPassed = 0;
// Ge klarsignal att skicka data med USART..
txPnt = &txBuffer[0];
TXIE = 1;
// Återställ flagga..
TMR1IF = 0;
}
if (INT1IE && INT1IF){
nbrPassed ++;
totalNbrPassed ++;
//..
INT1IF = 0;
}
}
void interrupt low_priority lowIsr(void)
{
if (TXIF && TXIE){
if (txPnt == &txBuffer[0]){ // Om det är en ny omgång...
txBuffer[0] = (unsigned char)(lastNbrPassed >> 8);
txBuffer[1] = (unsigned char)(lastNbrPassed & 0x0F);
TXREG = *txPnt ++;
}
else if (txPnt - &txBuffer[0] < 2){
TXREG = *txPnt ++;
}
else{ // slutet av strängen är uppnått, skicka ej mer...
TXIE = 0;
}
TXIF = 0;
}
}Har ni några idéer på hur jag kan få den bättre?
Mvh. Daniel
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Re: PID-reglering + stanna motor exakt.
Prova med betydligt lägre Rl, typ 470 ohm eller nått. Sen skulle det nog inte skada med en schmidt-trigger mellan läsgaffel och ingången - om inte ingången redan har det inbyggt.
EDIT: Stryk det där om schmidt-trigger, det skrev du ju att du hade...
EDIT2: Vad är det du plottat? Är det någon "debug-info" från ditt program eller är det någon typ av oscilloskop-skärm-dump? Det första du bör göra är att verifiera att sensorn ger en lämplig signal ut vid dit märkvarvtal, sen börja med koden.
EDIT: Stryk det där om schmidt-trigger, det skrev du ju att du hade...
EDIT2: Vad är det du plottat? Är det någon "debug-info" från ditt program eller är det någon typ av oscilloskop-skärm-dump? Det första du bör göra är att verifiera att sensorn ger en lämplig signal ut vid dit märkvarvtal, sen börja med koden.
Re: PID-reglering + stanna motor exakt.
Ett lägre Rl än det jag har nu fungerar inte, då blir toppspänningen vid en spaltöppning så låg att PIC;en räknar det som en nolla. Däremot blir det mycket bättre om jag minskar strömbegränsningsmotståndet till lysdioden, men då går jag ju över rekommenderad ström...
Ett oscilloskop har jag tyvärr ej tillgång till i mitt studentrum, det hade ju underlättat enormt annars.. Nu kan jag ju inte annat än att gissa vad som händer med utsignalen vid högre varvtal.
Graferna som jag visar är helt enkelt hur många spaltöppningar som har passerat läsgaffeln från ett timer-interrupt till ett annat. Varje gång ett sådant interrupt inträffar, var 6,5536'e mS, skickar EUSART;en ut en int, lastNbrPassed, till datorn. Dessa plottas sedan ut i MATLAB, den undre grafen är summan av de passerade spalterna, dvs hur många 100-dels varv den har snurrat vid varje tidpunkt.
Men den dippen som ses på en av graferna, där den går från 13 till 0 då den egentligen skall öka, den beror kanske på mjukvaran. Nu sedan jag ändrade på strömbegränsningsmotståndet fick jag nämligen PICen att mäta varvtal upp till 6000 rpm med någorlunda repeterbarhet, detta enligt den siffra som PIC;en skriver ut på LCD-displayen. Men när jag läste av siffrorna som den skickat till datorn var det en likadan dippa där.. Så jag får undersöka detta vidare, utan graferna i datorn har jag ju väldigt dålig koll på vad som händer eftersom jag inte har mycket annan mätutrustning..
Ett oscilloskop har jag tyvärr ej tillgång till i mitt studentrum, det hade ju underlättat enormt annars.. Nu kan jag ju inte annat än att gissa vad som händer med utsignalen vid högre varvtal.
Graferna som jag visar är helt enkelt hur många spaltöppningar som har passerat läsgaffeln från ett timer-interrupt till ett annat. Varje gång ett sådant interrupt inträffar, var 6,5536'e mS, skickar EUSART;en ut en int, lastNbrPassed, till datorn. Dessa plottas sedan ut i MATLAB, den undre grafen är summan av de passerade spalterna, dvs hur många 100-dels varv den har snurrat vid varje tidpunkt.
Men den dippen som ses på en av graferna, där den går från 13 till 0 då den egentligen skall öka, den beror kanske på mjukvaran. Nu sedan jag ändrade på strömbegränsningsmotståndet fick jag nämligen PICen att mäta varvtal upp till 6000 rpm med någorlunda repeterbarhet, detta enligt den siffra som PIC;en skriver ut på LCD-displayen. Men när jag läste av siffrorna som den skickat till datorn var det en likadan dippa där.. Så jag får undersöka detta vidare, utan graferna i datorn har jag ju väldigt dålig koll på vad som händer eftersom jag inte har mycket annan mätutrustning..
Re: PID-reglering + stanna motor exakt.
Problemet med EUSART är löst nu, och då ser det mycket bättre ut:
Bilden ovan är körd med 28mA genom lysdioden, då fungerar det bra upp till ~6000 rpm. Men såfort jag sänker strömmen till lysdioden så minskar det användbara varvtalet till bara runt 1000 till 1500 rpm.. I databladet verkar det som om man bör ligga på 20mA till lysdioden, så vad är alternativen, en OP-amp som förstärker utgången innan den matas till PIC'en??
Dessutom verkar det som att den missar någon spalt då och då, även i lägre varvtal, men det är svårt att avgöra..
Dessutom verkar det som att den missar någon spalt då och då, även i lägre varvtal, men det är svårt att avgöra..
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Re: PID-reglering + stanna motor exakt.
Medel och maxeffekt spelar in. Dvs under en kort stund kan man köra högre effekt, t.ex precis innan man ska stanna osv.
Re: PID-reglering + stanna motor exakt.
gissar att ljusstrålen är bredare än spalterna respektive icke spalt, så man har lite ljus på hela tiden
kolla med ljudkortet hur det ser ut
kolla med ljudkortet hur det ser ut
Re: PID-reglering + stanna motor exakt.
Jag lutade på samma håll som du, grym, så nu har jag fixat en ny större spaltskiva med bara hälften så många öppningar i (50/varv ist. för 100/varv). Men inte nu heller fungerar det särskilt bra...
Jag offrade mina hörlurar för att bygga ett ljudkorts-oscilloskop, så här såg det ut:
~500 RPM. 5 volt är vid det tredje sträcket (1,66v per div). Vid 2200 RPM: Här har PIC'en slutat mäta ordentligt, kanske 1 av 3 spalter kommer med.. Men antagligen runt 3500 - 4000 RPM: På full fart, runt 6500 RPM, kommer var 70'onde spalt med bara... Såhär ser ser grafen ut för denna körningen, den sista brusiga raksträckan som ligger vid runt 100 RPM i grafen är när motorn snurrar i 6500 RPM.. Även om signalen inte är jättefin så bör den ju inte vara några problem att läsa av tycker jag? Så vad tror ni att det beror på att den missar lite då och då, även i låga hastigehter?
Mvh. Daniel
Jag offrade mina hörlurar för att bygga ett ljudkorts-oscilloskop, så här såg det ut:
~500 RPM. 5 volt är vid det tredje sträcket (1,66v per div). Vid 2200 RPM: Här har PIC'en slutat mäta ordentligt, kanske 1 av 3 spalter kommer med.. Men antagligen runt 3500 - 4000 RPM: På full fart, runt 6500 RPM, kommer var 70'onde spalt med bara... Såhär ser ser grafen ut för denna körningen, den sista brusiga raksträckan som ligger vid runt 100 RPM i grafen är när motorn snurrar i 6500 RPM.. Även om signalen inte är jättefin så bör den ju inte vara några problem att läsa av tycker jag? Så vad tror ni att det beror på att den missar lite då och då, även i låga hastigehter?
Mvh. Daniel
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Re: PID-reglering + stanna motor exakt.
Man ser ju tydligt att nivån på signalen avtar avsevärt med ökad frekvens. Vad säger databladet för din uC att den ingången du använder har för "omslagsnivåer".
Jag hade provat två saker:
1) Snygga till signalen externt, innan den går i PIC'en. Oavsett om den har inbyggd schmidt-trigger. Inte förrän signalen ser OK ut på "skopet" skulle jag leta efter andra problem. Sen är det möjligt att du kan skippa den extra konditioneringen men tills det funkar hade jag velat ha en BRA signal in - inte en "borde vara tillräckligt bra, kanske" signal.
2) Mata signalen till en räknaringång istället för att trigga en interrupt. Nu ska väl inte ~10kHz interruptfrekvens vara några problem men jag har ingen aning om hur din kompilator hanterar interrupts och hur mycket overhead som finns.
Jag hade provat två saker:
1) Snygga till signalen externt, innan den går i PIC'en. Oavsett om den har inbyggd schmidt-trigger. Inte förrän signalen ser OK ut på "skopet" skulle jag leta efter andra problem. Sen är det möjligt att du kan skippa den extra konditioneringen men tills det funkar hade jag velat ha en BRA signal in - inte en "borde vara tillräckligt bra, kanske" signal.
2) Mata signalen till en räknaringång istället för att trigga en interrupt. Nu ska väl inte ~10kHz interruptfrekvens vara några problem men jag har ingen aning om hur din kompilator hanterar interrupts och hur mycket overhead som finns.
Re: PID-reglering + stanna motor exakt.
Om du får till signalen så att du inte tappar streck, vad är det som hindrar dig från att montera en läsgaffel till som ligger mittimellan två spalter när den första ligger precis på en spalt? Då har du din kvadratur avläsning och kan reglera mycket lättare.
Re: PID-reglering + stanna motor exakt.
H.O: Du har så rätt i det du säger.. Jag har köpt en komparator nu, LM393, som skall kunna fixa till signalen till en fin fyrkantsvåg.
Andax: Det är inget som gör att jag inte kan montera en till läsgaffel, men det är en hel del saker som gör att jag gärna slipper det. T.ex. så har jag ont om ingångar på PIC-processorn och det krävs bra precision för att montera läsgaffeln. Då spalterna är ½ mm breda så krävs det ju en precision vid monteringen på åtminstone 1/10-dels millimeter. Som sagt så vill jag testa med en. Jag kommer inte att lägga på en felpolariserad spänning för att bromsa den, utan kommer bara kortsluta motorn, då slipper jag ju att den vill snurra på fel håll när den stannar.. Jag är fullt medveten om att jag får mycket sämre precision på detta sättet, men jag vill i alla fall testa.
Andax: Det är inget som gör att jag inte kan montera en till läsgaffel, men det är en hel del saker som gör att jag gärna slipper det. T.ex. så har jag ont om ingångar på PIC-processorn och det krävs bra precision för att montera läsgaffeln. Då spalterna är ½ mm breda så krävs det ju en precision vid monteringen på åtminstone 1/10-dels millimeter. Som sagt så vill jag testa med en. Jag kommer inte att lägga på en felpolariserad spänning för att bromsa den, utan kommer bara kortsluta motorn, då slipper jag ju att den vill snurra på fel håll när den stannar.. Jag är fullt medveten om att jag får mycket sämre precision på detta sättet, men jag vill i alla fall testa.
Re: PID-reglering + stanna motor exakt.
Lite nyfiken på hur du skapar spaltskivan ??
då skivan i sig inte ser speciellt stor ut så skulle det vara intressant att veta
då skivan i sig inte ser speciellt stor ut så skulle det vara intressant att veta
