こないだ仕入れたロータリーエンコーダーを使ってみたがうまく動かない
DATASHEET(http://www.marutsu.co.jp/contents/shop/marutsu/datasheet/atc0000cj15.pdf)を
見ると基板にマーキングしてある通り上がCOMと押し下げ時のSW
下がBBA(笑)
ArduinoやテスタでチェックしたがAとBが互い違いにスイッチングするはずなんだが
AもBも一緒に切り替わってしまう
押し下げのスイッチはうまくいく
そんな複雑な機構ではないはずなので
ロータリーエンコーダーをもう一個仕入れてAB位相のテストするしかないか
ロータリーエンコーダーのカチカチいう感触が好きなんだが中途半端にデジタルなので
もはやすたれ行く運命かもしれない
2015年3月10日火曜日
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>
一瞬はまったのでメモ
PSoC 4 Pionner KitでUARTを使ってPCとシリアル通信させるときは
UART:TXとして指定したPINとJ8 pin 9 (PSoC 5LP P12[6])を
ジャンプワイヤで物理的に接続しないと動かない
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を追加するだけで済むようだ
カットオフ周波数は
できるだけ急峻なフィルターが欲しいので、OKAWA Electric Designさんのフィルター計算ツール
(http://sim.okawa-denshi.jp/Sallenkey3Lowkeisan.htm)でチェビシェフ特性で計算した
ナイキスト軌跡
過渡解析
等価ブロック線図における遮断周波数(カットオフ周波数)
Arduino互換のピンの配列も修正しつつ、ぴゅんぴゅん3号の回路図を書き直した
とりあえず、3次VCVSローパスフィルタの部分だけブレッドボードで実験してみた
WeveSpectra + WaveGeneで周波数特性を計測
オーディオインターフェイスの入力はGuitarモード(1MΩ)でダミーの負荷はつないでいない
350Hzあたりでグラフが折れ曲がってしまった(^q^;
シミュレーションと1桁違うなあ
WaveGeneでサイン波を生成してオシロで入出力を見てみた
1kHz
2kHz
5kHz
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を差し替えられるようにしてユニバーサル基板で組んでみて、音出ししながら決めようと思います
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]去年制御工学の本を読んだのにナイキストの安定判別法とかもうすっかり忘れてしまった(^q^;
fc2 = 4429.92162224[Hz]
「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を差し替えられるようにしてユニバーサル基板で組んでみて、音出ししながら決めようと思います
登録:
投稿 (Atom)






















.png)

.png)