電子工作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

 

 

Menu Pageへ戻る    (Return to Menu Page)

Top of Pageへ戻る   (Return to Top of Page)