PICAXE（ピカクス）のpwm設定

## はじめに
PICAXEのpwm機能を使用してLEDを調光させたいと思った時にPWMOUTとPWMDUTYの詳しい使い方の説明が少ないと感じましたので、出力したい周波数とDutyだけに着目してまとめてみました。

## 結論
PICAXE Editor6 に実装されている PWMOUT を計算するツールを使用する。
PICAXE → Wizards → PWMOUT Wizard を選択します。
使用するポート、出力する周波数、DUTYを入力するとPWMOUTに設定する値を出してくれます。
![スクリーンショット 2024-01-21 12.48.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111210/e6e7c721-5733-6e72-218e-acd0fa83f16b.png)

## PWMOUT コマンドに設定する値の設計

●PWMOUTコマンド
PWMOUTコマンドのパラメータは、出力するポート、period（周期)、duty cyclesの設定が必要です。

PWMOUT pin, period, duty cycles
PWMOUT PWMDIV4,pin, period, duty cycles
PWMOUT PWMDIV16, pin, period, duty cycles
PWMOUT PWMDIV64, pin, period, duty cycles
PWMOUT pin, OFF

period と、dutyは以下の式で算出します。
The PWM period = (period + 1) x 4 x resonator speed(resonator speed for 4MHz = 1/4000000)
The PWM duty cycle = (duty) x resonator speed

period を算出するために式を変形します。
The PWM period = (period + 1) x 4 x resonator speed
period = The PWM priod / 4 / resonator speed -1

duty を算出するために式を変形します。
The PWM duty cycle = (duty) x resonator speed
duty = The PWM duty cycle / resonator speed

【重要】PICAXEチップのクロックはデフォルト 4MHz です。

計算例
10kHz duty 50% の矩形波を出力する場合
period = The PWM period / 4 / resonator speed - 1 より
       = (1/10kHz) / 4 / (1/4MHz) - 1 ※周波数から時間に変換するため逆数をとります。
       = 0.0001 / 4 / 0.00000025 - 1
       = 99
duty = ((1/10kHz)*50%) / (1/4MHz)
     = 200

```c
//サンプル 10kHz duty 50%の矩形波出力
    PWMOUT C.2, 99, 200
main:
    goto main
```
1サイクル 100us(10kHz) Duty 50% の矩形波が出力されました。
![IMAGE1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111210/909066cd-8629-d35e-6a87-79f69f701c65.png)


### PWMOUT Wizard 計算ツール
period値とduty値の計算方法を理解した上で、PICAXE Editor6 にはPWMOUTを計算する便利なツールがあります。
PICAXE → Wizards → PWMOUT Wizard を選択します。
![スクリーンショット 2024-01-21 12.39.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111210/085c55f2-04a0-b40e-3b46-1e5e63038a98.png)

System Clock 4MHz。PWMOUT Pin C.2。周波数 10000Hz。Duty 50%　を入力して、[Calculate]ボタンを押下すると、pwmout C.2,99,199 とそのままソースファイルに貼り付けられる形でコマンドを用意してくれます。便利！　
![スクリーンショット 2024-01-21 12.40.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111210/b9def753-b328-06cc-7cf8-06b97f8522a2.png)

### PWMOUT Wizard 計算ツールの便利なところ
条件を変えて周波数1kHz Dutu50% の設定を入力しその計算結果 period 249、duty 499 をプログラムに入れます。
```c
//サンプル 1kHz duty 50%の矩形波出力
    PWMOUT C.2, 249, 499
main:
    goto main
```
![スクリーンショット 2024-01-21 12.48.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111210/e6e7c721-5733-6e72-218e-acd0fa83f16b.png)

1サイクル 250us(4kHz) Duty 50% の矩形波が出力されました。
1kHzが出ていませんね。

![IMAGE2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111210/1e2076f5-1938-1921-8c08-1d955f545bbf.png)

PWMOUT Wizardの結果をよく見ると、pwmdiv4 が付いていると思います。
```c
pwmout pwmdiv4, C.2, 249, 499
```
この式で計算するとperiod設定値の最大値255を超える1000になってしまっています。

period = The PWM period / 4 / resonator speed - 1 より
       = (1/1kHz) / 4 / (1/4MHz) - 1 ※周波数から時間に変換するため逆数をとります。
       = 0.001 / 4 / 0.00000025 - 1
       = ★1000

そこで PWMOUT PWMDIV4 コマンドを使用して、resonator speed を4分周して設定する必要があります。

```c
//サンプル 1kHz duty 50%の矩形波出力
    pwmout pwmdiv4, C.2, 249, 499
main:
    goto main
```
1サイクル 1ms(1kHz) Duty 50% の矩形波が出力されました。
![IMAGE4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111210/69c7872f-cd9d-ec00-a343-ee61b1714817.png)


## PWMDUTY コマンドに設定する値の設計

周波数 1kHz で、Dutyを 0%〜100%　に可変させる時のPWMDUTYコマンドの値を設計します。

PWMDUTY pin,duty cycles

周波数毎に、duty cycles の100%における最大値が変わってきますので計算します。

100%時のduty最大値を計算します。
duty = ((1/1kHz)*100%) / (1/4MHz) /4   ※1kHz時は4分周
     = 1000
1kHz時のDuty100%時に最大1000ということがわかりました。

プログラム例は以下のようになります。
```c
	pwmout pwmdiv4, C.2, 249, 0
main:
	for w0 = 0 to 1000　        // 0% → 100%
    	pwmduty C.2,w0
	next
	for w0 = 999 to 1 step -1  // 100% → 0%
		pwmduty C.2,w0
	next
	goto main
```
上記プログラムを実行すると、Dutyが0%→100%→0%を繰り返します。

![１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111210/c20214f0-a760-d13b-6d36-58cba79a4e74.png)
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111210/8c068148-c9e8-36aa-144b-9a3240584949.png)

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111210/4aa7f58d-d192-19de-5b9e-a75d77dec7f4.png)

## 各PICAXEによる pwm が使えるポート
### PICAXE-08M2
<table>
	<tbody>
		<tr>
			<td>pin番号</td>
			<td>pin name</td>
		</tr>
		<tr>
			<td>5</td>
			<td>C.2</td>
		</tr>
	</tbody>
</table>

### PICAXE-14M2
<table>
	<tbody>
		<tr>
			<td>pin番号</td>
			<td>pin name</td>
		</tr>
		<tr>
			<td>5</td>
			<td>C.2</td>
		</tr>
		<tr>
			<td>7</td>
			<td>C.0</td>
		</tr>
		<tr>
			<td>9</td>
			<td>B.4</td>
		</tr>
		<tr>
			<td>11</td>
			<td>B.2</td>
		</tr>
	</tbody>
</table>

### PICAXE-18M2
<table>
	<tbody>
		<tr>
			<td>pin番号</td>
			<td>pin name</td>
		</tr>
		<tr>
			<td>9</td>
			<td>B.3</td>
		</tr>
		<tr>
			<td>12</td>
			<td>B.6</td>
		</tr>
	</tbody>
</table>

### PICAXE-20M2
<table>
	<tbody>
		<tr>
			<td>pin番号</td>
			<td>pin name</td>
		</tr>
		<tr>
			<td>5</td>
			<td>C.5</td>
		</tr>
		<tr>
			<td>7</td>
			<td>C.3</td>
		</tr>
		<tr>
			<td>8</td>
			<td>C.2</td>
		</tr>
		<tr>
			<td>17</td>
			<td>B.1</td>
		</tr>
	</tbody>
</table>

## 参考資料
スタートアップマニュアル
https://picaxe.com/docs/picaxe_manual1.pdf
コマンドマニュアル
https://picaxe.com/docs/picaxe_manual2.pdf

## PICAXE関連の投稿
PICAXE（ピカクス）でLチカ
https://qiita.com/masashi_214/items/5495503bf6bd82c1980b
PICAXE 最初に調べた事
https://qiita.com/masashi_214/items/d1acb1ecdc32de5a1698
PICAXEで鉄道模型の在線検出と信号機の制御
https://qiita.com/masashi_214/items/c728814df4f7a2453112
PICAXE（ピカクス）のポート設定
https://qiita.com/masashi_214/items/e5d5e1b9817aed754f52
PICAXE（ピカクス） リンク集
https://qiita.com/masashi_214/items/8b630b2c60ddb466b1ac
PICAXE（ピカクス）のpwm設定
https://qiita.com/masashi_214/items/f92e52837a9fa902879f
PICAXEでPWMを使用した調光機能を使って蛍を作る
https://qiita.com/masashi_214/items/0231a75ae0c77c2be206