製作モジュール一覧

2021年1月30日土曜日

ロードバイクを購入しました Carrera ER-01

Carrera ER01というカーボンロードを購入しました。ERはエンデュランス・レーシングの略らしいです。フレームとコンポ以外はお店への納品ごとにちょこちょこ変わるそうです。

ロードバイク初心者なので、フラットペダルで、両足がつくぐらいのセッティングです。慣らしサイクリングしましたが、さすがにサドルが低すぎました。

納車時

フレーム



コンポ Shimano 105




サドル Cinelli製


ペダル MKS CT-LITE


ライト

ライトはLezyneの前後セット品にしました。




初サイクリング時



2021年1月29日金曜日

STM32CubeIDE: General-purpose Timerを使う

STM32F446REには汎用的なGeneral-purpose Timerが8個搭載されています。PWM、入力キャプチャ、出力コンペアなど機能がいろいろありますが、Basic Timerと同じように単に割り込みを発生させるタイマーとして使ってみます。

General-purpose Timerの諸機能については
  • STM32シリーズ タイマ概要 AN4013
  • トランジスタ技術 2020年 3月号 別冊付録1 STM32F Armマイコン・プログラミング・ガイドブック
が参考になると思います。

STM32CubeIDE: Version 1.5.1
Target board: Nucleo-F446RE

MXの設定

Timers
  Mode
    Clock Source: Internal Clock
  Configuration
    Parameter Settings
      Counter Settings
        Prescaler: 8400-1
        Counter Period: 1000-1
    NVIC Settings
        TIM global interrupt: Enabled: ✓

Clock Sourceでクロック源に内蔵クロックを割り当てます。

Prescalerに8400、Counter Periodに1000を設定します(STM32Fの仕様上-1する)。BoardにNucleo-F446REを指定して初期化するとクロックは84MHzに設定されるので84MHz / (8400 * 1000) = 10Hzとなり、100msごとにタイマ割り込みが発生します。

NVIC SettingsでTIM2の割り込みを有効化します。

main.cにコードを追加


  /* USER CODE BEGIN 2 */
  HAL_TIM_Base_Start_IT(&htim2);
  /* USER CODE END 2 */

/* USER CODE BEGIN 4 */
void HAL_TIM_PeriodElapsedCallback (TIM_HandleTypeDef * htim)
{
	if (htim == &htim2) {
		HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin);
	}
}
/* USER CODE END 4 */

General Purpose Timerをタイマ割り込みで使う場合、前回のBasic Timerと異なるのはClock Sourceを設定する必要がある点だけです。

LD2の出力波形


実行するとボード上のLED(LD2)が200ms(High:100ms+Low:100ms)周期で点滅します。

オシロで観測
 

2021年1月26日火曜日

STM32CubeIDE: Basic Timerを使う

STM32F446REには
  • Advanced-control Timer
  • General purpose Timer
  • Basic Timer
の3種類のTimerが搭載されています。この中でBasic Timerが最も機能が少なく設定も簡単です。

STM32F446REのBasic TimerはTIM6、TIM7の2つです。Basic Timer主に内蔵DACトリガーと波形生成に使われます。もし内蔵DACを使う場合はTIM6、TIM7は使わないほうが無難だと思います。

TIM6の割り込みでLチカを駆動する


メインループ内でHAL_Delay()を使ってLチカさせるのではなく、Timer割り込みでLチカします。タイミングが正確になり、メインループではLチカを気にすることなく他の仕事に専念できます。

STM32CubeIDE: Version 1.5.1
Target board: Nucleo-F446RE

MXの設定


Timers
  TIM6
    Configuration
      Prameter Settings
        Counter Settings
          Prescaler(PSC - 16 bits value): 42000-1
          Counter Period(AutoReload Register -16 bits value): 1000-1
     
    NVIC Settings
      NVIC Interruput Table
        TIM6 global interruput and DAC1, DAC2 underrun error interrupts: ✓

Nucleo-F446REを指定して初期化するとデフォルトではクロック(APB1/APB2 Timer Clocks)は84MHzになります。Prescalarに42000を設定すると2kHzになり、Counter Periodが1000なので2Hz→0.5sの周期で割り込みがかかります。

PrescalerとCounter Periodは-1した値を設定する必要があるそうです。

参考: トランジスタ技術 2020年3月号 別冊付録1 P38

TIM6のCounter Settingsにはauto-reload preloadという項目がありますが、これはCounter Periodを動的に設定した際に、値を反映させるタイミングを設定するもののようです。

参考: RM039: 19.3.2 Basic timers - Counting Mode

割り込みを使用する際にはNVICで割り込みを有効にする必要があります。結構忘れがちですw

main.cにコードを追加


  /* USER CODE BEGIN 2 */
  HAL_TIM_Base_Start_IT(&htim6);
  /* USER CODE END 2 */

HAL_TIM_Base_Start_IT()でタイマーを開始し、割り込みを有効にします。

/* USER CODE BEGIN 4 */
void HAL_TIM_PeriodElapsedCallback (TIM_HandleTypeDef * htim)
{
	if (htim == &htim6) {
		HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin);
	}
}
/* USER CODE END 4 */

HAL_TIM_PeriodElapsedCallback()で割り込みハンドラを記述します。LD2の出力をトグルします。

これでボード上のLED2が1秒間隔で点滅します。

オシロで波形を観測