Den svävar... nästan
Den svävar... nästan
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
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
Senast redigerad av $tiff 10 juli 2004, 01:35:16, redigerad totalt 1 gång.
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...
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...
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.
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.
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, 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
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.
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.
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.
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.
- MicaelKarlsson
- Inlägg: 4669
- Blev medlem: 18 juni 2004, 09:16:07
- Ort: Aneby
- Kontakt:
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
Hittade ett PID-exempel i C, håll tillgodo: http://www.avrfreaks.net/phpBB2/viewtopic.php?t=21176