閑人

アクセスカウンタ

zoom RSS PIC 16F88 PWM DAC GCBASIC

<<   作成日時 : 2018/12/24 13:02   >>

ブログ気持玉 0 / トラックバック 0 / コメント 0

ひょんな所で、Great Cow Basicが更新されたことを知りました。そこで、PWMコントローラを作成してみようと今朝から頑張ってみました。
画像

(アナログオシロの画像を見て、波形が時計方向に回転しているのに気づきました。オシロの上に、着磁したレンチが置いてあったのが原因です。さてどうやって消磁しましょう、ブラウン管テレビ用の消磁器は廃棄済みです・・・)

工作したのは、PIC 16F88を内蔵のRC発振器(8MHz)を2MHzに分周して、10bitPWMの上位8bitだけ使って、周期8msのPWMを作成しました。
PICの出力ポートに直接RCのLPF(47k・10uF)を付けて、出力の電圧を、マルチメータ(PC5000)で読み取ります。
出力の最大値を基準に直線性を見てみると
画像

ブレッドボードで作成して、PICKITが付いたままですが、結構使えそうです。電圧が低い方は、電解コンデンサと配線の問題があるようです。電源は、携帯電話の充電器(5.047V)です。スイッチングノイズもLPFで問題無さそうです。

本題の、Great Cow Basicは、かなり使えると思います。Ver_0.98(2018/12/18)もうすぐVer1.0の宣言につられました。マイコンのサポート範囲が広いので、標準の表記方法で作成すれば、結構互換性は高いのですが、マイコン独特の構造部分(アーキテクチャとも言います)があるので、そこはちょっと工夫が必要です。

さて、PICのPWM機能を使うのに、標準の組み込みライブラリHPWMを使ってみました。ライブラリの引数が昔のデューティ(%)から、数値(0から255??)に変更されたようです。使てみると、分解能は、パーセントと同じ100区分近似でした。ちょっと使い難い(ドキュメントにも説明はありません)。そこで、レジスタを直接変更する、PEEK/POKEで対処してしまいました。LCDの表示は簡単でした。

宣言文やインクルードなどが、最小限で済むので、ちょっとした工作には便利です。こだわる人は、C言語でも、アセンブラでも、好きな環境で楽しんでください。

今回のソースは: 割り込み??? サブルーチン???? BASICは、GOTOに決まっています。

;8bit PWM TEST
;Chip Settings
#chip 16f88,2
#config OSC=INTRC_IO, MCLRE=ON, CCPMX=RB3
;Setup LCD Parameters
#define LCD_IO 4
#define LCD_NO_RW
#define LCD_Speed fast
#define LCD_RS PORTa.7
#define LCD_Enable PORTa.6
#define LCD_DB4 PORTa.0
#define LCD_DB5 PORTa.1
#define LCD_DB6 PORTa.2
#define LCD_DB7 PORTa.3
; #define CCP1CON 0x17
; #define CCPR1L 0x15
; #defune PR2 0x92
; #define T2CON 0x12
DIR portb.3 Out ;Set direction PWM port
DIR portb.4 In ;SW_DOWN
DIR portb.5 in ;SW_UP
DIR porta Out ;LCD port OUTPUT
dim dutyvalue as Byte
dim temp as word
dim t_REG as Byte

do
CLS ;init LCD
;init PWM to 8bit
dutyvalue = 128 ;init dutyvalue
HPWM 1, 1, dutyvalue ;GCBASIC HPWM OUTPUT
t_REG = Peek(0x12) ;read T2CON
t_REG = t_REG and 0xfc ;mask TIMER2 prescale
t_REG = t_REG or 0x02 ;set prescale 1/16
Poke(0x12, t_REG) ;set T2CON
POKE(0x17, 0x0c) ;set pwm mode CLEAR bit 4,5
POKE(0x92, 0xff) ;set max period(255)
POKE(0x15, dutyvalue) ;set duty
temp = dutyvalue
temp = temp * 197 ;VOLTAGE CAL
print temp ;DISPLAY to LCD
MAIN0:
if portb.4 = 0 then ;電圧下げる
goto DOWN
END if
if portb.5 = 0 Then ;電圧上げる
goto UP
END if
goto MAIN0
DOWN:
if portb.4 = 1 then
goto MAIN0
Else
Wait 5 ms
END if
if portb.4 = 1 then
goto MAIN0
END if
if dutyvalue = 0 then
dutyvalue = 0
else
dutyvalue = dutyvalue - 1
END if
MAIN2:
CLS
temp = dutyvalue
temp = temp * 197
print temp
MAIN3:

if portb.4 = 0 Then
goto MAIN3
END if
Wait 5 ms
if portb.4 = 0 Then
goto MAIN3
END if
goto MAIN0
UP:
if portb.5 = 1 Then
goto MAIN0
Else
Wait 5 ms
END if
if portb.5 = 1 Then
goto MAIN0
END if
if dutyvalue = 255 then
dutyvalue = 255
else
dutyvalue = dutyvalue + 1
END if
UP2:
CLS
POKE(0x15, dutyvalue) ;set duty
temp = dutyvalue
temp = temp * 197
print temp
Up3:
if portb.5 = 0 Then
goto UP3
END if
Wait 5 ms
if portb.5 = 0 Then
goto UP3
END if
goto MAIN0

loop


テーマ

関連テーマ 一覧


月別リンク

ブログ気持玉

クリックして気持ちを伝えよう!
ログインしてクリックすれば、自分のブログへのリンクが付きます。
→ログインへ

トラックバック(0件)

タイトル (本文) ブログ名/日時

トラックバック用URL help


自分のブログにトラックバック記事作成(会員用) help

タイトル
本 文

コメント(0件)

内 容 ニックネーム/日時

コメントする help

ニックネーム
本 文
PIC 16F88 PWM DAC GCBASIC 閑人/BIGLOBEウェブリブログ
文字サイズ:       閉じる