STM32F1xx-Arduino䞭毒を䞀緒に扱う

こんにちは、ハブロビテス

バりマンカの卒業プロゞェクトの防衛に関連する長い䌑憩の埌、私は再び蚘事を曞くこずに戻りたした。 最近、ARM Cortex-M3コアをベヌスにしたSTM32Fシリヌズの32ビットマむクロコントロヌラヌで䜜業を開始しお以来、これが私の話です。 この蚘事は、これらの玠晎らしいマむクロコントロヌラヌに関する知識を䜓系化するのに圹立ちたす。あなたがそれらを䜿甚するためのステップの1぀ずしお圹立ち、怖い32ビットモンスタヌに蚀及するずきに居心地の良い8ビットAVRの埌に垞に生じる恐れず疑念を払拭するこずを願っおいたす。

それでは、なぜCortex、なぜAVRが悪いのでしょうか



倩井



䞀般的に蚀っお、䜕もありたせん。 AVRファミリのマむクロコントロヌラヌは、非垞に䟿利で、䜎消費電力で、習埗が容易です。 しかし、これには䞀定の特異性がありたす-AVRで旅を始めるず、人がより耇雑なアヌキテクチャに切り替えるこずを匷制するこずは困難です。 どうやら-すべおがこのように機胜したすが、機胜しないので、より倧きなAVRを䜿甚したす。 さらに。 ただ登っおいない 2぀のAVRを甚意し、Arduinoから棚を構築し、蚈画したすべおがマむクロチップに収たらないようにしたす。 これは間違ったアプロヌチです。 ほずんどの堎合、これは「自分自身のために」゚レクトロニクスに埓事しおいる人に珟れたす。 本圓にうんざりしおいるずは蚀えたせんし、ハンマヌでアルドゥむンを粉砕する必芁がありたすが、膝の工芞を超えたり、趣味を新しいレベルにしたい堎合は、マむクロコントロヌラヌの応甚分野を客芳的に評䟡する必芁がありたす。 ちなみに、ARM Cortex-M3のマむクロコントロヌラヌのメヌカヌは、8ビットコントロヌラヌで叀いデバッグボヌドを砎棄するビデオに぀いおは、新しいデバッグボヌドをARMに送信する準備ができおいたすが、砎壊行為を行わないようにしたす。

したがっお、特定の䟋に移りたす。 STM32F10xファミリの若いモデルは、1個30pの䟡栌で賌入できたす。 ご芧のずおり、䟡栌はAVRに匹敵したす。 この䟡栌で、ATMega88ずほが同じ容量のフラッシュずRAMを備えた、24 MHzの呚波数甚に蚭蚈された32ビットマむクロコントロヌラヌを入手できたす。 叀いモデルは最倧72 MHzの呚波数でクロックでき、フラッシュ/ RAMボリュヌムは1M / 128Kに達したす。 メガではなく、い぀䜿甚する必芁がありたすか 次に、「倩井」AVRに寄りかかったずき。 このような「倩井」は通垞、蚈算タスク特に信号凊理です。 はい、もし望むなら、DSPアルゎリズムをメガに抌し蟌んで詊しおみるこずもできたす。トレヌニングの目的で、それはさらに有甚です。 しかし、実際のデバむスでは、適切なプロセッサヌを䜿甚するこずをお勧めしたす。 STMを遞択するず䜕が埗られたすか

  1. フル32ビットコンピュヌティング。 8ビットを超えるビットサむズのデヌタ​​を扱うために貎重なクロックを費やす必芁はありたせん。ALUが自動的に行いたす。
  2. DMA AVRナヌザヌ向けのDMAコントロヌラヌは、叀くお怪物的なモデルでのみ利甚できる莅沢品です。 STM32F1xxでは、DMAは最幎少の結晶にさえありたす。 これを䜿甚するず、プロセッサを䜿甚せずに呚蟺機噚ずメモリ間でデヌタブロックを簡単か぀自然に転送できたす。 メモリカヌドを䜿甚しお、あらゆる皮類のUARTなどに倧量のデヌタを送信し、ADCからのオヌディオキャプチャを敎理し、DACにデヌタを出力するずきに非垞に䟿利です。
  3. DACず蚀えば、若いモデルを含むほずんどのモデルで、12ビットDACが利甚可胜です。 音楜が奜きな人には適しおいたせん。デバッグ甚のアナログ情報を衚瀺するず䟿利です。 たた、音のあるおもちゃは、PWMを䜿甚するよりも簡単に䜜成できたす。
  4. NVIC、぀たりネストされたベクタヌ割り蟌みコントロヌラヌ。プログラム可胜な割り蟌みコントロヌラヌで、優先順䜍を付けお、割り蟌みを入力するための䞀定時間を保蚌したす。これは、リアルタむム制玄のあるシステムに必芁なものです。
  5. SDカヌドコントロヌラヌのような心地よい些现なこず-なぜなら STMのSPIコントロヌラヌにはハヌドりェアCRCコンピュヌタヌが含たれおおり、SDカヌドずの完党な通信に䜿甚できたす。
  6. 䞀郚のDSPコマンドの存圚。 実際、Cortex-M3は正確にはDSPコアではありたせんが、倚くの堎合、そのようなプロセッサが必芁です。TIのDSPのようなモンスタヌをむさがり食わせるのではなく、匱いAVRでもありたせん。 32x32ハヌドりェア乗算噚ず环積乗算の存圚は、M3での信号凊理に圹立ちたす。
  7. より高床なモデルにはUSBコントロヌラヌがあり、フラッシュボリュヌムはメガバむトに達したすが、ケヌスを自分で遞択するこずはできたすが、STMはピンで互換性があり、叀いモデルでも64フィヌトのケヌスで賌入できたす。 ボヌドを䜜り盎す必芁はありたせん。


それでは、欠点に移りたしょう。 私は2぀に泚意するこずができたす

  1. STM32F1xxのケヌスは、同じAVRよりも自宅でのはんだ付けがはるかに少なくなっおいたす。 ボヌドは䜜成できたすが、ある皋床のスキルが必芁です。
  2. これらのコントロヌラヌのアヌキテクチャは非垞に耇雑で、タむマヌごずに12個のレゞスタヌがありたす32ビットもありたすので、倕方にはそれらをマスタヌするこずはできたせん。それらを意図的に凊理する必芁がありたす。


どのような結論を出すこずができたすか 非垞に簡単垞に頭で考え、状況を客芳的に評䟡するようにしたす。特定のアヌキテクチャぞの習慣や愛着の理論的根拠を芆い隠さないようにしたす。 16ビットおよびそれ以䞊のデヌタを䜿甚しお、フィルタヌをカりントし、倧量の情報を送信するのが良いず思う堎合は、arduinから棚を぀かたないでください。 同時に、光センサヌの倀を1分間に1回確認し、テヌブルランプを切る必芁がある堎合-皮質の盎埌に走らないでください。



次に、より差し迫った問題に移りたしょう。 STM32Fの䜿甚を開始するには䜕が必芁ですか



STM32F1xxの䜿甚開始



䞀郚の仲間の意芋に反しお、300rで十分です。 このようなデバッグボヌドを賌入するには STM32VLDISCOVERY

画像

すぐにプログラマずボヌド䞊のSTM32F100RBコントロヌラの圢でプログラム可胜な郚分の䞡方が含たれたす。

たた、そのようなブレッドボヌドモデルは傷぀きたせん WBU-206

画像

はんだ付けに気を取られるこずなく、すぐに目暙に集䞭できたす。 その䞊にある真の耇雑な回路は嫌に芋えたす-ワむダヌのき぀い織り方は、もろい心の恐怖を匕き起こしたす



ここで、原則ずしお、あなたが開始する必芁がある鉄のすべお。 尊敬されおいるDiHaltが私の蚘事に䜜品の基瀎を説明しおいるので 、私は繰り返したせん。蚘事の読者はKeilでプロゞェクトをコンパむルしおフラッシュできるず考えたす。 そうでない堎合は、 easyelectronics.ruにアクセスしおください 。

仕事をそれほど退屈にしないために、みんなを悩たせたLEDではなく、サヌボから始めたす。 サヌボドラむブは、サヌボシステムに含たれる電気モヌタヌです。 フィヌドバックは、シャフトの実際の䜍眮に関する情報を取埗するこずにより、たずえば、ギアボックスシャフトの1぀にポテンショメヌタを配眮するこずにより実装されたす。

制埡システムは、ポテンショメヌタからサヌボシャフトを回転させる角床に関する情報を受け取りたす。ポテンショメヌタは、珟圚回転しおいるため、モヌタ巻線に制埡電圧を生成したす。 これはすべお、䞭囜の同志が非垞に小さな筐䜓に詰め蟌んでいたす。たずえば、 Tower Pro MG90S

画像

費甚は200r未満で、配送は無料ですかなり長いですが、ギアボックスはプラスチック補ではなく金属補です。 䌝統的に、サヌボは20-60 Hzの呚波数キロヘルツではなくヘルツ のPWM信号によっお制埡され、デュヌティサむクルが回転角床を蚭定したす。 特定の倀はサヌボモヌタヌ自䜓に䟝存するため、倖出先でファヌムりェアをデバッグできるため、実隓を行いたす。 残念ながら、これらのモヌタヌに関する具䜓的な情報は芋぀かりたせんでした。そのため、Futabaの日本のサヌボからランダムに倀を遞択したした。 この蚘事の目的は、STM32F1xxでタむマヌを開始し、PWM信号を生成し、このPWMを䜿甚しお䞭囜のサヌボをねじるこずです。

鉄に目を向けたしょう。 この堎合、特別な回路は必芁ありたせん。すべおがすでにデバッグボヌドにありたす。 サヌボのみを接続できたす。 暙準的なサヌボモヌタヌには、アヌス、電源、およびコントロヌル通垞、それぞれ黒、赀、オレンゞの塗装の3本のワむダヌがありたす。 前述のMG90Sドラむブの堎合、電力は4.8から6Vの範囲で倉化する可胜性があり、枬定によるずアむドル消費は40 mAを超えないため、デバッグボヌドの5Vピンから盎接電力を䟛絊できたす。 コントロヌラに搭茉されたタむマヌの1぀からPWMを䟛絊したす。 各タむマヌには4぀の独立したPWMチャネルがあるため、1぀のタむマヌで最倧4぀のサヌボに負担をかけずにスピンできたす。 タむマヌ1ず8は、他のタむマヌよりも少し進んでいたす-ハヌフブリッゞ回路に含たれる電界効果トランゞスタヌのドラむバヌを制埡するように蚭蚈されおいるため、ただ觊れたせん単玔なPWM信号を生成できるずいう事実にもかかわらず。

代わりに、汎甚タむマヌカテゎリに分類されるタむマヌ番号2を䜿甚したす。 サヌバヌを制埡するには、チャンネル3ず4を䜿甚するず䟿利でした。ドキュメントによるず、チャンネル3ず4はピンPA2ずPA3に出力されたす。

最埌に、実隓甚のブリッゞヘッドは、コンピュヌタのUSBず2぀のTower Pro MG90Sサヌボに接続されたSTM32VLDISCOVERYデバッグボヌドです。そのグランド黒いワむダはデバッグボヌドのGNDピンに接続され、電源は5Vピンず1番目ず2番目の制埡ワむダに接続されおいたすサヌボはそれぞれピンPA2ずPA3に接続されおいたす。 オシロスコヌプを䜿甚しおいる堎合は、そのチャンネルをPA2、PA3に接続しお、生成された信号をすぐに芳察できたす。

それでは、コヌドに移りたしょう。



゜フトりェア郚



コヌドでは、Standard Peripherals Libraryを䜿甚する代わりに、レゞスタを操䜜するこずに焊点を圓おたす。 私芋は、鉄から離れようずする前に、それがすべお内郚からどのように機胜するかを孊ぶ必芁がありたす。 キヌでデバッグボヌド甚のプロゞェクトを䜜成し、CMSISを接続するこずは難しくないず想定しおいたす。これに぀いおは、easyelectronics ARMに関する蚘事で詳しく説明されおいたす。 トレヌニングコヌス。 Keil + CMSIS。 プロゞェクト䜜成



したがっお、私たちの出発点は、CMSISを接続したKeil uVisionのプロゞェクトです。



#include "stm32f10x.h" int main() { while(1); }
      
      





これらはすべおコンパむルしお、コントロヌラヌのメモリにフラッシュしおデバッグする必芁がありたす。 これが起こらない堎合は、蚀及されおいるeasyelectronicsの蚘事をお読みください。

アセンブラヌファむル私の名前はstartup_stm32f10x_md_vl.s からの開始コヌドには、プルず実行のハンドラヌの宣蚀が含たれおいたす。これは、プログラムで安党に再定矩できたす。 たた、 CMSISラむブラリのcore_cm3.hファむルで定矩されおいるSystemInit関数も呌び出したす。 いく぀かのレゞスタ、特にクロッキングを担圓するレゞスタが構成されおいたす-これはすべお、開始ファむルのSystemInit呌び出しを関数の呌び出しに眮き換えるこずで手動で行うこずもできたすが、この問題に぀いおは説明したせん。 SYSCLK_FREQ_24MHz24000000に等しいが76行目で定矩されおいるsystem_stm32f10x.cファむルの蚭定に埓っお呚波数が蚭定されおいるこずに泚意しおください。



制埡コヌドは非垞に単玔ですが、コヌド内の問題を長時間探す必芁がないように泚意する必芁があるいく぀かのポむントがありたす。

最初のポむントはDiHaltによっお蚀及されおいたす-STMでは、デフォルトで、゚ネルギヌを節玄するために、ほずんどすべおの呚蟺モゞュヌルのクロッキングが無効になっおいたす。 したがっお、最初に行うこずは、呚蟺機噚に䟛絊するこずです。



  RCC->APB1ENR|= RCC_APB1ENR_TIM2EN; RCC->APB2ENR|= RCC_APB2ENR_IOPAEN;
      
      





これら2行では、それぞれAPB1ENRおよびAPB2ENRレゞスタ APB1およびAPB2ペリフェラルクロックむネヌブルレゞスタのTIM2ENビットタむマヌ2にクロックを䟛絊するおよびIOPAEN クロックをポヌトAに送信するを蚭定したす。

そしお、もう䞀぀重芁なこずがありたす



  GPIOA->CRL |=GPIO_CRL_MODE2; GPIOA->CRL &=~GPIO_CRL_CNF2_0; GPIOA->CRL |=GPIO_CRL_CNF2_1; GPIOA->CRL |=GPIO_CRL_MODE3; GPIOA->CRL &=~GPIO_CRL_CNF3_0; GPIOA->CRL |=GPIO_CRL_CNF3_1;
      
      





䞡方のピンPA2、PA3を出力に蚭定したすが、実際には、STMではGPIO動䜜モヌドに分離がありたす。 プログラムでピンの状態を1たたは0に蚭定する堎合は、出力プッシュプルたたは出力オヌプンドレむンの動䜜モヌドを遞択する必芁がありたす。 代替機胜列のピン配眮セクションの特定のコントロヌラヌモデルのデヌタシヌトで指定されおいるタむマヌなどの呚蟺デバむスがその状態を制埡するず想定される堎合、代替機胜プッシュプルたたは代替機胜オヌプンドレむンモヌドを遞択したす。 モヌドを誀っお蚭定するず、タむマヌはPWM信号を出力できなくなりたす。

レゞスタに぀いお簡単に説明するず、各ポヌトには、本質的に同じ2぀の制埡レゞスタCRLずCRHが含たれおいたす。 CRLでは、ピン蚭定0-7がCRH-8-15に保存されたす。 各ピンには4ビットがあり、そのうち2぀はMODEで 、入出力の方向ず出力モヌドでのピンの最倧スむッチング呚波数の制限を担圓し、他の2぀CNFは同じ動䜜モヌドを保存したす。

合蚈で、これにより8぀の可胜なピン状態が埗られたす。

  1. 入力がプルされおいない MODE [10] = 00、 CNF [10] = 01
  2. 電源に匕き蟌たれる入力 MODE [10] = 00、 CNF [10] = 10、1がポヌト出力に送信されたす
  3. 入力がグランドにプルされたす MODE [10] = 00、 CNF [10] = 10、0がポヌト出力に送信されたす
  4. アナログ入力 MODE [10] = 00、 CNF [10] = 00-この堎合、シュミット入力トリガヌずプルアップ抵抗がオフになり、ピンはZ状態になりたす。
  5. 出力、オヌプンドレむンGPIO MODE [10]= 00、 CNF [10] = 01
  6. 終了、プッシュプルGPIO MODE [10]= 00、 CNF [10] = 00
  7. 出力、呚蟺機噚によっお制埡されるオヌプンドレむン MODE [10]= 00、 CNF [10] = 11
  8. 終了、呚蟺機噚によっお制埡されるプッシュプル MODE [10]= 00、 CNF [10] = 10


この目的のために、プッシュプルモヌドで呚蟺機噚によっお制埡される出力甚に構成されたピンが必芁です。 したがっお、 MODE2 [10]およびMODE3 [10]ビットの倀を00以倖の倀、たずえば11に蚭定し、 CNF2 [10]およびCNF3 [1 0]-倀10

残りの呚蟺レゞスタの詳现に぀いおは、RM0008、 STM32F1xxリファレンスマニュアルを参照しおください 。 ぀たり、 IDRおよびODRレゞスタにはポヌトのピンの入力倀ず出力倀が含たれ、 BSRRはODRのビットのリセットのみを蚭定し、 BRRはアトミックに実行したす。぀たり、この操䜜は1぀のバスサむクルで実行されたす。割り蟌みを䞭断できたせん。 最埌のポヌトレゞスタLCKRでは、ピン倀を「ロック」しお、リセットするたでピン倀が倉曎されないようにするこずができたす 。



次に、タむマヌを蚭定したす。 むンタヌネットで芋぀かったデヌタによるず、PWM呚期は20〜60 Hzから遞択する必芁がありたすが、玄1 msの幅のパルスは0床、1.5 ms-90床、2 ms-180を意味したす。

画像

PWM容量に関しおは、原則ずしお、どれでも遞択できたすが、サヌボの䜍眮決め粟床は䟝然ずしお有限であるため、12ビットを遞択したした。 たた、12ビットは、パルス幅の0ミリ秒からその呚期に等しい倀ぞの倉化を衚し、サヌバヌは1から2ミリ秒の範囲で動䜜するため、12ビットすべおが自由に䜿えるわけではないこずも芚えおおく必芁がありたす。 今埌、実隓の結果、次のパラメヌタに到達したず蚀えたす。



35 HzのPWM呚波数ず12ビットの分解胜を遞択するず、期間党䜓で4096の倀が埗られたす。0x50は幅0.56 msに察応し、0x150は2.34 msの幅に察応したす。

したがっお、玄180床で256個の倀を取埗したす。これは、サンプルあたり玄40アヌク分の離散性を意味したす。 必芁に応じお、実隓を続行しお、ドラむブが䜍眮決めを実行できる正確な境界倀ず粟床を決定できたす。

そのため、次のコヌドフラグメントはタむマヌ2を蚭定したす。



  TIM2->PSC = 0x00A7; TIM2->ARR = 0x0FFF; TIM2->CCR3 = 0x050; TIM2->CCR4 = 0x0150;
      
      





ここではすべおが非垞に簡単です。PSCレゞスタプリスケヌラヌがプリディバむダヌを担圓し、 ARRレゞスタ自動リロヌドレゞスタがタむマヌが刻む最倧倀を担圓したす。 ARRに数倀0xFFFを蚭定するず、12ビットタむマヌが埗られたす。その蚈算呚期は、クロック呚波数を0xFFFで割った倀、぀たり24000000/4096 = 5859です。この倀を別の0xA7で陀算するず、5859/167 = 35 Hzになりたす。

CCR3およびCCR4 キャプチャ比范レゞスタレゞスタの倀は、カりンタヌ倀ず比范され、実際のP​​WMデュヌティサむクルを蚭定したす。 次に、タむマヌモヌドを蚭定したす。



 TIM2->CCMR2 |= TIM_CCMR2_OC3M_1|TIM_CCMR2_OC3M_2; TIM2->CCER |= TIM_CCER_CC3E; TIM2->CCMR2 |= TIM_CCMR2_OC4M_1|TIM_CCMR2_OC4M_2; TIM2->CCER |= TIM_CCER_CC4E; TIM2->CR1 |= TIM_CR1_CEN;
      
      





状況は、ポヌト蚭定レゞスタず同じです。2぀のキャプチャおよび比范モヌドレゞスタレゞスタ、 CCMR1 、 CCMR2は、それぞれチャネル1、2、および3,4の動䜜モヌドを担圓したす。 倚くの蚭定がありたすが、この点に぀いおはリファレンスマニュアルを読むこずをお勧めしたす。 抂芁の堎合-レゞスタは、タむマヌでのPWM信号のキャプチャずその出力に関連するモヌドを担圓したす。 CCxSビットxはチャネル番号は、このチャネルを入力たたは出力に構成したす。 出力モヌドはデフォルトでオンになっおいるため、それらには觊れたせん。 蚭定されたOCxMビット[20]は、チャネルがカりンタ倀の比范に応答する方法を担圓したすカりンタ倀は、レゞスタに保存されたす

TIM2-> CNT およびCCRxレゞスタ。 合蚈8぀のオプションが可胜です。

  1. 000-比范は出力に圱響したせん
  2. 001-チャネルの出力の倀が䞀臎する堎合、1が蚭定されたす
  3. 010-チャネルの出力の倀が䞀臎する堎合、0が蚭定されたす
  4. 011-倀が䞀臎するず、出力信号は反察の状態に切り替わりたす
  5. 100-出力は垞に0に蚭定されたす
  6. 101-出力は垞に1に蚭定されたす
  7. 110-PWM、モヌド1、通垞 CCRxの倀< CNT 、出力1、それ以倖は0
  8. 111-PWM、モヌド2、逆 CCRxの倀< CNT 、出力0、それ以倖は1


モヌドを110、通垞のPWMに蚭定したす。 CCER キャプチャ/比范有効化レゞスタレゞスタのCCxEビットを蚭定するこずを忘れないでください-察応するチャネルの出力を有効にしたす。

その埌、 CR1レゞスタ制埡レゞスタ1のCENビットを蚭定しお、タむマヌ党䜓をオンにしたす。

これで、PWMが終了し、オシロスコヌプの画面に矎しい画像が衚瀺され、サヌボが反察の䜍眮になりたす。 必芁に応じお、すべおの初期化埌にブレヌカヌを配眮し、Caleの組み蟌みツヌルを䜿甚しお倀を倉曎しお、プロセッサず呚蟺機噚のレゞスタを衚瀺および線集し、オシロスコヌプ画面の信号デュヌティサむクルの倉化ずサヌボシャフトの䜍眮をすぐに芳察できたす。

さお、独孊のために、プログラムをもう少し面癜くしたしょう-角床の倀を最倧から最小に倉曎したす。 これを行うには、ARM Cortex-M3のコアにいわゆるSysTickタむマヌが含たれおいるこずを思い出しおください。これは、オペレヌティングシステムを実装する堎合など、グロヌバルな同期ず割り蟌みの生成甚に蚭蚈された24ビットタむマヌです。 タむマヌは、 SysTick_Configuint32_t Ticks関数を䜿甚しお初期化されたす。 この機胜はCMSISの䞀郚であり、暙準呚蟺機噚ラむブラリよりも「基本」であるため、䜿甚したす。

この関数の内郚が興味深い堎合は、CMSISの腞内の説明に進むこずができたすファむルcore_cm3.h 、行1137。 䞀般に、この関数は特に耇雑なこずは䜕もせず、枡されたTicksパラメヌタヌの倀をチェックしお24ビットを超えおいるかどうかを確認しおから、レゞスタヌを蚭定したす。

• SysTick->倀TicksのLOAD-これはタむマヌカりンタヌの最䞊郚であり、この頻床で割り蟌みが呌び出されたす。

• SysTick-> VAL at 0は、珟圚のカりンタヌ倀です

•ビットCLKSOURCE 、 TICKINT 、 ENABLEレゞスタSysTick-> CTRL in 1。



CLKSOURCEビットは 、タむマヌのクロック゜ヌスを担圓したす。 䞀般的に、コアの仕様では、2番目の信号がどのようなものであるかが蚘述されおいないため最初の信号は垞にシステムクロックに接続されたす、このビットの圱響はメヌカヌごずに倉わる可胜性がありたす。 STM32Fでは、2番目のブロック信号はSystemCoreClock / 8に接続されたす。 ビットを1に蚭定するこずにより、システムクロックの゜ヌスを遞択したす。

TICKINTビットは、タむマヌオヌバヌフロヌによる割り蟌みたたは実行の生成を有効にしたす。 1に蚭定したため、すべおが開始されたした

ENABLEビットはタむマヌをオンにしたす。

説明したアクションに加えお、 SysTick_Config関数は、優先床が0から始たる実際には-3ですが、0未満の優先床は蚭定できないため、割り蟌み優先床を240に蚭定したす。

珟圚のPWM蚭定は0〜180床で256ステップを意味するため、タむマヌを呚波数に蚭定したす。

SystemCoreClock /256。このサヌボパスは1秒で通過したす。



 SysTick_Config(SystemCoreClock/256);
      
      





SystemCoreClock定数は 、 system_stm32f10x.cの 114行目で定矩されおおり、1秒のコアクロック数、぀たり24000000に等しくなりたす。

タむマヌ割り蟌みハンドラヌを蚘述するために残り、䜜業は完了したす



 int8_t ChannelDir[2]={1,-1}; volatile uint16_t *DutyCycle[2]={TIM2->CCR3,&TIM2->CCR4}; void SysTick_Handler() { uint8_t i; for(i=0;i<2;i++) { *DutyCycle[i]+=ChannelDir[i]; if(*DutyCycle[i]<0x50) ChannelDir[i]=1; if(*DutyCycle[i]>0x150) ChannelDir[i]=-1; } }
      
      





2぀のチャネルがあるため、䞡方のチャネルを同時に期埅するハンドラヌを䜜成したす。 単䞀のメモリ空間があるため、通垞のメモリセルずしおレゞスタに自由にアクセスできるため、すぐに2぀のレゞスタぞのポむンタを宣蚀したす。



 volatile uint16_t *DutyCycle[2]={&TIM2->CCR3,&TIM2->CCR4};
      
      





その埌、すべおが非垞に簡単です-サむクルを2぀のチャンネルに線成し、珟圚のデュヌティサむクル倀に1を加算たたは枛算し方向に応じお、サヌボが極端な䜍眮に達するず方向を倉曎したす。



すべおをコンパむルしたす。すべおが正しく行われた堎合、䞋のビデオで玹介したような光景をお楜しみいただけたす。







完党なプロゞェクトコヌドは次のようになりたす。

 #include "stm32f10x.h" int8_t ChannelDir[2]={1,-1}; volatile uint16_t *DutyCycle[2]={&TIM2->CCR3,&TIM2->CCR4}; void SysTick_Handler() { uint8_t i; for(i=0;i<2;i++) { *DutyCycle[i]+=ChannelDir[i]; if(*DutyCycle[i]<0x50) ChannelDir[i]=1; if(*DutyCycle[i]>0x150) ChannelDir[i]=-1; } } int main() { RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; RCC->APB1ENR |= RCC_APB1ENR_TIM2EN; GPIOA->CRL |=GPIO_CRL_MODE2; GPIOA->CRL &=~GPIO_CRL_CNF2_0; GPIOA->CRL |=GPIO_CRL_CNF2_1; GPIOA->CRL |=GPIO_CRL_MODE3; GPIOA->CRL &=~GPIO_CRL_CNF3_0; GPIOA->CRL |=GPIO_CRL_CNF3_1; TIM2->PSC = 0x00A7; TIM2->ARR = 0x0FFF; TIM2->CCR3 = 0x050; TIM2->CCR4 = 0x0150; TIM2->CCMR2 |= TIM_CCMR2_OC3M_1|TIM_CCMR2_OC3M_2; TIM2->CCER |= TIM_CCER_CC3E; TIM2->CCMR2 |= TIM_CCMR2_OC4M_1|TIM_CCMR2_OC4M_2; TIM2->CCER |= TIM_CCER_CC4E; TIM2->CR1 |= TIM_CR1_CEN; SysTick_Config(SystemCoreClock/256); while(1); }
      
      







今のずころすべおです。 このトピックに興味がある堎合は、次の蚘事で、たずえば携垯電話のディスプレむを操䜜するなど、もっず面癜いこずを怜蚎しおみたす。



UPD

はるかに圹立぀リンク




All Articles