STM32L010 TIMの使い方(PWM DMA)


TIM2を使用し50Hz正弦波のPWM変調を作成します。

1. パラメータの算出

1周期400サンプリングで50Hz正弦波を作成してみます。
  PWMの周期 = 50Hz x 400 = 20KHz
となります。
また、分解能を400とすると、TIM2へのクロックは
  Clock = 20KHz x 400 = 8MHz
となります。
よって、
  Proscaler = 32 / 8 - 1 = 3
  Counter Period = 400 - 1 = 399
となります。
正弦波データは以下の式で求められます。
  CCR = (399 x (sin(2・PI / N) + 1)) / 2 (N=0~399)
上記式で作成したテーブルは以下の様になります
const uint16_t		g_uhSinTable[] = {
	200, 203, 206, 209, 212, 215, 218, 221,
	225, 228, 231, 234, 237, 240, 243, 246,
	249, 252, 255, 258, 261, 264, 267, 270,
	273, 276, 279, 282, 284, 287, 290, 293,
	296, 298, 301, 304, 306, 309, 312, 314,
	317, 319, 322, 324, 327, 329, 331, 334,
	336, 338, 341, 343, 345, 347, 349, 351,
	353, 355, 357, 359, 361, 363, 365, 366,
	368, 370, 371, 373, 374, 376, 377, 379,
	380, 381, 383, 384, 385, 386, 387, 388,
	389, 390, 391, 392, 393, 393, 394, 395,
	395, 396, 397, 397, 397, 398, 398, 398,
	399, 399, 399, 399, 399, 399, 399, 399,
	399, 398, 398, 398, 397, 397, 397, 396,
	395, 395, 394, 393, 393, 392, 391, 390,
	389, 388, 387, 386, 385, 384, 383, 381,
	380, 379, 377, 376, 374, 373, 371, 370,
	368, 366, 365, 363, 361, 359, 357, 355,
	353, 351, 349, 347, 345, 343, 341, 338,
	336, 334, 331, 329, 327, 324, 322, 319,
	317, 314, 312, 309, 306, 304, 301, 298,
	296, 293, 290, 287, 284, 282, 279, 276,
	273, 270, 267, 264, 261, 258, 255, 252,
	249, 246, 243, 240, 237, 234, 231, 228,
	225, 221, 218, 215, 212, 209, 206, 203,
	200, 196, 193, 190, 187, 184, 181, 178,
	174, 171, 168, 165, 162, 159, 156, 153,
	150, 147, 144, 141, 138, 135, 132, 129,
	126, 123, 120, 117, 115, 112, 109, 106,
	103, 101,  98,  95,  93,  90,  87,  85,
	 82,  80,  77,  75,  72,  70,  68,  65,
	 63,  61,  58,  56,  54,  52,  50,  48,
	 46,  44,  42,  40,  38,  36,  34,  33,
	 31,  29,  28,  26,  25,  23,  22,  20,
	 19,  18,  16,  15,  14,  13,  12,  11,
	 10,   9,   8,   7,   6,   6,   5,   4,
	  4,   3,   2,   2,   2,   1,   1,   1,
	  0,   0,   0,   0,   0,   0,   0,   0,
	  0,   1,   1,   1,   2,   2,   2,   3,
	  4,   4,   5,   6,   6,   7,   8,   9,
	 10,  11,  12,  13,  14,  15,  16,  18,
	 19,  20,  22,  23,  25,  26,  28,  29,
	 31,  33,  34,  36,  38,  40,  42,  44,
	 46,  48,  50,  52,  54,  56,  58,  61,
	 63,  65,  68,  70,  72,  75,  77,  80,
	 82,  85,  87,  90,  93,  95,  98, 101,
	103, 106, 109, 112, 115, 117, 120, 123,
	126, 129, 132, 135, 138, 141, 144, 147,
	150, 153, 156, 159, 162, 165, 168, 171,
	174, 178, 181, 184, 187, 190, 193, 196
};
				

2. デバイスの設定

2.1. TIM2の設定

Timers内TIM2を選択し、Mode を以下の様に設定します。
Clock Source Internal Clock
Channel1 PWM Generation CH1







2.2. DMAの設定

ModeはCircularに設定します。
DirectionはMemory To Peripheralに設定します。




3. コーディング

今回は、DMAで g_uhSinTable を繰り返し転送しますので、割込み処理は発生しません。
HAL_TIM_PWM_Start_DMA関数でDMAを開始させるだけです。
データ数はバイト数ではなく要素数を指定します。
  /* USER CODE BEGIN 2 */
  HAL_TIM_PWM_Start_DMA(
  					&htim2,
  					TIM_CHANNEL_1,
  					(const uint32_t *)g_uhSinTable,
  					sizeof(g_uhSinTable) / sizeof(g_uhSinTable[0]));

  /* USER CODE END 2 */
				

3. 動作確認

実行しLPFを通すと以下の波形が発生します。




今回の回路図は以下の通りです。
Wasabi はUSB からの 5V 電源として使用しています。