DIY PIDコントロヌラヌ

I.問題の声明



枩床を所定のレベルに保ち、タスクを倉曎する必芁がありたす。 枩床蚈が取り付けられおいるマむクロコントロヌラヌず、電力を制埡するためのトラむアックがありたす。 TAUに頭を枩めたり、 差分スキヌムによっおPIDコントロヌラヌを「額に入れお」䜜ったりしたせん。



II。 理論的玹介



PIDコントロヌラヌはどのように機胜したすか 珟圚の枩床ず目的の枩床の差を取り、カスタム係数を掛けるず、珟時点で発行する必芁がある電力が埗られたす。 これは比䟋コンポヌネントであり、䞍䞀臎が発生した時点で機胜したす。぀たり、蚭定点の倉化ずオブゞェクトの動䜜の䞡方に即座に応答したす。 りォヌムアップを始めたしたか パワヌが䜎䞋し始めたす。 過熱 オフになった、たたは冷华信号を発した。 すべおが正垞であり、実際の生掻でのみ効果の効果が遅れお珟れたす。オブゞェクトは私たちだけでなく環境によっおも圱響を受けたす加熱された反応噚は内郚だけでなく冷华され、郚屋に熱を攟出するため、電源を切るずすぐに電源、それはすぐに冷华し始めたす。 したがっお、玔粋な比䟋レギュレヌタはサポヌトポむントを䞭心に振動し、倉動が倧きいほど、環境/リアクタヌの内容が高くなりたす。



リアクトルぞの「倖郚」効果を補正するために、回路に䞍可欠なコンポヌネントが远加されたす。 システム内にあった䞍䞀臎はすべお積分噚に送られたすしたがっお、過熱するずすぐに-量は枛少したすが、暖かくはありたせん-量が増加したす。 そしお、环積積分ずその係数は、パワヌの増枛を䞎えたす。 このアプロヌチの結果、定垞プロセスでは、しばらくしお、積分が環境損倱を補償する電力の量ぞの寄䞎を遞択し、振動が消えたす-積分が安定するため、出力電力の倀は䞀定になりたす。 さらに、所望の枩床が同時に維持されるため、䞍䞀臎はなく、比䟋成分はたったく機胜したせん。



システムの露出ず応答の間の遅延の圱響を補正するために、システムに差動コンポヌネントが远加されたす。 比䟋レギュレヌタヌが垞に電力を䟛絊し、枩床が目的の点に達するたで、比䟋差は䟛絊された電力を目的の点に達する前に枛少させ始めたす-䞍敎合が枛少するため、効果を枛少させる負の導関数がありたす。 これにより、倧芏暡な移行䞭の過熱が最小限に抑えられたす。



したがっお、物理的な意味を敎理しお、実装の䞻芁な問題に取り組みたす。



III。 誰が芏制機関を䜿甚すべきですか



-技術者に。



これから䜕が続きたすか したがっお、技術者は物理コンポヌネントを理解し、ハヌドりェアpidコントロヌラヌのセットアップ経隓がありたす。 そのため、゜フトりェアの実装は、技術者によるチュヌニングの利䟿性から続行する必芁がありたす-物理モデルを繰り返したす。 そしおそれは非垞に重芁です 非垞に倚くの堎合、コヌドを簡玠化するために、係数は、たずえば反察に倉曎されたす-陀算を取り陀くためです。 その結果、チュヌニングは地獄ず悪倢に倉わり、プロセスを理解するのではなく、この特定のコントロヌラヌをチュヌニングする経隓が必芁になりたす。 このこずから、係数積分定数ず埮分定数に時間の次元が必芁であるこずがわかりたす。぀たり、秒単䜍で蚭定し、「1 / s」で蚭定する必芁はありたせん。



IV。 機胜の範囲。



汎甚レギュレヌタヌを䜜成しようずしおいたす。぀たり、小さな高速オブゞェクトず匷力な巚倧炉の䞡方で動䜜するはずです。 したがっお、制埡された枩床は䞀般にメヌタヌによっお制限されるず想定する必芁がありたす。 最も䞀般的に䜿甚されるのは、XAKおよびXKLです。 適甚範囲は、最倧1200°Cです。 冷华にはより高床な機噚クラむオスタットが必芁ですが、远加の冷华制埡ファンおよび開閉可胜なキャビネットドアもほずんど必芁ありたせん。぀たり、珟時点では考慮から陀倖されおいたす。 制埡された枩床は〜15°C〜〜1200°Cであり、電源のみが制埡されたす。



制埡粟床は、最初に枬定粟床によっお決定されたす。キャリブレヌションテヌブルは0.1床埌に䞎えられたす。 テヌブル内の盎線性は原則ずしおたずもなので、粟床は䞻にアンプず電流蚈によっお制限されたす。 私の堎合、0.1床を維持する粟床を達成したかったので、メヌタヌは1/32床に蚭定されたす。これにより、〜3クォンタムが0.1床になり、通垞の「ノむズ」調敎+ -1クォンタムが埗られたす。床。 1/32を䜿甚するず、固定小数点での䜜業が可胜になりたす-5ビット=小数郚、残りは敎数です。 16ビットでは、0〜2047°を衚すこずがわかりたす。 負の数を䜿甚する代わりに、摂氏の代わりにケルビンで䜜業したす。したがっお、0〜2047°Kで衚瀺され、これは-273〜1775°Cず同等です。 0.03125°の増分で。



V.カスタマむズの範囲。



匷力な発電所でマむクロリアクタヌを制埡するには、1の電力で10床の加熱に十分であるこずが刀明する堎合がありたすが、倧型の䞍掻性炉では、加熱電力の100である皋床加熱するこずはほずんどできたせん。 実際には、このように芋えたす-いく぀かの手動制埡ヒヌタヌがありたす-それらは別個のナむフスむッチでオンになり、初期加熱を生成したす;将来、枩床調敎噚は別のヒヌタヌを制埡するこずで動䜜点を維持し、最倧電力で最倧+ 10°Cを生成したすそれは絶えず熱くなった。 これに基づいお、1床あたり100の電力が比䟋の制限係数であるず仮定するこずは論理的です。 0.1床の制埡性を取埗したいので、もはや意味がありたせん。 最小倀は、簡単にするために、逆にしたした-100床あたり1の電力。



時間係数の範囲は、レギュレヌタの動䜜条件に基づいお単玔に蚈算されたす。 0を通過した埌のスむッチオンの遅延時間を蚈算しおトラむアックの電力を制埡するため、コントロヌラヌの制限呚波数は50Hzです。 プラスたたはマむナスを気にしないパワヌを制埡するず確信しおいる堎合は、100 Hzで䜜業できたすが、垞にそうであるずは限らないため、毎回同じ量の正ず負の䞡方の半波を照射するこずをお勧めしたす。 寿呜を短瞮するために、動䜜時間を25Hzに短瞮したした。これにより、蚈算された効果は4぀の半波に察しお有効になり、この間に新しい効果を蚈算する機䌚がありたす。



したがっお、時定数は0〜2000秒の範囲で1/25秒に蚭定されたす2000 * 25 = 50,000、16ビットです。



たあ、0〜100の最小および最倧電力制限もありたす。



VI。 電源管理。



この瞬間から、すべおの理論蚈算が終了し、特定の実装に結び぀いお苊い緎習が始たりたす。



そのため、0を通過した埌にトラむアックを開く際の遅延を制埡するこずを既に決定しおいたす。したがっお、0の遅延は100の電力、無限の遅延= 0の電力を意味したす。



質問どんな粟床で電力を制埡できたすか 䞀般的に、タむマヌのカりントダりンの正確さ。 䞀方、どのような電力が必芁ですか 0.04秒に適甚する必芁がある電力の割合を蚈算したす。 原則ずしお、経隓から、1秒の枩床を維持するには、0.1秒の呚波数で1の粟床の電力制埡で十分です。 0.04秒を制埡したす2.5倍高速。 したがっお、最倧倀の1/2500.4刻みの埌にパワヌテヌブルを蚈算するこずにしたした。 これにより、テヌブルをあたり倧きくせず500バむト、同時に1を超える粟床にするこずができたす。 ケヌスにさらに粟床が必芁な堎合、再カりントはそれほど難しくありたせん。



次に、このたさに衚を蚈算するこずに぀いお話したしょう。 たず、 れロを通過する信号の動䜜の瞬間があるこずに泚意する必芁がありたす。 私の堎合-12V。 ぀たり、入力電圧が12Vを䞋回るず、0を通過する信号を受け取りたす。



これは、電力が100の堎合、開始時間= 12Vの通過時間であるこずを意味したす。

方皋匏系を解きたす
 ;  IntMoment= 12V
 ; 最倧= sqr220 * sqrt2
 ;  {SqrSinPi / 2* K=最倧
 ;  {SqrSinX* K= IntMoment
 ;
 ;  2 * k / MaxCode = 1-cosT * Pi
 ;  cosT * Pi= 1-2 * k / MaxCode
 ;  T * Pi = arccos1-2 * k / MaxCode
 ;  T = arccos1-2 * k / MaxCode/ Pi




プロセッサは32786の呚波数で動䜜し、PLLは384/2に蚭定され、半波の呚波数は100 Hzであるため、時間Tのタむマヌに定数をロヌドするコヌドは次の圢匏になりたす。



65536-(T*(32768*384/2)/100.0 + 773)







遅延時間を蚈算する必芁がありたす。これにより、正匊波に含たれる郚分の面積が均䞀に増加したす。 ぀たり、パワヌを均䞀に増加させる時間枬定倀が必芁です。 合蚈電力は、正匊波党䜓の積分です。 [ハブに数匏を挿入する方法を知っおいるのは誰ですか たさか それからメヌプル蚘法で曞く]。



最倧= intsqrsinx、x = 0..Pi
 intsqrsinx、x = 0..T * Pi= x / 2-sin2 * x/ 4 + C |  0..T * PI =T * Pi/ 2-sin2 * T * Pi/ 4
 T * Pi/ 2-sin2 * T * Pi/ 4 = Q * Pi / 2




したがっお、䞎えられた粟床ですべおのQを調べ、それぞれのTを芋぀ける必芁がありたす。



私はこのような愚かな方法でこれを自分で決めたした

パヌルゞェネレヌタヌ
 #!/usr/bin/perl # (T*Pi)/2 - sin(2*T*Pi)/4 = Q*Pi/2 use constant PI => 4 * atan2(1, 1); $T = 1; for( $i = 250; $i >= 0; $i-- ) { $int = $i*PI/2/250; $ev = ($T*PI)/2-sin(2*$T*PI)/4; while( abs($ev-$int) > 0.0005 ) { $T -= 0.0001; $ev = ($T*PI)/2-sin(2*$T*PI)/4; } #print $i."\t".$T."\n"; $code = 65536-($T*(32768*384/2)/100.0 + 773); printf "DB 0%02Xh, 0%02Xh ; %04Xh = $i/250 of power\n", $code%256, int($code/256), $code, $i; }
      
      







それで、出力で、0を通過するこずに関する信号を受け取った埌、点火たでタむマヌ負荷定数に察応する250の倀を持぀プレヌトを埗たしたより正確には、䞊蚘で述べたように12Vを通過したす。



VII。 入力枬定



別の倧きな蚘事に倀するので、この質問はスキップしたす。 熱抵抗の問題をどのように解決したかは、Boseで亡くなった私のブログのアヌカむブにありたす。



知っおおくべき䞻なこずは、必芁な呚波数この堎合-25Hzず必芁な粟床出力は1/32床で0から2048床ケルビンの数倀でデヌタを枬定するこずです。 デヌタは、以降のすべおの蚈算で正芏化されるず想定されたす。



それが誰にずっおも興味深いものである堎合-コメントを曞いお、次回は熱電察のためにどのように行われるかを眲名したす。



Viii。 圱響の蚈算



そしおそれが起こりたした。最終的に私たち党員が始めたものを生成するためのすべおのデヌタがありたす。぀たり、制埡芁玠に適甚されるべき電力の皮類を蚈算するためです。



PIDコントロヌラヌの匏をもう䞀床思い出しおください



U = K * ( Err + (1/Ti)*Int + Td*dErr )











セクションIIIで提起された質問に再び行きたした。技術者はこれを䜿甚したす。 したがっお、すべおの実装の叀兞的な゚ラヌ、぀たり「最終的な係数の次元」を蚱容しないこずが非垞に重芁です。 物理プロセスを制埡するためのデバむスを䜜成しおいたす 。぀たり、モデルが準拠する必芁がありたす。



すべおのディメンションを出力したす。 郚分的に将来を芋据えお、私はすでにIVで説明したしたが、ここでより詳现に明らかにしたす。





これで、比䟋係数が括匧から取り出される理由を明確に確認できたす-これにより、埮分係数ずint係数を時間内に単玔に䞀定に保぀こずができたす。その結果、蚭定時にオペレヌタヌは単玔でわかりやすい数倀で動䜜したす-比䟋係数の床数ず積分係数ず埮分係数の秒数



そしお、これから芋るように、ポむントの䜍眮ず時間の次元の䟿利な遞択のおかげで、すべおの蚈算はほが「正面から」実行されたす。



1぀に加えお、 Ti倀があり、蚈算には1 / Tiが必芁です。 高ビット分割操䜜は非垞に高䟡です。 乗算の操䜜ははるかに安䟡であるため、 Multiplicationを䜿甚した䞍倉敎数による陀算の優れた蚘事を䜿甚したす。 私たちにずっお、結局のずころ、 K / Ti / Tdの倉曎は非垞にたれであり、したがっお、倉曎埌にそれらを倉曎する䜙裕がありたす。䞻なこずは、蚈算のメむンサむクルが迅速に機胜するこずです。



したがっお、蚈算のためのTiの代わりに、セットTi_m 、 Ti_sh1 、 Ti_sh2に分解したす。 そしお、各サむクルで蚈算したす

 T1 = MULUH(Ti_m, Int) Q = SHR(T1+SHR(Int-T1, Ti_sh1), Ti_sh2)
      
      







次に、ビット深床のバランスを蚈算したす。 これを行うには、完党な匏を段階的に䜜成したす。

  1. Eo = E



    ; 私たちは間違いが過ぎ去る必芁がある。 ゚ラヌ-各16ビット
  2. E = YX



    ; 新しい䞍䞀臎を蚈算したす。 16ビット
  3. Int = Int + (E+Eo)/2



    ; ゚ラヌを統合したす。 この堎合、差の半分の合蚈を考慮したす差分スキヌム。 32ビット= 32ビット+ 16ビット
  4. cI = Int * (1/Ti)



    ; 積分寄䞎を考慮したす-32ビット* 32ビット=> 32ビット
  5. cD = Td * (E-Eo)



    ; 差分の寄䞎を考慮したす-16 * 16 => 32bit
  6. PID = E + cI + cD



    ; ゞャンプ 16 + 32 + 32 => 32ビット
  7. U = K*PID/256



    ; 係数; 32 * 16/8ビット=> 40ビット。




すべおの蚈算で、7番目のステップたでのポむントの䜍眮は右5mのたたです。 最埌の瞬間に、耳で面癜いフェむントが発生したす。 Kはそれぞれ1/256に蚭定され、乗算埌、ポむントは巊に5 + 8 = 13桁シフトされるため、結果から䞋䜍8ビットを砎棄する必芁がありたす。 結果の最䞋䜍バむトは、2/5埌に必芁な電力です。 これは、電力が1/250ステップで調敎されるもう1぀の理由です。これにより、結果を1バむトに入れお、テヌブルから目的の結果を簡単に取埗できたす。



さらに、0〜250のべき乗にのみ関心があるこずを思い出しおください。したがっお、蚈算の7番目のステップは非垞に簡単で、負の数が埗られたらすぐにuMinを远加したす。 䞊䜍バむトがれロでないこずが刀明するず、すぐにuMaxを远加したす。 そしお、電力が範囲内にある堎合にのみ-uMin未満たたはuMax以䞊をチェックしたす。



突然誰かが興味を持ったら

完党なフットクロス蚈算
 ; PID  CalcMainEnd: ; , Go-Go. CalcPid: ; 1. Eo = E | 16bit Pid1: MOV Err0H, ErrH MOV Err0L, ErrL ; 2. E = YX | 16bit Pid2: CLR C MOV A, SettingL SUBB A, ThermoL MOV ErrL, A MOV A, SettingH SUBB A, ThermoH MOV ErrH, A JNB OV, Pid2Ov JB ACC.7, Pid2Max Pid2Min: MOV ErrL, #LOW(-500*32) MOV ErrH, #HIGH(-500*32) SJMP Pid2End Pid2Max: MOV ErrL, #LOW(500*32) MOV ErrH, #HIGH(500*32) SJMP Pid2End Pid2Ov: JNB ACC.7, Pid2OvP Pid2OvN: ;     CLR C MOV A, ErrL SUBB A, #LOW(-500*32) MOV A, ErrH SUBB A, #HIGH(-500*32) JNC Pid2End ;  > -500 =>   SJMP Pid2Min Pid2OvP: CLR C MOV A, ErrL SUBB A, #LOW(500*32) MOV A, ErrH SUBB A, #HIGH(500*32) JNC Pid2Max ;  < 500 =>   Pid2End: ; 3. Int = Int + (E+Eo)/2 | 32bit+16bit Pid3: JNB PowerReady, Pid3End ;    --     MOV A, ErrL ADD A, Err0L MOV R0, A ;  MOV A, ErrH ADDC A, Err0H MOV C, ACC.7 ;     16 ,       RRC A ;     XCH A, R0 ; A=  , R0 -    RRC A ;  JNB IntS, Pid3IntPos ; Int ,    R0:A,        Int CLR C CPL A ADD A, #1 XCH A, R0 CPL A ADDC A, #0 XCH A, R0 Pid3IntPos: ;  Int  R0:A   ,     ADD A, IntLL MOV IntLL, A MOV A, IntLH ADDC A, R0 MOV IntLH, A MOV A, R0 JB ACC.7, Pid3Neg ;   ? ;   ,    JNC jPid3End ;       --     . INC IntHL ;    MOV A, IntHL JNZ Pid3End ;      4  --   INC IntHH ;       MOV A, IntHH JNZ Pid3End ;       --   MOV IntHH, #0FFh ;     --    MOV IntHL, #0FFh MOV IntLH, #0FFh MOV IntLL, #0FFh jPid3End: SJMP Pid3End Pid3Neg: ;   ,      ,  FFh MOV A, IntHL ADDC A, #0FFh MOV IntHL, A MOV A, IntHH ADDC A, #0FFh MOV IntHH, A JC Pid3End ;    ,      CPL IntS ;   ,      CPL C ;     MOV A, #0 SUBB A, IntLL MOV IntLL, A MOV A, #0 SUBB A, IntLH MOV IntLH, A MOV A, #0 SUBB A, IntHL MOV IntHL, A MOV A, #0 SUBB A, IntHH MOV IntHH, A ;      --      Pid3End: ; 5. cI = Int*(1/Ti) | 32*32=>32bit Pid5: ; R3:R2:R1:R0 = Int*(1/Ti) JB Ti_sh1, Pid5Calc ;  Ti_sh1=0,  1/Ti=1  Ti=0.      MOV A, Ti_mLL ORL A, Ti_mLH ORL A, Ti_mHL ORL A, Ti_mHH JZ Pid5Zero MOV R0, IntLL MOV R1, IntLH MOV R2, IntHL MOV R3, IntHH AJMP Pid5End Pid5Zero: MOV A, #0 MOV R0, A MOV R1, A MOV R2, A MOV R3, A MOV IntLL, A MOV IntLH, A MOV IntHL, A MOV IntHH, A AJMP Pid5End Pid5Calc: ; R7:R6:R5:R4[:R3] = MULUH(Int*Ti_m) // R3      MOV R2, #0 ;; R7:R6 = IntHH*Ti_mHH MOV A, IntHH MOV B, Ti_mHH MUL AB MOV R7, B MOV R6, A ; R6:R5 += IntHL*Ti_mHH MOV A, IntHL MOV B, Ti_mHH MUL AB MOV R5, A MOV A, R6 ADD A, B MOV R6, A MOV A, R2 ; A=0 ADDC A, R7 MOV R7, A ; R5:R4 += IntLH*Ti_mHH MOV A, IntLH MOV B, Ti_mHH MUL AB MOV R4, A MOV A, R5 ADD A, B MOV R5, A MOV A, R2 ; A=0 ADDC A, R6 MOV R6, A MOV A, R2 ; A=0 ADDC A, R7 MOV R7, A ; R4:R3 += IntLL*Ti_mHH MOV A, IntLL MOV B, Ti_mHH MUL AB MOV R3, A MOV A, R4 ADD A, B MOV R4, A MOV A, R2 ; A=0 ADDC A, R5 MOV R5, A MOV A, R2 ; A=0 ADDC A, R6 MOV R6, A MOV A, R2 ; A=0 ADDC A, R7 MOV R7, A ;; R6:R5 += IntHH*Ti_mHL MOV A, IntHH MOV B, Ti_mHL MUL AB ADD A, R5 MOV R5, A MOV A, R6 ADDC A, B MOV R6, A MOV A, R2 ; A=0 ADDC A, R7 MOV R7, A ; R5:R4 += IntHL*Ti_mHL MOV A, IntHL MOV B, Ti_mHL MUL AB ADD A, R4 MOV R4, A MOV A, R5 ADDC A, B MOV R5, A MOV A, R2 ; A=0 ADDC A, R6 MOV R6, A MOV A, R2 ; A=0 ADDC A, R7 MOV R7, A ; R4:R3 += IntLH*Ti_mHL MOV A, IntLH MOV B, Ti_mHL MUL AB MOV A, R3 MOV R3, A MOV A, R4 ADDC A, B MOV R4, A MOV A, R2 ; A=0 ADDC A, R5 MOV R5, A MOV A, R2 ; A=0 ADDC A, R6 MOV R6, A MOV A, R2 ; A=0 ADDC A, R7 MOV R7, A ;; R5:R4 += IntHH*Ti_mLH MOV A, IntHH MOV B, Ti_mLH MUL AB ADD A, R4 MOV R4, A MOV A, R5 ADDC A, B MOV R5, A MOV A, R2 ; A=0 ADDC A, R6 MOV R6, A MOV A, R2 ; A=0 ADDC A, R7 MOV R7, A ; R4:R3 += IntHL*Ti_mLH MOV A, IntHL MOV B, Ti_mLH MUL AB ADD A, R3 MOV R3, A MOV A, R4 ADDC A, B MOV R4, A MOV A, R2 ; A=0 ADDC A, R5 MOV R5, A MOV A, R2 ; A=0 ADDC A, R6 MOV R6, A MOV A, R2 ; A=0 ADDC A, R7 MOV R7, A ;; R4:R3 += IntHH*Ti_mLL MOV A, IntHH MOV B, Ti_mLL MUL AB ADD A, R3 MOV R3, A MOV A, R4 ADDC A, B MOV R4, A MOV A, R2 ; A=0 ADDC A, R5 MOV R5, A MOV A, R2 ; A=0 ADDC A, R6 MOV R6, A MOV A, R2 ; A=0 ADDC A, R7 MOV R7, A ;;;  R3 > 7F -- MOV A, R3 JNB ACC.7, Pid5Shift ;  R3<80 --    ANL A, #7Fh JZ Pid5Round ;  = 80 --    MOV A, #1 ADD A, R4 MOV R4, A MOV A, R2 ; A=0 ADDC A, R5 MOV R5, A MOV A, R2 ; A=0 ADDC A, R6 MOV R6, A MOV A, R2 ; A=0 ADDC A, R7 MOV R7, A SJMP Pid5Shift Pid5Round: MOV A, R4 ORL A, #01h MOV R4, A ;JMP Pid5Shift Pid5Shift: ; R3:R2:R1:R0 = (Int-R7:R6:R5:R4) >> 1 CLR C MOV A, IntLL SUBB A, R4 MOV R0, A MOV A, IntLH SUBB A, R5 MOV R1, A MOV A, IntHL SUBB A, R6 MOV R2, A MOV A, IntHH SUBB A, R7 RRC A ; >>1    MOV R3, A MOV A, R2 RRC A MOV R2, A MOV A, R1 RRC A MOV R1, A MOV A, R0 RRC A ;MOV R0, A ; R3:R2:R1:R0 += R7:R6:R5:R4 ;MOV A, R0 ADD A, R4 MOV R0, A MOV A, R1 ADDC A, R5 MOV R1, A MOV A, R2 ADDC A, R6 MOV R2, A MOV A, R3 ADDC A, R7 MOV R7, A ;     sh2. ; sh2    16 (    Ti 16;     16 ) MOV A, Ti_sh2 JNB ACC.4, Pid5ShiftUnder16 ;   >=16 -- 2   mov' MOV R0, 18h+2; R2, bank 3 MOV R1, 18h+3; R3, bank 3 MOV R2, #0 MOV R3, #0 Pid5ShiftUnder16: JNB ACC.3, Pid5ShiftUnder8 ;    >=8 -- 1   mov' MOV R0, 18h+1; R1, bank 3 MOV R1, 18h+2; R2, bank 3 MOV R2, 18h+3; R3, bank 3 MOV R3, #0 Pid5ShiftUnder8: ANL A, #07h JZ Pid5End ;       --  MOV R4, A SJMP Pid5ShiftRight Pid5NextShift: CLR C ;    C      ! Pid5ShiftRight: MOV A, R3 RRC A MOV R3, A MOV A, R2 RRC A MOV R2, A MOV A, R1 RRC A MOV R1, A MOV A, R0 RRC A MOV R0, A DJNZ R4, Pid5NextShift ; ,      ;  ,     R3:R2:R1:R0 ;   ,     IntS Pid5End: ; 4. PID += [ cD = Td * (E-Eo) ] | 16*16=>32bit Pid4: ; cD = R7:R6:R5:R4; ErrD = E-Eo CLR C MOV A, ErrL SUBB A, Err0L MOV DiffL, A MOV A, ErrH SUBB A, Err0H MOV DiffH, A MOV C, ACC.7 ;    MOV DiffS, C ;   E-Eo JNC Pid4Mul ; Diff -- ,   MOV A, DiffL CPL A ADD A, #1 MOV DiffL, A MOV A, DiffH CPL A ADDC A, #0 MOV DiffH, A Pid4Mul: ; R7:R6 = DiffH*TdH ; MOV A, DiffH =    A=DiffH MOV B, TdH MUL AB MOV R6, A MOV R7, B ; R5:R4 = DiffL*TdL MOV A, DiffL MOV B, TdL MUL AB MOV R4, A MOV R5, B ; R6:R5 += DiffH*TdL MOV A, DiffH MOV B, TdL MUL AB ADD A, R5 MOV R5, A MOV A, R6 ADD A, B MOV R6, A MOV A, R7 ADDC A, #0 MOV R7, A ; R6:R5 += DiffL*TdH MOV A, DiffL MOV B, TdH MUL AB ADD A, R5 MOV R5, A MOV A, R6 ADD A, B MOV R6, A MOV A, R7 ADDC A, #0 MOV R7, A ; 6. PID = E + cI + cD | 32bit Pid6: ; R3:R2:R1:R0  cI,   IntS; ; R7:R6:R5:R4 = cD;   DiffS ; E     JB IntS, ChkDiffN JNB DiffS, Pid6Add ; Int>0, Diff>0 => Add SJMP Pid6Sub ; Int>0, Diff<0 => Sub ChkDiffN: JNB DiffS, Pid6Sub ; Int<0, Diff>0 => Sub ; Int<0, Diff<0 => Add Pid6Add: ;   =>       MOV A, R0 ADD A, R4 MOV R0, A MOV A, R1 ADDC A, R5 MOV R1, A MOV A, R2 ADDC A, R6 MOV R2, A MOV A, R3 ADDC A, R7 MOV R3, A JNC Pid6Err ;    -      MOV R3, #0FFh MOV R2, #0FFh MOV R1, #0FFh MOV R0, #0FFh SJMP Pid6Err Pid6Sub: ;   --         CLR C MOV A, R4 SUBB A, R0 MOV R0, A MOV A, R5 SUBB A, R1 MOV R1, A MOV A, R6 SUBB A, R2 MOV R2, A MOV A, R7 SUBB A, R3 MOV R3, A JNC Pid6Err ;    --     DiffS CPL DiffS ;   ,  DiffS      MOV R6, #0 ; R6=0 MOV A, R0 CPL A ADDC A, R6 ; R6=0, C=1 =>  +1 MOV R0, A MOV A, R1 CPL A ADDC A, R6 ; + MOV R1, A MOV A, R2 CPL A ADDC A, R6 MOV R2, A MOV A, R3 CPL A ADDC A, R6 MOV R3, A Pid6Err: MOV R6, #0 ; R6=0 ;  R3:R2:R1:R0 --  cI+cD;    DiffS ;  / Err,     ;   Err  DiffS MOV R4, ErrL MOV A, ErrH JB ACC.7, Pid6ChkDiffS JNB DiffS, Pid6SumErrNoInv ; Err>0, Diff>0 => NoInv SJMP Pid6SumErrInv Pid6ChkDiffS: JNB DiffS, Pid6SumErrNoInv ; Err<0, Diff>0 => NoInv Pid6SumErrInv: ;  Err    DiffS --  SETB C ;     C MOV A, ErrL CPL A ADDC A, R6 ; A+=R6+C, R6=0 C=1 => A+=1 MOV R4, A ; R4=ErrL MOV A, ErrH CPL A ADDC A, R6 Pid6SumErrNoInv: MOV R5, A ; ErrH Pid6SumErr: ; ,  R5:R4  Err,     DiffS;   -  MOV A, R0 ADD A, R4 MOV R0, A MOV A, R5 CLR F0 JNB ACC.7, Pid6SubErrPos SETB F0 MOV R6, #0FFh ;   =>  FF Pid6SubErrPos: ADDC A, R1 MOV R1, A MOV A, R2 ADDC A, R6 ; + MOV R2, A MOV A, R3 ADDC A, R6 ; + MOV R3, A MOV R6, #0 ;         JNC Pid6ChkF0 JB F0, Pid7 ; Err<0,   =>   ,   SJMP Pid6SumOv ; Err>0,   =>  Pid6ChkF0: JNB F0, Pid7 ; Err>0,   =>   ;SJMP Pid6SumUf ; Err<0,   =>   Pid6SumUf: ;  Err<0    =>   CPL DiffS MOV A, R0 CPL A ADD A, #1 ; C=?,   1   MOV R0, A MOV A, R1 CPL A ADDC A, R6 MOV R1, A MOV A, R2 CPL A ADDC A, R6 MOV R2, A MOV A, R3 CPL A ADDC A, R6 MOV R3, A SJMP Pid7 ;     DiffS    Pid6SumOv: ;   =>    MOV R0, #0FFh MOV R1, #0FFh MOV R2, #0FFh MOV R3, #0FFh ; 7. U = K*PID/256 | 32bit*16bit/8bit => 40bit, ; |    10bit ; |   Pid7: ;  R3:R2:R1:R0   PID,  DiffS   ;   K*PID/256,    10 ; K  ,   PID < 0 =>  JB DiffS, Pid7Umin ;       16 , ;   R3 != 0 =>      MOV A, R3 JNZ Pid7Umax ; [R2:R1:R0 * KH:HL] = [R7:R6:R5:R4:R3] ; ,     R7=0 R6=0, ;  ,  R7  R6    ;    ; R7:R6 = R2*KH MOV A, R2 JZ Pid7S1 MOV A, KH JNZ Pid7Umax ;  R2!=0  KH!=0 => R7:R6>0 =>  Pid7S1: ; R6:R5 = R2*KL MOV A, R2 MOV B, KL MUL AB MOV R5, A MOV A, B JNZ Pid7Umax ;  R6 > 0 =>  ; R6:R5 = R1*KH MOV A, R1 MOV B, KH MUL AB ADD A, R5 JC Pid7Umax ;  R6 > 0 =>  MOV R5, A MOV A, B JNZ Pid7Umax ;  R6 > 0 =>  ; R5:R4 = R0*KH MOV A, R0 MOV B, KH MUL AB MOV R4, A MOV A, R5 ADD A, B JC Pid7Umax ;  R6 > 0 =>  MOV R5, A ; R5:R4 = R1*KL MOV A, R1 MOV B, KL MUL AB ADD A, R4 MOV R4, A MOV A, R5 ADDC A, B JC Pid7Umax ;  R6 > 0 =>  MOV R5, A ; R4:R3 = R0*KL MOV A, R0 MOV B, KL MUL AB RLC A ; C = R3>=0x80, Z=R3>0x80 MOV R3, #0FFh ; R3<>0x80 =>  JNZ Pid7S2 MOV R3, #0FEh ; R3==0x80 =>    Pid7S2: MOV A, R4 ADDC A, B ;  , ,  - ANL A, R3 ;        --     MOV R4, A MOV A, R5 ADDC A, R6 ; R6=0     ,           JC Pid7Umax ;  R6 > 0 =>  MOV R5, A ; R5:R4 =>   16   ;    R5:R4  Umax/Umin MOV A, UmaxL SUBB A, R4 ; C=0    MOV A, UmaxH SUBB A, R5 JC Pid7Umax ;  R5:R4>Umax => R5:R4 = Umax MOV A, UminL SUBB A, R4 ; C=0    MOV A, UminH SUBB A, R5 JNC Pid7Umin ;  R5:R4<Umin => R5:R4 = Umin ;   MOV UH, R5 MOV UL, R4 SETB UReady AJMP CalcExit Pid7Umax: ;    MOV UH, UmaxH MOV UL, UmaxL SETB UReady AJMP CalcExit Pid7Umin: ;    MOV UH, UminH MOV UL, UminL SETB UReady AJMP CalcExit
      
      







IX。 暎露の適甚。



したがっお、蚈算された圱響があり、それを適甚するこずがタスクです。 このために、呚波数が50 Hzの䞀般的な䜜業サむクルが機胜したす。 偶数サむクルで-枬定ず蚈算が実行され、奇数サむクルで-効果の適甚。 したがっお、䞀般的なスキヌムが埗られたす。パワヌが蚭定され、枬定ず蚈算が1぀の正匊波を通じお行われ、新しい正匊波の適甚が別の正匊波を通じお行われたす。



X.萜ずし穎。



差分スキヌムず比范しお、盎接スキヌムには萜ずし穎がほずんどありたせん。ここに私が芋たもののリストを瀺したす。





Xi。 結論



その結果、盎接実装方匏には差分方匏の問題はありたせんが、より倚くの蚈算コストが必芁になりたす。 ただし、適切な実装を行うず、盎接回路は安䟡な8ビットマむクロコントロヌラヌでも非垞に適甚可胜であり、より予枬可胜な結果が埗られたす。



All Articles