製作モジュール一覧

2015年3月10日火曜日

ロリコンなのにBBA

こないだ仕入れたロータリーエンコーダーを使ってみたがうまく動かない


DATASHEET(http://www.marutsu.co.jp/contents/shop/marutsu/datasheet/atc0000cj15.pdf)を
見ると基板にマーキングしてある通り上がCOMと押し下げ時のSW

下がBBA(笑)

ArduinoやテスタでチェックしたがAとBが互い違いにスイッチングするはずなんだが
AもBも一緒に切り替わってしまう

押し下げのスイッチはうまくいく

そんな複雑な機構ではないはずなので

ロータリーエンコーダーをもう一個仕入れてAB位相のテストするしかないか

ロータリーエンコーダーのカチカチいう感触が好きなんだが中途半端にデジタルなので
もはやすたれ行く運命かもしれない

2015年3月9日月曜日

PSoC 4 Pioneer Kit 入力デバイスのテスト(ADCとDebouncer)

入力系のテストはまだやっていなかったのでテストしてみた

ADCのExampleは「ADC_SAR_Seq_DieTemp_PSoC4」だ

ADC SAR Seqコンポーネントを使うが、機能がいろいろある(まあまあ設定が複雑)ので
ADCを使う前にこのExampleはやっておいたほうがいいかな?

ADCのコンバート完了は割込みで通知されるので
ADC_SAR_SEQ_IRQ_StartEx()というマクロ関数で割込みハンドラを指定するが
ADC SAR SeqコンポーネントのDATASHEET(ADC_SAR_SEQ_P4_v2_0.pdf)の後ろの方に書いてあるので
Exampleをやっておかないとなかなか分かりずらい

ぴゅんぴゅん2号のコントローラーでテスト

Arduinoベースのぴゅんぴゅん2号用に作ったコントローラー(http://dad8893.blogspot.jp/2014/08/2.html)を使って
POTの読み取りをADCで、プッシュスイッチはDebuncerというチャタリングを除去するコンポーネントがあったのでこれも使ってテストした


PSoC CreatorのTopDesign


ADC SAR SeqコンポーネントのConfigure


ADCの入力をSingle ended(差動入力ではない普通の入力)にすると
「Single ended result format」がグレイアウトして出力値がSignedでしか出力できなくなった

ということは12bitのうち11bitしか使えないので0 - 2048までの値しかとれない

DATASHEET(ADC_SAR_SEQ_P4_v2_0.pdf)をざっと読んだ感じではunsignedで12bitフルには使えなさそうだ

ADCのChannelの個別の設定はChannelsタブで設定


読み取り値はUARTで出力してPCのTeratermで受信した


まあまあきっちり動いてくれているようだ

<main.c>
 /* ========================================  
  *  
  * Copyright YOUR COMPANY, THE YEAR  
  * All Rights Reserved  
  * UNPUBLISHED, LICENSED SOFTWARE.  
  *  
  * CONFIDENTIAL AND PROPRIETARY INFORMATION  
  * WHICH IS THE PROPERTY OF your company.  
  *  
  * ========================================  
 */  
 #include <project.h>  
 #include <stdio.h>  
 #define CH0_N        (0x00u)  
 #define CH1_N        (0x01u)  
 #define CH2_N        (0x02u)  
 volatile uint32 dataReady = 0u;  
 volatile int16 result[ADC_SAR_SEQ_TOTAL_CHANNELS_NUM];  
 volatile int switchCount1 = 0;  
 volatile int switchCount2 = 0;  
 /******************************************************************************  
 * Function Name: ADC_SAR_SEQ_ISR_LOC  
 *******************************************************************************  
 *  
 * Summary:  
 * Handle Interrupt Service Routine. Source - ADC SAR Seq.  
 *  
 ******************************************************************************/  
 CY_ISR(ADC_SAR_SEQ_ISR_LOC)  
 {  
   uint32 intr_status;  
   uint32 range_status;  
   /* Read interrupt status registers */  
   intr_status = ADC_SAR_SEQ_SAR_INTR_MASKED_REG;  
   /* Check for End of Scan interrupt */  
   if((intr_status & ADC_SAR_SEQ_EOS_MASK) != 0u)  
   {  
     /* Read range detect status */  
     range_status = ADC_SAR_SEQ_SAR_RANGE_INTR_MASKED_REG;  
     /* Verify that the conversion result met the condition Low_Limit <= Result < High_Limit */  
     if((range_status & (uint32)(1ul << CH0_N)) != 0u)   
     {  
       result[CH0_N] = ADC_SAR_SEQ_GetResult16(CH0_N);  
     }    
     if((range_status & (uint32)(1ul << CH1_N)) != 0u)   
     {  
       result[CH1_N] = ADC_SAR_SEQ_GetResult16(CH1_N);  
     }    
     if((range_status & (uint32)(1ul << CH2_N)) != 0u)   
     {  
       result[CH2_N] = ADC_SAR_SEQ_GetResult16(CH2_N);  
     }    
     /* Clear range detect status */  
     ADC_SAR_SEQ_SAR_RANGE_INTR_REG = range_status;  
     dataReady |= ADC_SAR_SEQ_EOS_MASK;  
   }    
   /* Clear handled interrupt */  
   ADC_SAR_SEQ_SAR_INTR_REG = intr_status;  
 }  
 CY_ISR(SW_1_ISR)  
 {  
   switchCount1++;  
 }  
 CY_ISR(SW_2_ISR)  
 {  
   switchCount2++;  
 }  
 int main()  
 {  
   char uartLine[250];  
   /* Initialize the UART */  
   UART_Start();  
   UART_PutCRLF();  
   UART_PutCRLF();  
   UART_PutString("Starting Controller measurement...");  
   UART_PutCRLF();  
   /* Init and start sequencing SAR ADC */  
   ADC_SAR_SEQ_Start();  
   ADC_SAR_SEQ_StartConvert();  
   /* Enable interrupt and set interrupt handler to local routine */  
   ADC_SAR_SEQ_IRQ_StartEx(ADC_SAR_SEQ_ISR_LOC);  
   SW_1_Int_StartEx(SW_1_ISR);  
   SW_2_Int_StartEx(SW_2_ISR);  
   CyGlobalIntEnable;  
   for(;;)  
   {  
     /* When conversion of sequencing channels has completed */  
     if((dataReady & ADC_SAR_SEQ_EOS_MASK) != 0u)  
     {  
       /* Get voltage, measured by ADC */  
       dataReady &= ~ADC_SAR_SEQ_EOS_MASK;  
       //res = ADC_SAR_SEQ_CountsTo_mVolts(CH0_N, result[CH0_N]);  
       /* Print voltage value to UART */  
       sprintf(  
         uartLine, "ADC: %4d %4d %4d SW: %d %d",  
         result[CH0_N], result[CH1_N], result[CH2_N], switchCount1, switchCount2  
         );  
       UART_PutString(uartLine);  
       UART_PutCRLF();  
       //CyDelay(100);  
     }    
   }  
 }  
 /* [] END OF FILE */  

一瞬はまったのでメモ

PSoC 4 Pionner KitでUARTを使ってPCとシリアル通信させるときは
UART:TXとして指定したPINとJ8 pin 9 (PSoC 5LP P12[6])を
ジャンプワイヤで物理的に接続しないと動かない

2015年3月7日土曜日

3次VCVS Low Pass Filter

「回路の素101」 を眺めていたら3次VCVSローパスフィルタは、2次の前段にCRを追加するだけで済むようだ

R1とC1を追加

カットオフ周波数は
fc = 1 / 2 * π * 3√(C1 * C2 * C3 * R1 * R2 * R3)
で求まるが、フィルターの特性はそれぞれの値の配分で変わってくる。

できるだけ急峻なフィルターが欲しいので、OKAWA Electric Designさんのフィルター計算ツール
(http://sim.okawa-denshi.jp/Sallenkey3Lowkeisan.htm)でチェビシェフ特性で計算した
特性周波数 fc = 5,000Hz
ゲイン・リップル gr = 3dB 
R1 = 11kΩ
R2 = 110kΩ
R3 = 33kΩ
C1 = 0.01uF
C2 = 0.0047uF
C3 = 68pF
ここから、自分の手持ちのパーツでできるだけ近い値のものを選んでもう一度計算してみた
R1 = 10kΩ
R2 = 100kΩ
R3 = 33kΩ
C1 = 0.01uF
C2 = 3900pF
C3 = 100pF
ボード線図


ナイキスト軌跡


過渡解析

等価ブロック線図における遮断周波数(カットオフ周波数)
  fc1 = 1596.20902951[Hz]
  fc2 = 4429.92162224[Hz]
去年制御工学の本を読んだのにナイキストの安定判別法とかもうすっかり忘れてしまった(^q^;
「MATLAB Simulinkによる わかりやすい制御工学」(http://dad8893.blogspot.jp/2014/08/matlab-simulink.html)
過渡解析がそんなに暴れていないので、まあ安定してるんだろう(^q^;

Arduino互換のピンの配列も修正しつつ、ぴゅんぴゅん3号の回路図を書き直した


とりあえず、3次VCVSローパスフィルタの部分だけブレッドボードで実験してみた



WeveSpectra + WaveGeneで周波数特性を計測

オーディオインターフェイスの入力はGuitarモード(1MΩ)でダミーの負荷はつないでいない


350Hzあたりでグラフが折れ曲がってしまった(^q^;
シミュレーションと1桁違うなあ

WaveGeneでサイン波を生成してオシロで入出力を見てみた

1kHz


2kHz


5kHz

↑この辺で位相が90度以上遅れているようだ

10kHz


20kHz


サンプル数が少ないが、Excelで手作業でグラフ化してみた


4,500Hzあたりで-5dBぐらいかな?

まあ、だいたいでいいか(^q^;;;

1kHzの矩形波


オーバーシュートが出てるが(元がチェビシェフ特性なのでしかたない)
無事サイン波の方向になまってくれている(^q^/

PSoCから波形を出力

PSoCのIDACから1kHzのガタガタのサイン波を出力して
3次VCVSローパスフィルタを通してみた


きれいにはなっているが細かいことはわからない

WaveSpectraでFFT

3次VCVS LPF


2次VCVS LPF(以前とったもの)


高次の高調波歪はかなり減っているが、2次~5次あたりは逆に増えているようだ

思い付きでC2を1000pFに変更してみた


1kHzのサイン波だとかなり高調波歪が減ったが、実際音出ししてみないとなんとも言えない。

またCRを差し替えられるようにしてユニバーサル基板で組んでみて、音出ししながら決めようと思います