電子工作108 – 1個のボリュームでUSB扇風機の回転速度を無段階に変えられる装置
Electronics Project 108 – Stepless Speed
Controller for USB Fans Using A Variable Resistor
概要
Introduction
: 前の電子工作107では1個のスイッチ(SW)を押す毎にUSB扇風機の回転速度が3段階に変わる装置を作った。今回は1個のボリューム(VR)を回して回転速度を0から最大まで無段階に変えられる装置を作った。ハードウェアでは、前のものがSW入力で、今回の場合は電源電圧5Vを分圧して入力するVR入力である。コントロールのためのソフトウエアは下に示すように大分違う。
In this project, I made a device that can change the rotational speed of
USB fan steplessly using a variable resistor. Because it was required to use
the analog to digital conversion in the system, a 12F675 equipped with ADC (A/D
converter) was used, instead of 12F629. The power supply DC5V is divided into
smaller voltages by a variable resistor (VR 10k) with SW, each of which is then
taken into GP0 of 12F675 for A/D conversion. The completed device produces the
smooth stepless rotation of USB fan from 0 to the maximum speed by revolving
the VR.
回路図 Circuit Diagram
VRからの電圧をデジタル値にへ変換する必要があるのでADCの付いた12F675をマイクロコントローラに使う。電源はDC5Vで、システムとUSB扇風機の駆動の両方に用いる。VRを回転するとGP0から0-5.0Vの電圧が入力される。内部のプログラムで各電圧値に対応したPWM値がGP5よりトランジスタ2SD2012に供給されUSB扇風機が駆動される。
プラスチックケースに収めた基板、前回の電子工作107とほぼ同じだが、SWの代わりに10Kのボリュームが加わっている。
Completed device with a variable
resistor instead of Input SW.
写真のような直径14cm、DC5V 0.4AのUSB扇風機の回転速度を無段階に制御できる。
Stepless smoother speed control of USB fan
realized!
実験中の様子 An experimental scene
下の写真(1)〜(6): 12F675へのボリュームからの入力電圧(GP0)と出力波形(GP5での)関係、入力電圧1.5V位から扇風機は回転を始める。パルス幅(High-peak
width)が広くなるにつれ回転数も上昇する。入力電圧が4Vあたりから急激にパルス幅も広がり、回転数が増す。最大の入力電圧4.9Vではパルス幅が4.5msにもなり、Highの部分(5V)が連続して回転数は最大になる。
Relationship between Input voltage
from GP0 of 12F675 and the resulting Pulse width measured at GP5. It is clear
that the increase in the Input voltage leads to the wider Pulse width,
increasing the rotational speed of fan as shown below from (1) to (6).
(1)
(2)
(3)
(4)
(5)
(6)
結果とコメント Comments
1)
予想通り動作する。ボリュームを回すと扇風機の回転がスムースに追従する。
2)
PicBasic ProのPWMパルス出力コマンド「PWM Pin, Duty, Cycle」は大変便利なことが分かった。
3)
PWM出力をGP5でオシロで測定してみた。iPhone 6sで撮影し、字入れはiPadmini
5の「写真」にあるマークアップという機能で行った。
4)
プログラムでADC値0−1023を4で割って0−255にするというのが最重要ポイントだった!!
5)
ADCを使う際の前設定がちょっとやっかい、特にANSELとADCON0。
6)
やってみないと分からないが、DCモーターも制御してみたい。
プログラム Program
いつものようにPicBasic Pro(Pbp)というコンパイラを使ってプログラムを作成した。まず、ボリュームVRからの入力電圧値はADC(アナログ-デジタル-コンバータ)が10ビットなので0-1023に変換される。この値を4で割って全体の値を4分の1にする。この状態では、入力値0Vはデジタル
値0、入力値2.5Vでは127、入力値5Vでは255というデジタル値になる(1023/4=255)。これら0-255の値を、PbpのユニークなPWMパルス出力コマンド「PWM
Pin, Duty, Cycle」のDutyに入れて出力させるのである。その結果、入力電圧値に対応したPWM出力が得られる。VR回転による入力値変化に対応するためLoopを作成して常時入力電圧変化をチェックするように作成してある。
In the program, the input analog voltage data is taken into a 10-bit
built-in A/D converter from GP0, which is changed to the digital values 0 –
1023. To use a unique command 'PWM Pin, Duty, Cycle' of PicBasic Pro, it is
required to divide 0 – 1023 by 4 so as to get 0 – 255 that can be read into the
'Duty' of the command. As a result, the command can produce the PWM values
corresponding to the individual analog values from GP5 in order to turn on/off
the transistor 2SD2012 for driving the USB fan. Within ADCloop, any change in
Input voltage value at GP0 is continuously checked, and if any, a new 'Duty'
value will replace the old one, generating a new PWM value.
'******************
USBFanSpeedControllerVR *******************
'USBFanSpeedControllerVR.pbp 2019.5.14 works!
'Using
12F675 and PicBasic Pro V2.5A
'Internal
clock 4MHz
'********
Pin connection ******************
'Pin
1: Vdd (5.0V)
'Pin
8: Vss (GND)
'Pin
7: GPIO.0: input from voltage divider made of Vdd(+5V), GND and 10k-VR
'Pin
6: GPIO.1: not used
'Pin
5: GPIO.2: not used
'Pin
4: GPIO.3: input - reset connected to MCLR via 4.7kR and Vdd
'Pin
3: GPIO.4: not used
'Pin
2: GPIO.5: output - connected to Base of Tr2SD2012 for driving Fan
'*********
Program starts from here ***************
ANSEL=%01000001
'sets
Fosc/4MHz (bit6-4=100) and GPIO.0 as ADC input (analog)
ADCON0=%10000011
'bit7=1(right
justified),bit6=0 (Vdd used as volt reference for ADC),
'bit5-4=00(unimplemented),
bit3-2=00(GP0-Anlog Input),
'bit1=1
(starts right away), bit0=1(on operation)
TRISIO=%001001 'GP0 and GP3 - input
CMCON=7
'turns off comparator function
Define
ADC_BITS 10
'10-bit ADC used
Define
ADC_CLOCK 3
'Internal clock used
Define
ADC_SAMPLEUS 50 'Polling is not needed due to use of ADCIN command
Vin
var WORD 'Storage for ADC data
TrDrive
var GPIO.5 'Drive Tr
Vin=0
TrDrive=0
ADCloop:
ADCIN
0, Vin 'Read Vin from GPIO.0 (AN0)
(range 0 - 1023)
Pause
2 '2ms
Vin=Vin/4 'ex. 1023/4=255
PWM
GPIO.5,Vin,100
Pause
5 '5ms
Goto
ADCloop
End
'*********
End of Program ***************
'Note:
'melabs
U2 Programmer's configurations for 12F675:
'Oscillator
- INTOSC, WDTE - Enable, PWRTE - Disable, MCLR - Reset, BODEN - Enable, CD -
Not Protected,
'Data
EEPROM - Not Protected