忍者ブログ

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

2025/05/22

dsPIC33CH Curiosity Development Board(ポテンションの値をソフトウェアで平均化しLEDの点灯、消灯)

dsPIC33CHシリーズにはAD(Analog to Digital)コンバータがマスターコアに1ch、スレーブコアに3ch搭載されており、スレーブの2chは専用入力構成となっております。今回はマスターコア側のADコンバータを使用してLEDを点灯させるサンプルについて説明しています

  ハードウェア構成

ハードウェアの構成としてポテンション(R17)のアナログ電圧をAN0チャンネルを介し、ソフトウェアでサンプリングとコンバートの指令を行い、8回の移動平均の結果値が1.65V以上の場合LEDを点灯させる様にします。 


 


  ソースコード

コンフィグレーション設定やクロック設定の関数に関して記述を省略していますが「dsPIC33CH Curiosity Development Board(準備編)」と同じです。

/*----------------------------------------------------------------------------------*/
/*【INC】インクルードファイル*/
/*----------------------------------------------------------------------------------*/
#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
#include <libpic30.h>
#include "config.h"
/*----------------------------------------------------------------------------------*/
/*【CONST】定数定義*/
/*----------------------------------------------------------------------------------*/
#define ADSIZE       8u
/*----------------------------------------------------------------------------------*/
/*【VARI】変数定義*/
/*----------------------------------------------------------------------------------*/
struct
{
    unsigned int u2_Sum;
    unsigned int u2_Head;
    unsigned int u2_Ave;
    unsigned int u2_Buffer[ADSIZE];
}Pot;

unsigned int u2_SamplingTime;
/*----------------------------------------------------------------------------------*/
/* Main関数 */
/*----------------------------------------------------------------------------------*/
int main(int argc, char** argv) 
{
    /*----------------------------------------------------------------------------------*/
    /* クロック初期化*/
    /*----------------------------------------------------------------------------------*/
        vds_Main_Init_Clock_Register();     /* クロック初期化 */
    /*----------------------------------------------------------------------------------*/
    /* GPIO初期化*/
    /*----------------------------------------------------------------------------------*/
        TRISEbits.TRISE0 = 0u;              /* LED1ピンはデジタル出力ピン */
        ANSELAbits.ANSELA0 = 1u;            /* RA0ピンはアナログピン(ポテンション入力)*/
    /*----------------------------------------------------------------------------------*/
    /* AD初期化*/
    /*----------------------------------------------------------------------------------*/
        ADCON1L = 0x0000u;
        ADCON1H = 0x0000u;
        ADCON2L = 0x0000u;
        ADCON2H = 0x0000u;
        ADCON3L = 0x0000u;
        ADCON3H = 0x0000u;
        ADCON5H = 0x0000u;
        
        /***** AD制御レジスタの設定 ******/
        ADCON1Hbits.SHRRES = 3u;            /* シェアADC分解能 (3 = 12bit) */
        ADCON2Lbits.SHRADCS = 2u;           /* シェアADCクロックディバイダ (2 = 4Clock) */
        ADCON2Hbits.SHRSAMC = 4u;           /* シェアADCサンプル時間 (3 = 4TAD) */
        ADCON3Lbits.CNVCHSEL = 0u;          /* ソフトウェアAD入力(0 =AN0入力)*/
        ADCON3Hbits.CLKSEL = 2u;            /* ADCクロックソース (2 = AFVCODIV) */
        ADCON3Hbits.CLKDIV = 2u;            /* ADCクロックディバイダ(2 = 3Clock)*/
        ADCON5Hbits.WARMTIME = 15u;         /* ウォームアップ時間(15 = 32768Clock) */
        
        /***** ADの有効化 ******/
        ADCON1Lbits.ADON = 1u;              /* ADC全体のパワーON */
        ADCON5Lbits.SHRPWR = 1u;            /* シェアADCのパワーON */
        while(ADCON5Lbits.SHRRDY == 0u){;}
        ADCON3Hbits.SHREN = 1u;             /* シェアADCの有効化 */

        ADCON3Lbits.CNVCHSEL = 0u;
    /*----------------------------------------------------------------------------------*/
    /* メインルーチン*/
    /*----------------------------------------------------------------------------------*/
        while(1)
        {
            /*--------------------------------------------------------------------------*/
            /* サンプリング*/
            /*--------------------------------------------------------------------------*/
                u2_SamplingTime = 30u;
                while (ADCON3Lbits.CNVRTCH == 1u){;}
                ADCON3Lbits.SHRSAMP = 1u;
                while(u2_SamplingTime > 0){u2_SamplingTime --;}
                ADCON3Lbits.SHRSAMP = 0u;
            /*--------------------------------------------------------------------------*/
            /* AD変換*/
            /*--------------------------------------------------------------------------*/
                ADCON3Lbits.CNVRTCH = 1u;
                u2_SamplingTime = 10;
                while(u2_SamplingTime > 0){u2_SamplingTime --;}
            /*--------------------------------------------------------------------------*/
            /* 移動平均*/
            /*--------------------------------------------------------------------------*/
                if ((ADSTATL & 0x0001u) == 0x0001u)
                {
                    Pot.u2_Sum -= Pot.u2_Buffer[Pot.u2_Head];
                    Pot.u2_Buffer[Pot.u2_Head] = ADCBUF0;
                    Pot.u2_Sum += Pot.u2_Buffer[Pot.u2_Head];
                    Pot.u2_Head ++;
                    Pot.u2_Head &= 0x07;
                    Pot.u2_Ave = Pot.u2_Sum >> 3u;
                }
            /*--------------------------------------------------------------------------*/
            /* LED点灯判定*/
            /*--------------------------------------------------------------------------*/ 
                if (Pot.u2_Ave > 2048u ){ PIN_MASTER_LED1 = 1u;}
                else { PIN_MASTER_LED1 = 0u;}
        }
}



これでR17のポテンションを回していくとの有る点でLED1が点灯/消灯すると思います。
PR

2020/01/13 dsPIC33C Comment(0)

COMMENT

COMMENT FORM

NAME
MAIL
WEB
TITLE
COMMENT
PASSWORD

プロフィール
 
HN:
ぴくお
性別:
非公開
 
 
カテゴリー
 
 
 
最新記事
 
(10/03)
(09/05)
(08/23)
(08/17)
(08/16)
 
 
RSS
 
 
 
リンク
 
 
 
免責事項
当サイトに掲載の回路図やプログラム等は動作する事を期待して掲載しておりますが、その動作の保証、性能の保証は致しません。 また掲載されているソフトウェアの使用により生じたいかなる損害に関しまして作者は一切責任を負いません。