Sida 1 av 4
Den svävar... nästan
Postat: 10 juli 2004, 00:18:52
av $tiff
För ett tag sedan såg jag någon som länkade till
den här artikeln. Jag tyckte den var kalascool och dessutom löjligt enkel, så jag försökte mig på en egen version.
Men eftersom jag är PIC-tönt så ville jag bygga den med en mikrokontroller som enda IC. En linjär hallsensor trollade jag fram
härifrån.
Jag lindade mig en ful spole på en sjutusikens massa varv, eftersom jag inte förstår bättre än så. Av en händelse hade jag en färdigmonterad H-brygga som äntligen fick stå till tjänst och leverera lite ström med varierande polaritet.
Hallsensorn anslöt jag till en A/D-port så PICen kunde läsa av spänningen, trolla lite med siffrorna och spotta ut en kontinuerlig PWM-signal som via några transistorer omvandlas till snabba fram/back-skiftningar av H-bryggan, precis som i artikeln.
Allt är naturligtvis tejpat fast så ghetto som möjligt, hur annars?
Men tyvärr blev inte resultatet så bra. Se själv:
Film1
Film2
Som ni ser kommer hela kalaset i självsvängning och avbryter därmed det roliga på egen hand. Enligt mig själv kan inte µC sampla A/Dn tillräckligt fort för att häva dessa svängningar. Därför provade jag att optimera koden, igen och igen och lite till. Men det hjälpte inte så mycket.
Jag kan mycket väl tänka mig att detta löses bäst på analog väg, hela vägen.
Svävsaken ser nog lite tung ut med en nickelkula och allt, men det är ganska bra klös i de små neo-magnetstavarna! Jag hade tänkt mig att köpa en
kraftigare magnet (den kraftigaste), om det finns chans att jag löser mitt problem.
Vad har jag nu gjort för fel tycker ni?
Edit: Bildslarver

Postat: 10 juli 2004, 00:29:17
av Hedis
Hmm, skummt. Codecs fattas

Postat: 10 juli 2004, 01:00:38
av strombom
själv tror jag inte att du har för långsam kod, jag tror att du bör ha mjuka övergångar i utsignalen (lågpassfilter). nu har jag iofs varken sett din kod, ditt bygge eller dina filmer, men ändå
Du kan inte fixa något annat filmformat ?
/Johan
Postat: 10 juli 2004, 01:08:29
av danei
Jag tror inte heller felet ligger i att det är för långsamt. Men det är nog regleringen som är problemet.
Postat: 10 juli 2004, 01:33:46
av $tiff
Jag har provat att ge olika feedback åt alla möjliga håll, både linjärt och exponentiellt, men det hjälper inte så mycket det heller. Med den enkla krets som gubben konstruerade var ju väldigt linjär, och fungerar så bra som den gör, hur lyckas han, utan filter eller något sånt!?
Codecs? Det var det värsta, jag har själv inga problem med sånt
En bild gör väl inte världen bättre, men visst...
Postat: 10 juli 2004, 01:35:31
av cyr
Hmmm, filerna är ju i indeo-format. Den codecen har funnits med i windows sen 3.1 tror jag
Vad innebär "trolla med siffrorna" exakt?
Du kanske behöver trolla lite annorlunda
Om det är en enkel P-regulator (styrsignal = insignal * P) så kanske du behöver minska P... bara en ide, var aldrig någon expert på reglerteknik.
Postat: 10 juli 2004, 01:42:23
av $tiff
Nej, jag är ju inte så påläst heller, men jag har som sagt provat ändra detta P (som det tydligen kallas) olika för både repellerande och attraherande krafter.
Kod, lite bantad (någon som fattar PICBasic?

)
Kod: Markera allt
DEFINE OSC 20 'Define OSC (20MHz)
' - - - Pins - - -
magnet VAR PORTB.3 'Toggle electromagnet (hover function) 1= enable
Button0 VAR PORTB.4 'Button. 0 = active
' - - - Variables - - -
adc VAR BYTE 'ADC result
temp VAR BYTE 'temp byte, calculator
center VAR BYTE 'hover centrum
edge VAR BYTE 'hover edge
' - - - Initiate ports and values - - -
'ADC config
ADCON0 = %10000001 'Initiate A/D-converter on channel 0 (AN0)
ADCON1 = %00001110 'F(osc)/32 clock source - AN0 on (rest of portA is digital) - left justified result
TRISA.0 = 1 'PortA.0 = input
'PWM config
TRISC.2 = 0 'PortC.2 output (PWM1)
CCP1CON = %00001100 'Mode select = PWM1 on
T2CON = %00000100 'Timer2 ON + 1:1 prescale
PR2 = 255 '~19,53 kHz @ 20MHz OSC, 10 bit resolution
'Other I/O-config
Input button0 'Button to set hover centrum
Read 0,edge 'Hallsensor edge value (from memory)
center = edge / 2
High magnet 'Turn on electromagnet
' - - - - - Main Loop - - - - -
main_loop:
'Start on A/D-conversion to fetch at end of program loop
ADCON0.2 = 1 'Start A/D-conversion
'Set hover centrum (if button is pressed)
IF Button0 = 0 Then
edge = adc + 1
Write 0,edge
center = edge / 2
EndIF
IF adc > center Then 'If magnet is too far away, pull it closer by increasing PWM
temp = adc - center 'Difference
IF temp < 32 Then 'Prevent rollover
CCPR1L = 128 + (temp * temp / 8) 'Add sensor value to center
High magnet 'Turn on electromagnet (if not on already)
Else
Input magnet 'Turn off electromagnet (energy save). Magnet is too far away anyway
EndIF
EndIF
IF adc < center Then 'If magnet is too close, push it away by decreasing PWM
High magnet 'Turn on electromagnet (if not on already)
temp = center - adc 'Difference
IF temp < 64 Then 'Prevent rollover
CCPR1L = 127 - (2 * temp) 'Subtract sensor value from center
Else
CCPR1L = 0 'If difference is too big, set PWM to zero (full push)
EndIF
EndIF
IF adc = center Then 'Perefct match
High magnet 'Turn on electromagnet (if not on already)
CCPR1L = 128 'Neutral PWM (no push, no pull)
EndIF
'read_ADC:
adc = ADRESH 'Save ADC result
GoTo main_loop 'Loop forever
End
Postat: 10 juli 2004, 01:49:21
av RDX*
Någon variant av PID-reglering skulle nog kunna göra susen.
Postat: 10 juli 2004, 01:50:15
av $tiff
RDX*, på svenska?
Postat: 10 juli 2004, 01:58:26
av RDX*
Nu använder du en proportionell reglering (P), om du lägger till en integrerande och deriverande så får du en PID-reglering.
Det har skrivits om PID-reglering på forumet tidigare. Sen kan du söka efter Appnote:s. Jag vet att Atmel har en appnote om PID-reglering.
Postat: 10 juli 2004, 01:59:43
av $tiff
kanske lite väl med integrering/derivering i en icke-flyttals-hanterande liten stackars PIC? nåja, jag ska ta en titt på det när en ny dag gryr...
Postat: 10 juli 2004, 02:02:43
av RDX*
Om du minns tråden "Ultraliten snabb linjeföljande robot"
http://www.geekjoan.com/forum/viewtopic ... ljare#7621
Han börjar också med en P-regulator men den blir labil så han lägger till en deriverande del och då blir den stabil. Kolla in sidan och filmerna.
Postat: 10 juli 2004, 11:30:21
av cyr
I den digitala värden så är integrering = summering och derivering = differens mellan två sampel, så speciellt jobbigt är det inte (för processorn).
En anledning varför enkel P-reglering funkar bra med en analog krets men inte med PIC kan vara tiden det tar från insignal till utsignal. Den fördröjningen betyder fasskift, vilket kan leda till instabil regulator.
Postat: 10 juli 2004, 13:40:38
av MicaelKarlsson
För mycket P-verkan kan få hela härligheten att spåra ur totalt.
Hittade ett PID-exempel i C, håll tillgodo:
http://www.avrfreaks.net/phpBB2/viewtopic.php?t=21176
Postat: 14 juli 2004, 00:55:53
av GeekJoan
Skulle ju kunna köpa en och plocka isär...
HIT ME!
