「[15] Arduino-IDEで動かしてみる(PWMドライバサンプル)」で、PWM制御を行いました。
PWMはITUをPWMモードにすることによって実現しています。
[15]ではITU1を使用してPA4に対しduty cycle を設定し、波形を採取しました。
今回は、サーボモータを接続し制御してみました。
1. ハードウェア構成
PA4端子と、GND,Vccをそれぞれサーボモータに接続します。
今回使用したサーボモータは「SG92R」です。

SG92Rの黒線:GND
SG92Rの赤線:Vcc(5v)
SG92Rの黄線:PA4
以下拡大版です。

補足:
上記では、サーボモータに対する電源をボードから3.3Vで取得しています。(サーボモータ側は5Vの仕様ですが、3.3Vでも動作はするため)
ですので、動作時に十分な電流を供給するためには、ボードではなく別途電源を用意した方が良いです。
本記事では、PWM動作を見ることが主旨であり、モータを完全に動作させることはあまり意図してはいないため、簡易的にボードから電源供給しています。
1. プログラムの準備
まず、「[15] Arduino-IDEで動かしてみる(PWMドライバサンプル)」を一度動作させてみることをお勧めします。
Arduinoのバージョン2を使用する場合は、「[16] Arduino-IDE 2.0.4を使用する」に、セットアップ方法を記載しています。
その上で、Arduino-IDEの新しいスケッチを起動し、以下のプログラムをコピー&ペーストしてください。
#include <Arduino.h>
#include <FreeRTOS.h>
#include <task.h>
void vPwm(void *pvParameters);
// put your setup code here, to run once:
void setup() {
xTaskCreate(vPwm, (signed portCHAR *)"PWM", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL);
vTaskStartScheduler();
}
void loop() {
// put your main code here, to run repeatedly:
}
void vPwm(void *pvParameters) {
timer_error_code_t ret;
ret = PWM_Open(1);
if (ret == TIMER_SUCCESS) {
PWM_SetPeriodAndDuty(1, 1000, 10000);
PWM_Start(1);
vTaskDelay(2000/portTICK_RATE_MS); // delay 2s
PWM_SetPeriodAndDuty(1, 1500, 10000);
PWM_Start(1);
vTaskDelay(2000/portTICK_RATE_MS); // delay 2s
PWM_SetPeriodAndDuty(1, 2000, 10000);
PWM_Start(1);
vTaskDelay(2000/portTICK_RATE_MS); // delay 2s
PWM_Stop(1);
}
while (1) {
vTaskDelay(1);
}
}
ビルドします。
(IDEを2.1.0にした際に和文化しておらず、図が英文となっています)

2. 実行
他のサンプル同様、あらかじめE10A-USB経由でBootloader部をダウンロードし、リセット後実行をしておきます。
サンプルをダウンロード&実行してみます。
「マイコンボードに書き込む」を選択すると、ビルドが行われ、書き込みを開始しようとします。(図は英文なので「Upload」となっています)

実行すると、以下のように動作します。
①サーボが0度の位置に動作します。

②2秒待ちます。
③サーボが45度の位置に動作します。

④2秒待ちます。
⑤サーボが90度の位置に動作します。
