picマイコンの使い方

PICマイコンの8bitマイコンから32bitマイコンまで使いこなすぞ! 周辺機能やアセンブラ、C言語を使いこなすぞ。ARMには負けないぞ! 頼みの綱はPIC32MZだ!たのしみだなー

AD

【dsPIC33FJ128MC802】デジタルポテンションメータAD5245を使ってみる。


◆dsPIC33FJ128MC802でアナログデバイスのデジタルポテンションメータAD5245を使ってみます。
抵抗値をI2C制御で変更できるので様々や用途で活躍できると思います。



本デバイスはREAD/WRITE可能ですが、WRITEのみにチャレンジしてみたいと思います。
パッケージがSOT-23ですがピッチが狭いので半田付けが大変です。
bc0650e5.jpg

1)AD5245仕様
・256段階
・抵抗値:5kΩ/10kΩ/50kΩ/100kΩ
・電源:2.7V~5.5V

2)参考
データーシートを参考にしました。

3)WRITE書き込み
c53f9d08.png
StartBIT→「SLAVE_ADDRESS」→ACK→「Instruction」→ACK→「data」→Ack→StopBIT
■SlaveAddress:01011000(書き込み時/AD0pinをLOW時)
■Instruction:00000000

4)ソース
仕様:
8bitレジスタに毎回+1加算してAD5245に書き込み。
Wピンをオシロで確認
80fa290b.png



ソースは前後かなり端折りましたのでご注意ください。


//== AD5245 ======================================================================
void ad_5245_write(unsigned char data); //write
unsigned char data;
//=====================================================================
while(1)
{
sprintf(string_box,"%03u",data);
sb1602_string_write(string_box,1,4); //bmp_data_write
ad_5245_write(data);
delay_ms(10);
data++;
}//while(1)
}//int main(void)

//== SB1602 Write ====================================================
void ad_5245_write(unsigned char data)
{
//StartBIT
while(I2C1CONbits.SEN || I2C1CONbits.PEN || I2C1CONbits.RCEN || I2C1CONbits.ACKEN || I2C1STATbits.TRSTAT);
I2C1CONbits.SEN = 1; //start_bit
while(I2C1CONbits.SEN); //start_wait
//address
I2C1TRN = 0b01011000; //slave_address
while(I2C1STATbits.TBF); //transmit_wait
while(I2C1STATbits.ACKSTAT); //ACK_CHECK
//mode_select
while(I2C1CONbits.SEN || I2C1CONbits.PEN || I2C1CONbits.RCEN || I2C1CONbits.ACKEN || I2C1STATbits.TRSTAT);
I2C1TRN = 0b00000000; //command_write
while(I2C1STATbits.TBF); //transmit_wait
while(I2C1STATbits.ACKSTAT); //ack_check
//data
while(I2C1CONbits.SEN || I2C1CONbits.PEN || I2C1CONbits.RCEN || I2C1CONbits.ACKEN || I2C1STATbits.TRSTAT);
I2C1TRN = data; //transmit
while(I2C1STATbits.TBF); //transmit_wait
while(I2C1STATbits.ACKSTAT); //ack_check
//StopBIT
while(I2C1CONbits.SEN || I2C1CONbits.PEN || I2C1CONbits.RCEN || I2C1CONbits.ACKEN || I2C1STATbits.TRSTAT);
I2C1CONbits.PEN = 1; //stop_bit
while(I2C1CONbits.PEN); //stop_bit_wait
}//void ad5245_data_write(unsigned char data)
//========================================================================


5)回路図
AD0pin:LOW
0dfaf959.png

【PIC24FJ64GA002】12bitAD2chコンバータLTC1298を使ってみる。

◆秋月電商で買った12bitAD2chLTC1298をPIC24FJ64GA002で動かしてみました。



1)4線式ソフトウエア制御(SPI風)
CE、Din、Dout、CLKの4線式となります。
データシートのPage11を参照にしました。
クロックはStart,SGL,ODD,MSBF,NULL,12bitADの17bitパタパタする必要があります。

2)仕様設定の表
AD変換の仕様はDinで設定することが可能です。






各BITSGL/DIFFODD/SIGNMSBF結果
内容入力チャンネル設定B11→B0/B0→B11---
設定例111CH1/B11→B0

SGL/DIFF、ODD/SIGN、MSBFを全部"1"にすると「CH1」で「B11→B0」となります。
Startも"1"だし、データ出力時はDon'tCareなのでずーっと'1'は都合がいいです。
3)CE、Din、Dout、CLKの波形
3603f4e0.png

4)プログラムの例
プログラムの例はこちら
float LTC1298_CALL(void)
{
unsigned short int ad_data; //AD変換
ad_data = 0; //クリア
LTC_HIZ_OUT = 1; //入力
LTC1298_CE = 0; //START
delay_us(1);
//== START_BIT ========================
LTC1298_IN = 1; //START_BIT
LTC1298_CLK = 0; //極切り替え
delay_us(1);
LTC1298_CLK = 1;
delay_us(1);
//== SGL_DIFF =========================
LTC1298_IN = 1; //SINGLE
LTC1298_CLK = 0; //極切り替え
delay_us(1);
LTC1298_CLK = 1;
delay_us(1);
//== ODD_SIGN ========================
LTC1298_IN = 1; //CH1
LTC1298_CLK = 0; //極切り替え
delay_us(1);
LTC1298_CLK = 1;
delay_us(1);
//== MSBF ============================
LTC1298_IN = 1; //B11→B0
LTC1298_CLK = 0; //極切り替え
delay_us(1);
LTC1298_CLK = 1;
delay_us(1);
//== NULL_BIT ========================
LTC1298_CLK = 0; //極切り替え
delay_us(1);
LTC1298_CLK = 1;
delay_us(1);
//== 12BIT ===========================
char i; //charで十分
LTC_HIZ_OUT = 1; //入力
for(i=0; i<12; i++)
{
//== クロック =======================
LTC1298_CLK = 0; //極切り替え
delay_us(1);
LTC1298_CLK = 1;
delay_us(1);
//== Dout_check ==================
ad_data <<= 1; //シフト
if(LTC1298_OUT == 1)
{ad_data+=1;} //'1'set
else{} //none
}//for(i=0; i<12; i++)
LTC1298_CE = 1; //END
delay_us(1);
LTC_HIZ_OUT = 0; //出力
return(ad_data); //戻り値
}//float LTC1298_CALL(void)

間違ってたらゴメンね!
5)回路図はこちら
178e7714.png

【PIC12F1822】AD変換を使ってみる2

■PIC12F1822のAD変換を使ってみる!その2
データシートのP138を参照にアセンブラコードを書きましたが、
ハイパーターミナル出力はいつも「0000」・・・
何かがおかしい・・・



そこで下記のようにAD変換後のデーター退避の際にもバンクを切り替えました。













BSFADCON0,ADGO;A/D変換開始
BTFSCADCON0,ADGO;変換待ち
GOTO$-1;
BANKSELADRESH;BANK1
MOVFADRESH,W;W←ADRESH
BANKSELH_BYTE;バンク切り替え
MOVWFH_BYTE;上位退避
BANKSELADRESL;BANK1
MOVFADRESL,W;W←ADRESL
BANKSELL_BYTE;バンク切り替え
MOVWFL_BYTE;下位退避
MOVLB0;BANK0

その1:回路と設定
間違ってたらゴメンネ!

【PIC12F1822】AD変換を使ってみる



■PIC12F1822のAD変換を使ってみる!
データシートのP133~145を参照しました。
仕様はチャンネルAN0で10bit変換に挑戦します。
10bitなので0~1023の変化量になります。



①ADCON1レジスタでは変換の仕様が設定できます。
(データシートP140参照)
・「ADFM(B7)=1」→左詰め(P136)
・「ADCS(B6~B4)=100」→Fosc/4
・「ADPREF(B1,B0)=00」→基準は電源

ADCON1 = 0B11000000;(0xC0)
Fosc/4が限界でした。
①ADCON0レジスタでは使用するチャンネルが設定できます。
(データシートP139参照)
・「CHS(B6~2)=00000」→AN0
・「GO/DONE(B1)」→ステータスビット
・「ADON(B0)」→ADC有効ビット

ADCON0 = 0B00000001;(0x01)
右上の写真はハイパーターミナルでデバックしてるところです。
それぞれの実行時間は
・ADC:9usec
・BCD:113usec(AN526を使いました。)
・文字変換:3usec(左ニブルに3を付ける作業)
Total:125usecなのでなかなかの早さですね。
・USART
 ・9.6k:6.1msec(かかりすぎww)
 ・115.2k:385usec(まあまあかな)
間違ってたらゴメンネ!
↓実験回路図



A/D機能について

A/D機能について

・A/D変換に一定の時間を要する。

・変換後データはADRASH、ADRESLをみる。

・同時に複数のA/D変換ができない。

(変換が終わったら、同じことを別のチャンネルでやればよい。)








ギャラリー
  • 【PIC32MZ2048ECH144-I/PH】PIC32MZ2048ECH144を買いました!
  • 【PIC32MX370F512H】タイマーを使ってみる。
  • 【dsPIC33FJ128MC802】PMP接続のDMA転送でaitendoの1.44インチ液晶TFT(ZY-FGD)を使ってみる。その3
  • 【dsPIC33FJ128MC802】PMP接続のDMA転送(連続転送)でaitendoの液晶を使ってみる。
  • 【dsPIC33FJ128MC802】PMP接続のDMA転送(連続転送)でaitendoの液晶を使ってみる。
  • 【dsPIC33FJ128MC802】PMP接続のDMA転送(連続転送)でaitendoの液晶を使ってみる。
  • 【dsPIC33FJ128MC802】PMP接続のDMA転送(連続転送)でaitendoの液晶を使ってみる。
  • 【dsPIC33FJ128MC802】aitendoの1.44インチ液晶TFT(ZY-FGD)をPMP接続で使ってみる!
  • 【dsPIC33FJ128MC802】aitendoの1.44インチ液晶TFT(ZY-FGD)をPMP接続で使ってみる!
メッセージはこちちらからお願いします。

名前
メール
本文
アクセスカウンター
  • 今日:
  • 昨日:
  • 累計:

ブログパーツ
  • SEOブログパーツ
にほんブログ村 その他趣味ブログ 電子工作へ
にほんブログ村
アクセスカウンタ
アクセスランキング