AXEmotor

Odpovědět
expertdb
Příspěvky: 3
Registrován: 26 dub 2019, 21:06

AXEmotor

Příspěvek od expertdb »

Postavil jsem si s úspěchem toto řízení ss motoru. Chodí to fajn, ale pro řízení starého modelu TT lokomotivy to má moc široký mrtvý chod kolem nuly. Potřeboval bych aby se mašinka rozjela dříve. Tuším, že by to mohlo jít změnit v části na zvýrazněném řádku..
Byl by někdo ochoten mně vysvětlit ten matematický zápis : fwmin =492 ( zhruba hodnota středu potenciometru) -hodnota z pot. * 21/10 MAX 1023- a toto nevím co vyjadřuje? Děkuji
gofwd:
pins = $02
pwmdt = fwdmin - analogvalue * 21 / 10 MAX 1023
pwmout pwmport, 255, pwmdt
goto main
Uživatelský avatar
jrt
Příspěvky: 1921
Registrován: 17 úno 2013, 17:13

Re: AXEmotor

Příspěvek od jrt »

Bylo by prima, kdybys sem ten program příště poslal celý.

Kód: Vybrat vše

#picaxe 08m2
symbol fwdmin = 492
symbol revmin = 532
symbol analogport = 4
symbol pwmport = 2
symbol analogvalue = w0
symbol pwmdt = w1
output 0
output 1

main:
readadc10 analogport, analogvalue
if analogvalue <= fwdmin then gofwd
if analogvalue >= revmin then gorev
pins = 0
goto main
gofwd:
pins = $02
pwmdt = fwdmin - analogvalue * 21 / 10 MAX 1023
pwmout pwmport, 255, pwmdt
goto main
gorev:
pins = $01
pwmdt = analogvalue - revmin * 21 / 10 MAX 1023
pwmout pwmport, 255, pwmdt
goto main
Mrtvý chod se nastavuje konstantami fwdmin a revmin tak, aby motorek s jistotou stál, když je potenciometr uprostřed dráhy. Zvýrazněný řádek převrací hodnotu analogvalue a násobí ji konstantou 2,1 (21/10), takže při hodnotě analogvalue 491 (potenciometr přibližně uprostřed) je činitel plnění PWM (pwmdt) 2 (492 - 491 = 1; 1 * 2,1 = 2 [zaokrouhleně]) a motor se skoro netočí, při hodnotě analogvalue 0 (potenciometr na dorazu) je činitel plnění 492 * 2,1 = 1033 (omezení MAX 1023 nedovolí ale víc než 1023) a motor jede plnými otáčkami.
S těmito čísly je třeba si pohrát a nastavit si regulátor tak, aby vyhovoval konkrétnímu motorku, případně použít i omezení MIN, aby činitel plnění PWM nezačínal od nuly.
jrt
expertdb
Příspěvky: 3
Registrován: 26 dub 2019, 21:06

Re: AXEmotor

Příspěvek od expertdb »

Díky moc za vysvětlení.
Ještě taková drobnost. Proč je použit zlomek 21/10 a ne přímo 2? Má to nějaký programátorský význam? Ve vysledku je to skoro stejné. Co se týká použití MIN ,můžu napsat příkaz např: pwmdt = fwdmin - analogvalue * 21 / 10 MIN14 MAX 1023 ?
DavidO
Příspěvky: 1133
Registrován: 01 kvě 2013, 21:27

Re: AXEmotor

Příspěvek od DavidO »

Význam to má, protože Picaxe neumí počítat s necelýma číslama, tak když chceš něco takového počítat, musíš to opsat výpočtem, který bude matematicky co nejbližší, ale bude používat jen celá čísla a žádná necelá.

min/max viz příkaz let.
Nikoho plánovaně neurážím. Jestli se Vám nelíbí co píšu, tak to nečtěte. A ostatně, třeba za to nemůžu - Researchers believe that dark humor can be a significant symptom of dementia.
expertdb
Příspěvky: 3
Registrován: 26 dub 2019, 21:06

Re: AXEmotor

Příspěvek od expertdb »

Mám takový nápad. Bylo by možné toto zapojení naprogramovat tak, že by to postupně, v nějakém nastaveném čase, rampovalo na hodnotu,která je nastavena tím potenciometrem? Např. mám nastavený pot. na půl dráhy na jednu stranu a do té hodnoty by to narampovalo třeba za 3 sekundy. Díky
jova
Příspěvky: 361
Registrován: 16 pro 2013, 11:40

Re: AXEmotor

Příspěvek od jova »

Já bych to zkusil udělal tak, že bych tu načtenou hodnotu z potenciometru nejprve matematicky upravil a postupně dopočítával na načtenou hodnotu. Například nějak takto:

Kód: Vybrat vše

;8M2
start:
b0=255 ;"počáteční nulová rychlost"
otacky:
readadc 4,b1 ;načtená hodnota
if b1=255 then pwmout 2,0,0 goto start end if ;vypnutí PWM
if b0>b1 then : b0=b0-1 : pwmout 2,255,b0 : pause 200 : end if	;hodnotou pause se doladí rychlost náběhu
if b0=b1 or b0<b1 then : b0=b1 : pwmout 2,255,b0 : end if
goto otacky
Obdobně by se dalo udělat i "brždění" při b0<b1.
Uživatelský avatar
jrt
Příspěvky: 1921
Registrován: 17 úno 2013, 17:13

Re: AXEmotor

Příspěvek od jrt »

Tohle funguje, strmost rampy se nastavuje délkou pauzy:

Kód: Vybrat vše

#PICAXE 14M2
#no_data

#rem
AXEmotor 14M2
b.4 = enable
c.0 = IN1
b.2 = IN2
#endrem

symbol en = b.4
symbol in1 = c.0
symbol in2 = b.2
symbol adcpin = c.4
symbol pt = w0
symbol duty = w1

low in1
high in2
pwmout pwmdiv4, en, 249, 1

do
	readadc10 adcpin, pt
	duty = duty + pt
	duty = duty/2 max 1000
	;sertxd(#ptt,":",#duty,13,10)
	pwmduty en, duty
	pause 1000
loop
ale pro obousměrné řízení si to už budeš muset upravit sám...
jrt
Odpovědět