Darkside(リンクエラー修正しました)

2018年07月03日の記事

2018年7月3日(火) 21:41

基本設定完了

 実態の方に合わせ、自作 Delay() 関数の空ループ回数を減らす。

 クロックが発振しLED点灯も可能になったので、今度はボタンを押している間だけ点灯させてみる。はい、危惧した通り反応がありません。
 入力ピンに電圧を直接与えた場合の挙動が妙で、どうやら入力端子が浮いている感じ。そこで、スイッチ周りの配線をチェックし、ジャンパーを1本飛ばし忘れているのを発見。修正すると、ちゃんとボタンに反応してLEDが点滅するようになった。
 これで、デジタル出力とデジタル入力の試験が終了。

 ならばと、アナログ入力に進む。
 2番ピンにボリュームが接続してある。その値を読み、LEDの点滅DUTYを変化させる。これも最初は案の定で、全く反応していない。
 ADCは元のサンプルプログラムが12ビット1系統入力なのに対し、10ビット3系統入力に変更した。それだけに、一発で動く可能性は低いと思っていた。しかし、いざ動かないとなると、どこが悪いのか分からない。まずは、ハードを確認。ボリュームを動かすことで、2番ピンの電位は想定通りに変化するか?
 これは、大丈夫だった。となると、問題はソフト側だ。

 コンフィギュレーション・レジスターというのは、dsPIC 内部の配線接続を変更する。よって、内部の配線接続がどうなっているかを示すデーターシートのブロックダイヤグラムを見ることなくして、コンフィギュレーション・レジスターは設定できない。
 今回は、AN0 と AN1 と AN2 をアナログ入力で使いたい。3系統という設定は無いので、いちおう AN3 まで含めた4系統で設定を行い、最後に AN3 は未使用という設定にする。

 ブロックダイヤグラムを見なければ、AN0 → CH1、AN1 → CH2、AN2 → CH3、AN3 → CH0 という組み合わせしか選べないことにだって気付けない。コンフィギュレーション・レジスターの説明だけ見ても、何をどうすれば良いか分からないだろう。
 念入りに設定を行い、無事にボリュームでLEDのDUTYを変化させることに成功。

void InitADC( void )
{
  /* ADPCFG: ADC Port Configuration Register */
  // Set all ports digital
  AD1PCFGL = 0xFFFF;
  AD1PCFGLbits.PCFG0 = 0; // AN0 analog
  AD1PCFGLbits.PCFG1 = 0; // AN1 analog
  AD1PCFGLbits.PCFG2 = 0; // AN2 analog

  // デバイスアイドル中も変換する
  AD1CON1bits.ADSIDL = 0;
  /* Select 10-bit, 4 channel ADC operation */
  AD1CON1bits.AD12B = 0;
  /* 符号付き固定小数 Signed Fractional */
  AD1CON1bits.FORM = 0; // サンプルプログラムでは3にする(符号付き固定小数) 電圧利用とかなら0にする(0 to 1023)
  /* Internal Counter Ends Sampling and Starts Conversion */
  AD1CON1bits.SSRC = 3;
  /* 複数チャンネル同時サンプル */
  AD1CON1bits.SIMSAM = 1;
  /* Sampling begins immediately after last conversion */
  AD1CON1bits.ASAM = 1;
  // ADC サンプル有効化
  AD1CON1bits.SAMP = 1;

  // CH1=AN0 CH2=AN1 CH3=AN2 (CH0=AN3)
  /* Vref = AVdd/AVss */
  AD1CON2bits.VCFG = 0;
  // CH0+スキャン入力
  AD1CON2bits.CSCNA = 1;
  /* 4 channel scan */
  AD1CON2bits.CHPS = 3;
  /* SMPI = 1 per interrupt */
  AD1CON2bits.SMPI = 0;
  // 常に0番地からバッファ書き込み
  AD1CON2bits.BUFM = 0;
  // Use MUX A */
  AD1CON2bits.ALTS = 0;

  /* Set Samples and bit conversion time */
  AD1CON3 = 0x032F; //そのまま

  /* CH1, CH2, CH3 negative input is VREFbit */
  /* CH1 positive input is AN0, CH2 positive input is AN1, CH3 positive input is AN2 */
  AD1CHS123 = 0x0000;

  /* AN0,AN1,AN2 to Scan */
  AD1CSSL = 0x0007; //そのまま

  /* Channel select AN3 */
  AD1CHS0 = 0x0003;

  /* Reset ADC interrupt flag */
  IFS0bits.AD1IF = 0;

  /* Enable ADC interrupts, disable this interrupt if the DMA is enabled */
  IEC0bits.AD1IE = 1;

  /* Turn on ADC module */
  AD1CON1bits.ADON = 1;
}

written by higashino [ドリル戦車] [この記事のURL] [コメントを書く] [コメント(0)] [TB(0)]

この記事へのトラックバックPingURL
Darkside(リンクエラー修正しました)

Generated by MySketch GE 1.4.1

Remodelling origin is MySketch 2.7.4