#はじめに
書籍に沿って引き続き進めていきます。
今回は可変抵抗から贈られるアナログ値を利用して、LEDの明るさを制御します。
#アナログ入力とは
デジタル入力(ON,OFF)と違い、様々な値を入力できる。
温度や湿度など、変化するような値を電圧として扱います。
ラズベリーパイやマイコン等でアナログ値を入力する場合はADコンバータを使用します。
ADコンバータ...アナログ値をデジタル値に変換する。
マイコンに内蔵されているものとされていないものがあるので、仕様書を確認しましょう。
(ラズベリーパイには内臓されていませんが、PsoCには内蔵されているので、それを使用します。)
内蔵されいないものは外部のADコンバータを使用します。
#使用部品
- PSoC 5LP
- 抵抗(100,10kΩ)
- LED
- 可変抵抗10kΩ
--可変抵抗の型番の読み方--
今回の場合は103
10 × 10³ = 10000 = 10kΩ
202の場合は
20 × 10² = 2000 = 2kΩ
#PSocの設定変更
珍しくPSoCの設定を記載します(`・ω・´)
以前作ったPWMの設定にADC_SARを追加します。(アナログデジタルコンバータ)
Analog入力とsocには0をつなげてください。
ADC_SARをダブルクリックすると設定画面になるので、以下のように変更してください。
- Modes
- Resolution --出力bit数(とりあえず大きく)
- Conversion rate --一秒間に何回サンプリング(アナログデータを取り込む)か。(とりあえずこれくらい) - Sample mode
- Software trigger --プログラムから制御します - Clock source
- Internal --内部クロックを使用 - Input
- Input range --入力される電圧の範囲
- Reference --ADの基準電圧です(コメントより。今回は精度はあまり気にしないので内部のものを使用します。)
5Vと可変抵抗の間に150Ωを入れています。
これはPSoCの設定の際に、入力電圧の範囲を0~2Vくらいに設定したので、可変抵抗に2V以上かからないようにするためにつけてあります。
2V ÷ (5V -2V) × 10kΩ = 7kΩくらい
7kΩくらいですが、持ってないので10kΩを使用します。(0~2.5Vまで変動)
#プログラム
#include "project.h"
int main(void)
{
CyGlobalIntEnable;
//PWMスタート
PWM_Start();
//ADCスタート
ADC_Start();
for(;;)
{
//変換開始
ADC_StartConvert();
//開始されるまで待つ
while(ADC_IsEndConversion(ADC_RETURN_STATUS) == 0);
//12bitがくるので16bitで取得
int val = ADC_GetResult16();
//↑で返ってきた16bitの値×PWMの最大値÷16bitの最大値
double t = (val * 255 /4095);
PWM_WriteCompare(t);
}
}