アナログ デジタル レベルメータ

VOX(ボイスコントロール)- PWM( パルスワイズ モジュレーション ) 

もどる

基本概念
 光は情緒を醸し出す打楽器かも 」

目をとじ聴くもよしだが、耳をふさぐのは難しい。
しかし、光も瞼のうらにも感じられる。 光を音楽に加えることは レベルの監視とは少々意を異にする。
JAZZにはそれなり、クラッシクにもそれなりといった光の加わる隙間はある。
ふと、そう思ったのでスピーカーから出る音をとらえ 好みの脚色で リズムを取らせる
これもまた、音楽の味わい方かもしれませんね。
デジタルをアナログにねじ伏せてみました。

追加
2020/10/27
いろいろいじったけど、元に戻り単純なソフトになりました。
どう光らせるか、何を光らせる これは好みの問題なのでOUTPUT は5.1φのDCジャック
付けておいて LEDはいつでも交換できるようにしました。
たしか、電圧計測に1回10μ秒ほどかかり 変更するに5μ秒でおおよそ20μ秒程度の
反応速度と思われます(いい加減かも)反応速度は速いので電球など付けて鈍くしても
面白いかも FET5Vでも動くと思いますのでいろいろやってみます。

*
VRセットをFVR(内臓基準電圧に変更している途中)
* 2020/10/07 2020/10/08 oomuneOK
* オペアンプからの入力IMPを低くしなければ異常ノイズひどい
* 1kでグランドに落とした。
MPLAB X IDE v5.25
いい加減な書き方でわかりずらいけど 素人ようです。
*/

#include <xc.h>

#define _XTAL_FREQ 8000000 // delay用に必要(クロック8MHzを指定)

// コンフィギュレーション1の設定
#pragma config FOSC = INTOSC // 内部クロック使用する(INTOSC)
#pragma config WDTE = OFF // ウオッチドッグタイマー無し(OFF)
#pragma config PWRTE = ON // 電源ONから64ms後にプログラムを開始する(ON)
#pragma config MCLRE = OFF // 外部リセット信号は使用せずにデジタル入力(RA3)ピンとする(OFF)
#pragma config CP = OFF // プログラムメモリーを保護しない(OFF)
#pragma config CPD = OFF // データメモリーを保護しない(OFF)
#pragma config BOREN = ON // 電源電圧降下常時監視機能ON(ON)
#pragma config CLKOUTEN = OFF // CLKOUTピンをRA4ピンで使用する(OFF)
#pragma config IESO = OFF // 外部・内部クロックの切替えでの起動はなし(OFF)
#pragma config FCMEN = OFF // 外部クロック監視しない(OFF)

// コンフィギュレーション2の設定
#pragma config WRT = OFF // Flashメモリーを保護しない(OFF)
#pragma config PLLEN = OFF // 動作クロックを32MHzでは動作させない(OFF)
#pragma config STVREN = ON // スタックがオーバフローやアンダーフローしたらリセットをする(ON)
#pragma config BORV = HI // 電源電圧降下常時監視電圧(2.5V)設定(HI)
#pragma config LVP = OFF // 低電圧プログラミング機能使用しない(OFF)

// アナログ値の入力処理
unsigned int adconv()
{
unsigned int temp;

GO_nDONE = 1 ; // PICにアナログ値読取り開始を指示
while(GO_nDONE) ; // PICが読取り完了するまで待つ
temp = ADRESH ; // PICは読取った値をADRESHとADRESLのレジスターにセットする
temp = ( temp << 8 ) | ADRESL ; // 10ビットの分解能力です

return temp ;
}
// メインの処理
void main()
{
unsigned int num ;

OSCCON = 0b01110010 ; // 内部クロックは8MHzとする
ANSELA = 0b00010000 ; // アナログはAN3を使用し、残りをすべてデジタルI/Oに割当
TRISA = 0b00011000 ; // AN3(RA4)だけ入力その他のピンは出力に割当てる(RA3は入力専用)

ADCON1 = 0b10010011 ; // 読取値は右寄せ、A/D変換クロックはFOSC/8、FVR set
ADCON0 = 0b00001101 ; // アナログ変換情報設定(AN3から読込む)
__delay_us(5) ; // アナログ変換情報が設定されるまでとりあえず待つ (*1:20→5)

FVRCON = 0b11000001 ; //1.012 V set
CCP1SEL = 0 ; // 5番ピン(RA2)をCCP1ピンとして出力
CCP1CON = 0b00001100 ; // PWM機能(シングル)を使用する
T2CON = 0b00000010 ; // TMR2プリスケーラ値を16倍に設定
CCPR1L = 0 ; // デューティ値は0で初期化
CCPR1H = 0 ;
TMR2 = 0 ; // タイマー2カウンターを初期化
PR2 = 124 ; // 124で1Khz PWMの周期を設定(1000Hzで設定)
TMR2ON = 1 ; // TMR2(PWM)スタート
CCP1SEL = 0 ; //RA2に出力している
PORTA = 0b00000000 ; // 出力ピンの初期化(全てLOWにする)
int d=1; //ヂューティ比を決めるCCPR1Lの分母15で54%MAX
int c; //54%で感覚的には100%に見える。
while(1) {

num = adconv() ; // 電圧計測
if(num<20){num=0; // ノイズのレベルで消灯
CCPR1L = num ;//あまり小細工しないほうが結局自然で情緒が現れました。

end